¿Existe un lenguaje que se transpila a C, con mejor sintaxis? [cerrado]


19

CoffeeScript es un lenguaje que se transpira a JavaScript, con una sintaxis limpia, inspirada en Ruby. ¿Existe un lenguaje similar que se transpira a C, permitiendo un código más legible sin comprometer el rendimiento? Si nada de eso existe, ¿hay una buena razón para no crearlo?


10
Sin embargo, tenga en cuenta que "compila en C" no es sinónimo de "tan rápido como los programas C originales". Cuando algo se compila en C, a menudo generará un código bastante diferente (o completamente) de lo que cualquier persona normal escribiría en C. Puede ser considerablemente más lento (o incluso más rápido) de lo que normalmente escribiría a mano.
Jerry Coffin

44
Lo que no me gusta de ninguna de estas respuestas es que proponen idiomas totalmente diferentes, como Vala. Lo que pasa con CoffeeScript es que ES Javascript, pero con una sintaxis diferente.
Prof. Falken apoya a Monica


55
Realmente deseo "transcompilar" (la palabra) simplemente moriría. Es "compilar" y "compilador". No necesita una palabra nueva solo porque el lenguaje de salida no es x86 (y si cree que sí, no comprende los compiladores).
Leushenko

2
La palabra transpilar significa (o ha llegado a significar últimamente) traducir el código al código fuente de otro idioma con la misma semántica , típicamente declaración para una declaración equivalente (permitiendo que también se cree un mapa fuente). Nadie afirma que los transpiladores hagan algo diferente a los compiladores. Los transpiladores son un tipo específico de compilador.
Carl Smith

Respuestas:


23

CoffeeScript compila a JavaScript por una razón muy simple, JavaScript es el lenguaje del lado del cliente de facto y no sería razonable esperar que los proveedores de navegadores admitan nativamente CoffeeScript, cuando todo lo que ofrece es una sintaxis alternativa.

De manera muy similar, el punto principal del lenguaje de alto nivel para los traductores de C es la portabilidad inmediata, ya que hay un compilador de C para casi todas las plataformas y una gran cantidad de bibliotecas de C. Vala , por ejemplo, fue diseñado para :

  1. ser un compilador para el GObject ,
  2. construir ejecutables nativos (a través del compilador C de la máquina),
  3. automatizar el recuento de referencias, y
  4. aún estará accesible para los programadores de GNOME C

GNOME es un proyecto tradicionalmente orientado a C y GObject específicamente está escrito en C, Vala probablemente no encontraría mucho amor entre los desarrolladores de GNOME si se compilara en código máquina, independientemente de su naturaleza más amigable (y sintaxis). No a todos parecía gustarles la sintaxis, hasta el punto de que otro idioma, Genie , fue creado para mejorarlo.

Para un ejemplo de C ++, Facebook desarrolló HipHop , un traductor de PHP a C ++. Intentaban resolver un problema muy específico, el uso de la CPU, sin tener que reemplazar todo su código PHP y volver a capacitar a sus ingenieros (o peor aún, reemplazarlos). Este es un ejemplo mucho más específico, ya que los problemas de escalabilidad de Facebook son, bueno, únicos, y nuevamente tener acceso al código intermedio de C ++ puede ser útil, ya que las extensiones de PHP están escritas en C y C ++.

Por lo tanto, un traductor de un idioma de alto nivel a otro es una buena idea principalmente cuando se requiere acceso al código intermedio. Para CoffeeScript, el código JavaScript es necesario debido a su amplia adopción del navegador, y para Vala, Genie y HipHop debido a la base de código existente. Obviamente, tener acceso al código intermedio significa que puede optimizarlo aún más si es necesario.

Pero, en términos generales, no sería una buena idea construir un lenguaje que se traduzca a C, o cualquier otro lenguaje, si no utilizara el código resultante. Hay tantos lenguajes por ahí, que si no puede hacer frente a C, simplemente elija otro. Casualmente, el primer compilador de C ++ escrito por Bjarne Stroustrup, CFront, fue un traductor de C con Classes to C, pero eso se debió principalmente a que, como nuevo lenguaje, era imposible arrancar C con Classes.


3
También está Nim.
noɥʇʎԀʎzɐɹƆ

Swift puede compilar a C también.
Quazi Irfan

9

Voy a cubrir algunos puntos que Yannis Rizos no hizo en su gran respuesta.

Sí, existen muchos idiomas. C es un objetivo común para los back-end del compilador, ya que es increíblemente portátil y altamente optimizado, aunque con LLVM no tiene mucho sentido.

Algunas implementaciones que sé que hacen esto son:

  • C ++ (al menos en los primeros días)
  • GHC Haskell (Aunque el generador de código principal es C--)
  • Gambito / Pollo / Esquema Bigloo
  • ECL (Common Lisp)
  • Perl
  • Vala y Genio

tan rápido como los programas C originales

No, solo porque usa C como lenguaje intermedio no significa que alcanzarás su velocidad. La razón por la que C es rápido es por el método de escribir el código que obviamente es diferente para otros lenguajes. Es solo un ensamblaje portátil, nada especial.


1
C está muy lejos de la asamblea ...
Sarge Borsch

1
Algunas personas piensan en C como "ensamblador de alto nivel". Está bastante cerca de la máquina, pero por supuesto no es un montón de códigos de operación.
dstromberg

6

Rock es un compilador ooc que genera la fuente C99. El ooc-lang es un lenguaje de programación con objetos, funciones de primera clase y unicornios rosados. El ooc es un lenguaje dinámico y camina muy lejos. Genera códigos c más gordos y lentos. Necesita modificar más para satisfacer sus necesidades. Pero es un buen punto de partida.


4

Vala y Genie son lenguajes que compilan en C. haxe compila en C ++, pero no estoy seguro de que eso sea lo que quieres.


2
¿Le importaría ampliar un poco lo que tiene cada uno de estos recursos y por qué los recomienda como respuesta a la pregunta que se hace? Las "respuestas de solo enlace" no son bienvenidas en Stack Exchange
mosquito

4

OCaml puede compilar a código de bytes, a código nativo, puede ser interpretado directamente, o se puede compilar a C .


1
¿Le importaría explicar más sobre lo que hace y por qué lo recomienda como respuesta a la pregunta que se hace? Las "respuestas de solo enlace" no son bienvenidas en Stack Exchange
mosquito

3
No veo cómo mi respuesta es una "respuesta de solo enlace". En realidad, podría eliminar el enlace y seguiría siendo una respuesta válida. La pregunta es "¿Hay un lenguaje que hace X" y mi respuesta es "el lenguaje Y hace X". Este comentario también se aplica a la respuesta de Bilijk.
barjak

3
  • El compilador de C ++ original de Bjarne Stroustrop, "cfront", compiló C ++ a C, que luego opcionalmente ejecutaría el compilador de C para producir código objeto. C ++ es tan "no teórico" como puedes obtener :-)
  • Los compiladores-compiladores Unix "yacc" y GNU "Bison" traducen sus lenguajes de entrada a C. Muchos, muchos sistemas sofisticados se han escrito con ellos.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.