C--

Summary

C-- (pronunciado "C menos menos") es un lenguaje de programación de bajo nivel intermedio, con sintaxis similar a C, diseñado principalmente para ser generado por compiladores de lenguajes de alto nivel en lugar de ser escrito directamente por programadores humanos. Fue desarrollado en la década de 1990 por los investigadores en programación funcional Simon Peyton Jones y Norman Ramsey. A diferencia de muchos otros lenguajes intermedios, C-- se representa en texto ASCII plano, no en bytecode ni en otro formato binario.

C--
Simon Peyton Jones y Norman Ramsey
http://www.cminusminus.org/ y http://www.cs.tufts.edu/~nr/c--
Información general
Extensiones comunes c--
Apareció en 1997
Diseñado por Simon Peyton Jones y Norman Ramsey
Influido por C

Existen dos variantes principales:

  • C--, la versión original, cuya especificación 2.0 se publicó en mayo de 2005.
  • Cmm, un dialecto activo que sirve como representación intermedia (IR) en el GHC.

Diseño y características

editar

C-- se define como un «lenguaje ensamblador portátil» diseñado para facilitar la generación de código máquina optimizado y la implementación de compiladores de alto nivel.[1]

Su sintaxis se basa en C, pero omite o modifica características que complican la generación de código, como las funciones variádicas y la semántica de punteros de C. Además, C-- introduce:

  • Palabras clave para llamadas de cola explícitas («jump»).
  • Retorno de múltiples valores en procedimientos.
  • Un modelo de tiempo de ejecución que facilita recolectores de basura portátiles y gestión de excepciones.

El nombre «C--» juega con la convención de C++ (incremento) y C-- (decremento), indicando que es una versión reducida de C.[2]

Sistema de tipos

editar

El sistema de tipos de C-- refleja las restricciones del hardware:

  • Los valores se representan como vectores de bits (bit-vectors) de anchos definidos (por ejemplo, 8, 16, 32, 64 bits).
  • Se admite una familia separada de tipos de coma flotante (32 y 64 bits).
  • Tipo booleano para control de flujo (no almacenable en memoria como tal).

No hay comprobación de tipos en tiempo de compilación ni convenciones de llamada estrictas; dichas disciplinas se aplican mediante operadores y convenciones externas. En la versión 2.0, se introdujeron anotaciones de "kind" para diferenciar enteros, flotantes, punteros y tipos nativos.[3]

Ejemplo de código

editar

El siguiente ejemplo muestra una recursión terminal que calcula la suma y el producto de los números de 1 a n:

/* Recursión terminal: suma y producto de 1 a n */
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

editar

Las implementaciones más destacadas incluyen:

  • Quick C--, la referencia principal hasta su abandono en 2013; compilaba C-- 2.0 a código máquina x86 en Linux.
  • Cmmc, un compilador en ML que genera código para Alpha, SPARC y x86.
  • Trampoline C-- Compiler, transpilador a C de Sergei Egorov (1999).
  • OGI C-- Compiler, primer prototipo de 1997 en ML.

Véase también

editar

Referencias

editar
  1. Oliva, Dino; Nordin, Thomas (1 de enero de 1997). «C-: A Portable Assembly Language». Proceedings of the 1997 Workshop on Implementing Functional Languages (en inglés estadounidense). 
  2. «Increment And Decrement Operators In C With Precedence». Consultado el 20 de junio de 2024. 
  3. Ramsey, Norman (23 de febrero de 2005), The C-- Language Specification, version 2.0 (CVS Revision 1.128), p. 7 .

Enlaces externos

editar
  • Archivo del antiguo sitio oficial
  • Quick C-- en GitHub
  •   Datos: Q81348