2010-04-29 22 views
5

¿Hay compiladores en diferentes idiomas?¿Cuál es el lenguaje de los compiladores? Están escritos con diferentes idiomas?

+2

No siempre: http://en.wikipedia.org/wiki/Bootstrapping_(compilers) – jball

+0

posible duplicado de http://stackoverflow.com/questions/193560/implementing-a-compiler-in-itself –

+0

posible duplicado de [Cuando alguien escribe un nuevo lenguaje de programación, ¿en qué lo escriben?] (http://stackoverflow.com/questions/1629513/when-someone-writes-a-new-programming-language-what-do-they -write-it-in) – nawfal

Respuesta

10

A compiler probablemente podría estar escrito en cualquier idioma. En su forma más básica, un compilador simplemente convierte el código de un idioma a otro. En el sentido de que la mayoría de las personas usa el término "compilador" hoy, se refieren a algo que toma el código fuente de algún lenguaje de nivel superior y lo convierte en ensamblado o en un lenguaje intermedio de bajo nivel (CIL).

3

Los compiladores a menudo se escriben en el lenguaje de dicho compilador. Por ejemplo, un compilador de C normalmente se escribe en C.

... lo que hace surgir la pregunta "¿cómo se compila la primera vez?". A lo que he escuchado dos respuestas: o bien está compilada a mano (por miedo que suene), o una trampa y utiliza un compilador existente para ese idioma.

Como @jball ha comentado, lea el artículo de Wikipedia en Bootstrapping para obtener detalles completos.

2

¿Cuál es el idioma de cualquier cosa? gcc, por ejemplo, está escrito en C.
Hubo una vez una historia sobre un intérprete Lisp que se escribió en Lisp.

Esto plantea la siguiente pregunta: si el compilador de C está escrito en C, ¿qué compiló el primer compilador de C? Para esto, read here.

4

A veces sí, a veces no. Es costumbre intentar implementar el compilador de un nuevo idioma en ese idioma lo antes posible, en parte para demostrar que puede hacer un "trabajo pesado".

Pero, por supuesto, primero necesita un compilador o al menos un intérprete para ejecutar ese compilador y compilarlo, por lo que primero debe implementarlo en otro idioma.

Y para muchos idiomas especializados, escribir el compilador en el idioma en sí no es práctico porque el lenguaje no es para cosas como compiladores.

15

Aquí hay un par de ejemplos:

  • el compilador Rubinius Rubí está escrito en Ruby,
  • el compilador YARV Rubí está escrito en C,
  • el compilador XRuby Rubí está escrito en Java,
  • el compilador Ruby.NET Rubí está escrito en C#,
  • el compilador MacRuby Rubí está escrito en Objective-C,
  • la IronJS ECMA Guión compilador está escrito en C#,
  • la MS Visual C# compilador está escrito en C#,
  • la MS Visual C# compilador está escrito en C++, que está siendo reescrito en C#,
  • el Visual Basic.NET compilador MS es escrito en C++, actualmente está reescrito en Visual Basic.NET,
  • el compilador GCC C está escrito en C,
  • el compilador Clang C está escrito en C++,
  • compiladores más Pascal están escritos en Pascal,
  • mayoría de los compiladores Oberon se escriben en Oberon,
  • tanto el 6 g/8g y el gccgo Ir compiladores están escritos en C

en general, los compiladores se pueden escribir en cualquier lenguaje que en realidad es lo suficientemente potente como para escribir un compilador. Esto O Bviously incluye cualquier lenguaje completo de Turing. Pero incluso podría ser posible escribir un compilador en un lenguaje que no sea de Turing completo. (Por ejemplo, no veo ninguna razón obvia por la cual un compilador no podría ser una función total, pero las funciones totales obviamente no son completas).

En la práctica, sin embargo, los compiladores están escritos en su mayoría en tres clases de idiomas con diferentes pros y contras:

  1. el mismo idioma que implementa el compilador (pros: más grande de la comunidad, porque todo el mundo que conoce el lenguaje puede trabajar en el compilador, de lo contrario tendrían que conocer las dos lenguas; contras : el problema de arranque)
  2. lenguaje de programación primario de sistemas de bajo nivel de la plataforma en la que se supone que se ejecuta el compilador, por ejemplo C en Unix, Java en JVM, C# en la CLI (pros: muy rápido; contra: muchas veces esos lenguajes no son muy buenos para escribir compiladores, tampoco creo que los beneficios de rendimiento sean reales)
  3. un lenguaje que es muy bueno para escribir compiladores como ML, Haskell, Lisp, Scheme (pros: esos compiladores tienden a ser muy fáciles de entender y hackear; contras: aún necesita conocer ambos idiomas)
    1. caso especial de los anteriores: un lenguaje específico de dominio para escribir compiladores, como OMeta o para el análisis frontend ANTLR, YACC (pros: igual que el anterior pero aún más; contras: igual que el anterior)

Todos estos son esencialmente intercambios: escribir el compilador en el mismo idioma lo hace más fácil de entender, porque no tiene que aprender otro idioma. También puede hacer que sea más difícil de entender porque el lenguaje no es realmente muy bueno para escribir compiladores. (Imagine, por ejemplo, escribir un compilador de SQL en SQL). Incluso podría ser imposible escribir un compilador, por ejemplo (para una definición bastante flexible de "lenguaje" y "compilador") es imposible escribir un CSS compilador en CSS o un compilador HTML en HTML.

En el lado opuesto: escribir el compilador en un lenguaje especializado de compilación probablemente lo hace más fácil de entender, pero al mismo tiempo requiere que aprenda un nuevo idioma.

Tenga en cuenta que las tres clases no son disjuntas: un compilador puede pertenecer a más de una clase. Por ejemplo, un compilador para un lenguaje de compilación especializado en compiladores, escrito en sí mismo, pertenece tanto a la categoría 1 (escrita en sí misma) como a la 3 (escrita en un lenguaje bueno para escribir compiladores).

En algunos casos, en realidad puede golpear el punto óptimo. Por ejemplo, F # es un lenguaje nativo con velocidad nativa en la CLI, y es muy bueno para escribir compiladores. Entonces, escribir el compilador F # en F # le da # 1 (escribiendo en sí mismo), # 2 (escribiendo en un idioma nativo, rápido) y # 3 (escribiendo en un lenguaje que es bueno para escribir compiladores).Lo mismo aplica a Scala.

Cuestiones relacionadas