C--


C-- (pronunciado C menos menos ) es un lenguaje de programación similar a C. Sus creadores, los investigadores de programación funcional Simon Peyton Jones y Norman Ramsey, lo diseñaron para ser generado principalmente por compiladores para lenguajes de muy alto nivel en lugar de ser escrito por programadores humanos. A diferencia de muchos otros lenguajes intermedios, su representación es texto ASCII sin formato, no código de bytes u otro formato binario . [1] [2]

C-- es un " lenguaje ensamblador portátil", diseñado para facilitar la implementación de compiladores que producen código de máquina de alta calidad . Esto se hace delegando la generación de código de bajo nivel y la optimización del programa a un compilador C--. La sintaxis del lenguaje se basa en gran medida en C, mientras que omite o cambia las características estándar de C, como funciones variádicas , sintaxis de punteros y aspectos del sistema de tipos de C, porque obstaculizan las características esenciales de C y la facilidad de generación de código.

El nombre del lenguaje es una broma interna que indica que C-- es una forma reducida de C, de la misma manera que C++ es básicamente una forma expandida de C. ( --y ++significa "decremento" e "incremento", respectivamente. )

El trabajo en C-- comenzó a fines de la década de 1990. Dado que escribir un generador de código personalizado es un desafío en sí mismo, y los backends del compilador disponibles para los investigadores en ese momento eran complejos y estaban mal documentados, varios proyectos habían escrito compiladores que generaban código C (por ejemplo, el compilador Modula-3 original ). Sin embargo, C es una mala elección para los lenguajes funcionales: no garantiza la optimización de la cola de llamada , ni admite una recolección de basura precisa o un manejo eficiente de excepciones.. C-- es una alternativa más simple y estrictamente definida a C que admite todos estos. Su característica más innovadora es una interfaz de tiempo de ejecución que permite escribir recolectores de basura portátiles, sistemas de manejo de excepciones y otras características de tiempo de ejecución que funcionan con cualquier compilador C-.

La primera versión de C-- se publicó en abril de 1998 como artículo de la MSRA, [1] acompañada de un artículo de enero de 1999 sobre recolección de basura. [2] Se publicó un manual revisado en formato HTML en mayo de 1999. [6] Dos conjuntos de cambios importantes propuestos en 2000 por Norman Ramsey ("Cambios propuestos") y Christian Lindig ("Una nueva gramática") llevaron a C-- versión 2, que se finalizó alrededor de 2004 y se lanzó oficialmente en 2005. [3]

El sistema de tipo C está diseñado para reflejar las restricciones impuestas por el hardware en lugar de las convenciones impuestas por los lenguajes de nivel superior. Un valor almacenado en un registro o memoria puede tener un solo tipo: bit-vector . Sin embargo, bit-vector es un tipo polimórfico que viene en varios anchos, por ejemplo , bits8 , bits32 o bits64 . Se admite una familia separada de tipos de punto flotante de 32 o 64 bits. Además del tipo de vector de bits, C-- proporciona un tipo booleano bool, que puede calcularse mediante expresiones y usarse para controlar el flujo, pero no puede almacenarse en un registro o memoria. Como en un lenguaje ensamblador, los operadores C-- u otras construcciones sintácticas imponen cualquier disciplina de tipo superior, como las distinciones entre firmado, sin firmar, flotante y puntero. C-- no tiene verificación de tipo, ni impone ni verifica la convención de llamadas. [3] : 28