2010-01-10 11 views
25

¿Qué lenguaje se usa para construir lenguajes de bajo nivel como C++ y java?¿Con qué idioma compilan otros idiomas?

¿Cómo se puede construir el primer idioma sin idioma?

+65

Java es un lenguaje de bajo nivel? Los niños de hoy en día. :) –

+15

C++ es un lenguaje de bajo nivel? –

+10

Quizás se refieran a bajo nivel en términos de capacidad :) OOPs! ¡Aquí vienen las llamas! –

Respuesta

32

En el contexto de los compiladores, esta operación a menudo se llama bootstrapping. En particular, consulte la sección "Problema de pollo y huevo" para obtener una respuesta directa a su pregunta.

El mismo primer compilador habría sido escrito a mano en lenguaje ensamblador. Si su próxima pregunta es "¿cómo se escribió el primer ensamblador?" entonces la respuesta sería que el primer ensamblador fue escrito a mano en código de máquina binaria, posiblemente con front panel toggle switches. Esto es, sin duda, una simplificación de lo que realmente sucedió, pero el concepto es el mismo.

También hay un excelente artículo titulado Reflections on Trusting Trust por Ken Thompson sobre los riesgos de usar un compilador para un lenguaje para compilar el compilador para ese idioma.

+0

+1 por mencionar solamente el papel de Thompson. Creo que ese fue su discurso para obtener el premio Turing. –

+1

También tenga en cuenta que para las arquitecturas nuevas, se puede compilar un compilador cruzado utilizando un compilador de una arquitectura existente, que luego se ejecuta en la arquitectura existente pero genera código que se ejecuta en la nueva arquitectura. Ese código en sí mismo puede ser un compilador que luego se ejecuta en la nueva arquitectura. – Clifford

+0

"indudablemente una simplificación" no mucho de uno realmente. Los cargadores llegaron antes que los ensambladores. Bootstrapping a un ensamblador fue el mismo trato que el arranque de un compilador. Simple a complejo agregando algunas funciones cada vez. Afortunadamente, cuando comencé hace 4 décadas, la mayoría de las máquinas venían con un ensamblador sofisticado pre-escrito por el vendedor. Incluso el humilde PDP-8. –

4

Creo que la clave de su pregunta es la noción de boot-strapping. El enlace describirá cómo un idioma puede autoevaluarse.

Es relativamente común en la comunidad Lisp. p.ej. Algunas clases universitarias usarán Scheme para escribir un subconjunto de idioma (esto no es una actividad de clase de compilador).

Dicho esto, muchos compiladores están escritos en otros idiomas. Por ejemplo, PUGS (Perl 6) está escrito en Haskell. Ruby está disponible en C o Java (como JRuby).

+0

compilador dogfooding – kenny

3

hay un par de opciones, puede implementar todo el idioma en un idioma disponible en el host de destino, como C u Ocaml, cualquiera que sea. Una vez que tenga esa implementación, puede escribir un compilador/intérprete en el idioma en sí, compilarlo y ahora el idioma se ejecuta solo. este proceso se llama 'bootstrapping'.

+0

pero la pregunta es ¿cómo se escribió el primer idioma? – ajsie

+0

Se escribió directamente en el ensamblador, que es el código que el procesador entiende de forma nativa. – calvinlough

+1

Los procesadores no entienden el lenguaje ensamblador, entienden el código máquina. Aún necesita un programa llamado 'ensamblador' para crear código de máquina a partir del código ensamblador (aunque existe una relación de uno a uno entre la instrucción de la máquina y la mnemónica del ensamblador). Originalmente, habría tenido que establecer las direcciones de memoria y el contenido utilizando los interruptores binarios o el teclado hexadecimal, o los quemaría en una ROM. Sin embargo, al iniciar una nueva arquitectura en estos días, usaría un compilador cruzado o ensamblador ejecutándose en una arquitectura existente. – Clifford

6

Gran parte de este tipo de cosas se hace en C.

El primer compilador C no fue escrito en C; era el ensamblador PDP-11. Otros compiladores de C iniciales se han escrito en varios lenguajes de ensamblador.

Pero todos los compiladores de C posteriores en realidad están escritos en C, basados ​​en un "compilador C portátil". Sí, es circular. Pero el compilador de la versión x se puede usar para compilar el compilador de la versión x + 1.

+0

PCC está de nuevo en desarrollo activo - http://pcc.ludd.ltu.se/ –

+0

¿Está seguro de que el primer compilador de C no se escribió en C? (O supongo que estrictamente, en "C con algunas características faltantes"). No puedo decir nada de este artículo: http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, pero Dennis Ritchie dice que B ya estaba alojado por sí mismo antes de comenzar a desarrollarlo en C, y menciona específicamente el autohospedaje como una característica deseable. Si regresó al ensamblador PDP-11, en lugar de desarrollar B gradualmente en C inicial, ¿sabe por qué? La innovación de PCC no era que estuviera escrita en C, sino que se compilara bien. –

+0

Buen punto. Mi comprensión era que B era la plantilla para C; no es que el compilador B se haya modificado para crear el compilador de C. Sin embargo, es completamente posible que tenga eso completamente equivocado y el compilador B se transformó para crear C. –

14

No se construye un lenguaje, pero se construye una compiler o un interpreter ... y para ello se puede elegir cualquier idioma, incluso el idioma que desee para compilar ...

El primer auto -hosting compilador - capaz de compilar su propia fuente código en un lenguaje de alto nivel - fue creada para Lisp ... Desde la década de 1970 se ha convertido en una práctica común implementar un compilador en el idioma compila, aunque tanto Pascal como C han sido populares opciones para el lenguaje de implementación . http://en.wikipedia.org/wiki/Compiler

+0

+1 para la respuesta más directa a la pregunta original. Los enlaces son geniales. –

+0

Esto es incluso cierto para lenguajes extraños como BCX. (Un compilador de BASIC a C desde hace mucho tiempo) La fuente del compilador se escribió en BCX. –

1

No existe el término "sin idioma". La unidad de procesamiento central opera en una serie de señales a las que nos referimos como bits o unos y ceros (técnicamente, cambios en el flujo de corriente eléctrica). En la década de 1950, la codificación se hacía directamente en lo que la CPU podía "entender" y el ritmo con el que se programaba era de hasta 20 comandos de ensamblador por día.

0

Normalmente, se utiliza otra máquina u otro idioma para escribir el primer ensamblador y el primer compilador.

Mientras haya disponible una computadora que funcione y un idioma de trabajo, aunque sea diferente, el problema se puede resolver en dos pasos.

  1. Escribir idioma de destino x para la computadora y en lenguaje z en el ordenador (urk) un.

  2. Escribir idioma de destino x para la computadora y en lenguaje x. Ahora una sola compilación en a producirá un traductor que se puede ejecutar en y, y la segunda compilación puede estar entonces en y con un sistema completamente bootstrapped.

El problema se vuelve más simple si los idiomas o las máquinas no son diferentes.

Bootstrapping también se puede hacer de forma incremental, y tal vez esto fue más común hace 50 años.

  • Escribe una máquina virtual más potente (tal vez una máquina de pila o algo con cuerdas) en código de máquina
  • Ahora, escribiendo en el código de bytes de la máquina virtual, escribir algo más cercano a la lengua

Algo parecido Forth podría dar un buen paso intermedio.

1

Como se menciona en los otros carteles, puede escribir un idioma en prácticamente cualquier idioma, ya menudo uno de los primeros programas escritos en un idioma es un compilador del idioma en sí.

Sin embargo, hay algunos idiomas que fueron especialmente desarrollados para escribir lenguajes de computadora: lex, yacc, flex, bison (versiones actualizadas de lex y yacc). Estos le permiten representar la especificación léxica y gramatical de algunos lenguajes (creo que LLR o LALR) en una forma que se puede compilar en un reconocedor de lenguaje eficiente.

Aún tiene que escribir otras partes del compilador/intérprete de idioma, es decir, análisis semántico, generación de código.

Ver

http://dinosaur.compilertools.net/

Cuestiones relacionadas