C-- (escrito convencionalmente con guiones, pero pronunciado C menos menos ) es un lenguaje de programación similar a C , diseñado para ser generado principalmente por compiladores de lenguajes de alto nivel en lugar de ser escrito por programadores humanos. Fue creado por los investigadores de programación funcional Simon Peyton Jones y Norman Ramsey. A diferencia de muchos otros lenguajes intermedios, se representa en texto ASCII plano, no en bytecode ni en otro formato binario . [ 1 ] [ 2 ]
Existen dos ramas principales:
- C--, la rama original, con la versión final 2.0 publicada en mayo de 2005 [ 3 ]
- Cmm, la bifurcación utilizada activamente como representación intermedia (IR) en el compilador Glasgow Haskell (GHC) [ 4 ] [ 5 ]
Diseño
C-- es un " lenguaje ensamblador portátil " [ 6 ] diseñado para facilitar la implementación de compiladores que producen código máquina de alta calidad [ 7 ] . Esto se logra delegando la generación de código de bajo nivel y la optimización del programa a un compilador de C--. La sintaxis del lenguaje toma prestadas muchas características de C, pero omite o modifica características estándar de C, como las funciones variádicas , la sintaxis de punteros y aspectos del sistema de tipos de C, ya que se considera que obstaculizan 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-- pretende ser una forma reducida de C, de la misma manera que " C++ " se eligió para connotar una versión mejorada de C. (En C, --y ++significan "decremento" e "incremento", respectivamente). [ 8 ]
El desarrollo de C-- comenzó a finales 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 de compilación 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 original Modula-3 ). Sin embargo, C tiene varias desventajas para los lenguajes funcionales: no garantiza la optimización de llamadas recursivas , ni admite una recolección de basura precisa ni un manejo eficiente de excepciones . C-- se concibió como una alternativa supuestamente más simple y bien definida a C que admite todas estas características. 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 de C--.
La primera versión de C-- se publicó en abril de 1998 como un documento de MSRA, [ 1 ] acompañada de un documento de enero de 1999 sobre recolección de basura. [ 2 ] Un manual revisado se publicó en formato HTML en mayo de 1999. [ 9 ] Dos conjuntos de cambios importantes propuestos en 2000 por Norman Ramsey ("Cambios propuestos") y Christian Lindig ("Una nueva gramática") dieron lugar a la versión 2 de C--, que se finalizó alrededor de 2004 y se publicó oficialmente en 2005. [ 3 ]
Sistema de tipos
El sistema de tipos C-- está diseñado para reflejar las restricciones impuestas por el hardware en lugar de las convenciones impuestas por los lenguajes de alto nivel. Un valor almacenado en un registro o memoria solo puede tener un tipo: vector de bits . Sin embargo, vector de bits es un tipo polimórfico que se presenta 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 vector de bits, C-- proporciona un tipo booleano bool , que se puede calcular mediante expresiones y utilizar para el flujo de control, pero no se puede almacenar en un registro o memoria. Al igual que en un lenguaje ensamblador, cualquier disciplina de tipos de nivel superior, como las distinciones entre con signo, sin signo, de punto flotante y puntero, es impuesta por los operadores de C-- u otras construcciones sintácticas. C-- no realiza comprobación de tipos, ni impone ni verifica la convención de llamada. [ 3 ] : 28
C-- versión 2 elimina la distinción entre tipos de vector de bits y de punto flotante. Estos tipos se pueden anotar con una etiqueta de cadena "kind" para distinguir, entre otras cosas, el tipo entero o flotante de una variable y su comportamiento de almacenamiento (global o local). Lo primero es útil en plataformas que tienen registros separados para valores enteros y de punto flotante. Se introdujeron tipos especiales para punteros y la palabra nativa, aunque se asignan a un vector de bits con una longitud que depende de la plataforma. [ 3 ] : 10
Código de ejemplo
El siguiente código C-- calcula la suma y el producto de los enteros del 1 al n [ 10 ] ( n se recibe como argumento). Demuestra dos características del lenguaje:
- Los procedimientos pueden devolver múltiples resultados.
- La recursión de cola se solicita explícitamente con la palabra clave "jump".
/* Recursión de cola */ export sp ; sp ( bits32 n ) { jump sp_help ( n , 1 , 1 ); }sp_help ( bits32 n , bits32 s , bits32 p ) { if n == 1 { return ( s , p ); } else { jump sp_help ( n - 1 , s + n , p * n ); } }Implementaciones
La página de especificaciones de C-- enumera algunas implementaciones de C--. El compilador "más activamente desarrollado", Quick C--, fue abandonado en 2013. [ 11 ]
Haskell
Algunos desarrolladores de C--, entre ellos Simon Peyton Jones, João Dias y Norman Ramsey, trabajan o han trabajado en GHC, cuyo desarrollo ha dado lugar a extensiones en el lenguaje C--, formando el dialecto Cmm que utiliza el preprocesador de C para mejorar la ergonomía. [ 4 ] [ 12 ]
Los backends de GHC son responsables de transformar aún más C-- en código ejecutable, a través de LLVM IR, C lento o directamente a través del backend nativo integrado. [ 13 ] [ 14 ] [ 15 ] A pesar de la intención original, GHC realiza muchas de sus optimizaciones genéricas en C--. Al igual que con otros IR de compilador, la representación de C-- se puede volcar para depuración. [ 16 ] Las optimizaciones específicas del destino son realizadas posteriormente por el backend.
Sistemas de procesamiento
A fecha de 2018, la mayoría de los sistemas de procesamiento no reciben mantenimiento ni se publica su código fuente.
- Quick C-- es un compilador desarrollado por el equipo de Quick C--. Compila la versión 2 del código C-- a código máquina para Linux Intel x86. La compilación a código máquina para otras plataformas está disponible como función experimental. Anteriormente, Quick C-- se desarrollaba en paralelo con la evolución de la especificación del lenguaje C--, pero el proyecto se archivó en 2019 en GitHub y el desarrollo se ha detenido, aunque el código fuente sigue disponible allí.
- cmmc es un compilador de C-- implementado en el lenguaje de programación ML por Fermin Reig. Genera código máquina para las arquitecturas Alpha, Sparc y x86. [ 17 ]
- Trampoline C-- Compiler es un transpilador de C-- a C desarrollado por Sergei Egorov en mayo de 1999. Traduce código C-- a código C, lo que permite compilarlo utilizando compiladores C estándar.
- El compilador C-- del Instituto de Posgrado de Oregón (OGI C-- Compiler) es el primer prototipo de compilador C--, desarrollado en 1997 utilizando el lenguaje de programación ML. El mantenimiento del OGI C-- Compiler se interrumpió una vez que comenzó el desarrollo de Quick C--.
Véase también
Referencias
- 1 2 Nordin, Thomas; Jones, Simon Peyton; Iglesias, Pablo Nogueira; Oliva, Dino (1998-04-23). "The C– Language Reference Manual" . Microsoft .
- 1 2 Reig, Fermin; Ramsey, Norman; Jones, Simon Peyton (1999-01-01). "C–: un lenguaje ensamblador portátil que admite recolección de basura" . Microsoft : 1–28 .
- 1 2 3 4 Ramsey, Norman; Jones, Simon Peyton. "Especificación del lenguaje C--, versión 2.0" (PDF) . Consultado el 11 de diciembre de 2019 .
- 1 2 Comentario de GHC: ¿Qué demonios es un archivo .cmm?
- ↑ "Un backend LLVM mejorado" . Abril de 2019.
- ↑ Oliva, Dino; Nordin, T.; Peyton Jones, Simon (1997-01-01). "C-: Un lenguaje ensamblador portátil" . Actas del Taller de 1997 sobre la implementación de lenguajes funcionales – vía Microsoft.
- ↑ Jones, Simon Peyton; Nordin, Thomas; Oliva, Dino (1998). "C--: Un lenguaje ensamblador portátil" . En Clack, Chris; Hammond, Kevin; Davie, Tony (eds.). Implementación de lenguajes funcionales . Lecture Notes in Computer Science. Vol. 1467. Berlín, Heidelberg: Springer. pp. 1–19 . doi : 10.1007/BFb0055421 . ISBN 978-3-540-68528-9.
- ↑ "Operadores de incremento y decremento en C con precedencia" . unstop.com . Consultado el 20 de junio de 2024 .
- ↑ Nordin, Thomas; Jones, Simon Peyton; Iglesias, Pablo Nogueira; Oliva, Dino (1999-05-23). "The C– Language Reference Manual" .
- ↑ Ramsey, Norman; Jones, Simon Peyton; Lindig, Christian (23 de febrero de 2005), Especificación del lenguaje C--, versión 2.0 (Revisión CVS 1.128) (PDF) , pág. 7 , consultado el 22 de junio de 2023
- ↑ "C-- Descargas" . www.cs.tufts.edu . Consultado el 11 de diciembre de 2019 .
- ↑ "5.10. Backends de GHC — Guía del usuario del compilador Glasgow Haskell 9.8.1" . downloads.haskell.org . Consultado el 20 de junio de 2024 .
- ↑ Backends de GHC
- ↑ "Artículo de opinión sobre los backends de GHC" . andreaspk.github.io . 25 de agosto de 2019. Consultado el 20 de junio de 2024 .
- ↑ "Uso del compilador Glasgow Haskell (GHC)" . ProgDoer . Consultado el 20 de junio de 2024 .
- ↑ Depuración de compiladores con optimización de combustible
- ↑ "C-- Descargas" . www.cs.tufts.edu . Consultado el 20 de junio de 2024 .
Enlaces externos
- Archivo del antiguo sitio web oficial (cminusminus.org)
- Archivo de código C rápido (la implementación de referencia)
- Familia de lenguajes de programación C
- Compiladores