2009-07-23 32 views
7

Estaba teniendo esta conversación con mi amigo y me di cuenta de que este podría ser el mejor lugar para hacer esta pregunta.Lenguaje de programación y compilador

¿Cómo nace un nuevo idioma? Este nuevo idioma NUEVO debe escribirse en algún idioma antiguo (por ejemplo, C++ se escribió en C en etapas iniciales) o ¿cómo se crea? Y, ¿cómo puede funcionar este idioma NUEVO si no hay un compilador para él? Entonces, debe haber algún compilador para eso? ¿Quién escribe el compilador para eso?

Entonces, ¿cómo funciona todo esto junto, el nuevo lenguaje y su compilador, la relación del nuevo idioma con su antiguo lenguaje base?

+1

Gracias a todos por tales respuestas rápidas. Un curso de diseño de compiladores es lo que necesito, supongo. Pero, me preguntaba/curré cómo pueden responder tan rápido, me refiero a uno o dos minutos, lo cual es muy sorprendente. –

+2

Todos estamos muriendo por puntos de reputación. ¡Vámonos, por favor! :-) –

+0

@Norman: Soy nuevo en SO y no sé mucho sobre reputaciones. Tengo que revisar todo eso cuando sea libre. Supongo que estás feliz ahora. :) –

Respuesta

5

Escribes el compilador en un lenguaje de implementación hasta el momento en que el compilador puede comenzar a compilar suficiente del nuevo idioma que se utilizará para implementar el resto del nuevo idioma.

Así es como funciona.

Editar: Solo para aclarar, los comentarios sobre esta respuesta también son correctos. El compilador NO TIENE que escribirse en el nuevo idioma a menos que lo desee. Como se dijo, algunos no siguen esa ruta y se quedan con el lenguaje de implementación original.

+0

Sí, eso es todo en pocas palabras. Hay quienes no creen que sea un lenguaje real a menos que se pueda usar para escribir su propio compilador :) – wcm

+0

Para agregar a la respuesta de Scyllinice: No todos los idiomas pueden seguir esta ruta, por supuesto, muchas variaciones de LISP son puras intérpretes sin la capacidad de crear un ejecutable per se, y un compilador LISP se puede escribir en casi cualquier idioma. Los idiomas OLD y NEW realmente no tienen que tener una conexión real entre ellos. – Mike

+0

sin embargo, no necesariamente tiene que migrar fuera del idioma de implementación original. Por ejemplo, Tcl y muchos (la mayoría?) Lenguajes de scripting usan el lenguaje de implementación C o C++ mucho después de que el nuevo lenguaje se haya vuelto maduro y estable. –

2

Bootstrapping es un término usado en ciencias de la computación para describir las técnicas involucradas en la escritura de un compilador (o ensamblador) en el lenguaje de programación de destino que se pretende compilar. Esta técnica también se llama autohospedaje.

1

El corazón de cualquier idioma es el engarce y compilador, el compilador que convierte el código fuente en intermediario, muy cerca del código de máquina, código. A partir de este punto, los enlazadores se utilizan para adjuntarlo a otros binarios, como bibliotecas, etc. Una vez que los binarios están vinculados a todas las piezas lógicas, se convierten en un archivo ejecutable en código máquina (o código intermediario traducible como lo es con .NET/Java)

Lo que más se traduce del inglés "humano" ocurre en el compilador, y hay excelentes artículos sobre cómo se hace esto ... pero a la mayoría de esto es en el ámbito de lo sobrenatural, como las habilidades organizativas requeridas para escribir un compilador de trabajo son inmensos.

Puede ver los tipos de traducciones de nivel superficial y ver de cerca cómo funcionan los compiladores mirando las definiciones de lenguaje ("The C++ Programming Language" de Bjarne Stroustrup, "The C# Programming Language" de Microsoft Press), donde tanto los apéndices y salpicados son piezas léxicas, o reglas que el compilador utilizará para traducir sus palabras en código máquina de una manera muy lógica.

Le recomiendo leer la definición de idioma de su lenguaje de programación favorito si desea comprender más, también el artículo de wikipedia sobre compiladores le dará una comprensión más amplia.

+0

No estoy de acuerdo con la afirmación "las habilidades organizativas requeridas para escribir un compilador de trabajo son inmensas". Cuando tenía pocos años de universidad y nunca había tomado una clase de compilación, pude crear un lenguaje de propósito especial usando lex y yacc. Si bien fue difícil, estuvo lejos de ser inmensamente difícil. En realidad fue bastante gratificante. –

+0

@Bryan: depende. Con las herramientas modernas de generación de compiladores, puede ser razonablemente fácil crear un lenguaje pequeño (como muchos lenguajes específicos de dominio), pero @Sprague está asumiendo algo más sustancioso. Una vez que agregue toda la optimización, generación de código, etc. necesaria para un lenguaje de programación importante como Python, Java o C#, el trabajo puede ser muy exigente. Luego hay tareas auxiliares como diseño de máquinas virtuales, algoritmos de GC, bibliotecas estándar, ... –

0

Un idioma es (en general) nada más que una especificación. Un compilador o intérprete de un idioma puede escribirse en el idioma que elija. Los primeros fueron en código de máquina, ya que eso es todo lo que teníamos.Luego vino el ensamblador, luego otros lenguajes como C. Desde ese momento, C (y C++) han seguido siendo opciones populares para la implementación de un idioma. C y C++ son las únicas opciones, sin embargo.

También vale la pena señalar que, con frecuencia, un idioma puede implementarse con un idioma (o idiomas) especializado, como yacc y lex. Estos son lenguajes específicos de dominio diseñados específicamente para facilitar la creación de compiladores basados ​​en una especificación. Esto quita el trabajo pesado de la mano, codificando muchas cosas que una computadora puede generar fácilmente. Usted toma la especificación, la ejecuta a través de estas herramientas y saca el código para implementar su idioma. Yacc significa Yet Another Compiler-Compiler. Compila las especificaciones de un compilador y genera un compilador.

Otros carteles sugieren que una vez que un lenguaje es lo suficientemente robusto, el compilador puede portarse a sí mismo, pero esto no es necesario. Se escribieron muchos idiomas hace una década o más en C y continúan implementándose en C hoy.

1

¡Una gran pregunta!

  • A veces el compilador del nuevo idioma está escrito en un idioma antiguo.

  • Si el compilador de lenguaje nuevo N está escrito en N, hay muchas estrategias, todos los cuales implican encontrar alguna manera de ejecutar un programa en lenguaje N cuando todavía no tiene una compilador.

    1. Escribir una intérprete para el lenguaje N, dicen en C (en realidad el idioma de su elección), a continuación, utilizar el intérprete para interpretar el compilador compilar sí.

      • Escribir un compilador realmente terrible para N, dicen en C, y luego utilizar eso para compilar la primera versión del compilador.

      • Compile la primera versión del compilador en código de ensamblaje o código C, generalmente a mano.

Mi favorita es la estrategia # 1, pero todos ellos trabajan.

Si desea ver una solución a este problema explicada en profundidad, consulte el breve artículo de Andrew Appel Axiomatic Bootstrapping: A Guide for Compiler Hackers, que es gratuito desde un sitio web de Princeton. Este documento es muy matemático, pero en la sección de trabajo relacionado encontrará referencias a documentos anteriores, incluidos los que muestran el proceso de arranque mediante diagramas T, que a mucha gente le resulta muy intuitivo.

Cuestiones relacionadas