2010-10-15 18 views
10

Duplicar posible:
Learning to write a compiler¿Cómo escribir un compilador simple en C/++?

Hola desbordamiento de pila, ahora no me malinterpreten, no tengo la intención de escribir un compilador para C++ (aunque tengo la intención de escribirlo en C++) o Java u otro lenguaje de programación complejo de alto nivel. Solo quiero aprender los conceptos básicos para convertir un conjunto básico de instrucciones en un ejecutable de Windows (por ejemplo, un lenguaje sencillo con 5-6 funciones, completamente personalizadas). Además, no quiero descargar ninguna biblioteca o archivo de encabezado. ¡Si pudiera vincularme a cualquier fuente de ejemplo o tutoriales muy básicos, sería muy apreciado!

+0

Esto es algo que nunca he sido capaz de encontrar cualquier cosa que explica. Perdón por haber causado una facepalm = ( – Cr15py

+2

versión original [Aprender a escribir un compilador] (http://stackoverflow.com/q/1669/2509). Para simplificar, desea el tutorial de Crenshaw, pero para simplificar también * no lo haga * quiero hacer C++ ... – dmckee

+0

@dmckee +1 en no querer C++ - los compiladores que son lo suficientemente sofisticados como para necesitar un árbol de análisis requieren muchas manipulaciones de árbol, y C++ (y Java, y casi cualquier lenguaje fuera de ML/Haskell familia e idiomas de inspiración similar como Scala) realmente apesta a manipulaciones de árboles. –

Respuesta

6

Jack Crenshaw's Let's Build a Compiler es un buen tutorial para comenzar. Es un buen escritor y hace que el tema sea fácil de entender.

4

Esto es lo que necesita para escribir un compilador básica:

  1. Analizador. Tendrá que analizar su idioma y crear un Árbol de sintaxis abstracta. Es posible que desee aprender sobre cómo escribir analizadores. Puede codificar manualmente el analizador, o puede usar generadores de analizador sintáctico, por ejemplo, lex/yacc.
  2. Montaje. Deberá generar instrucciones de ensamblaje a partir del Árbol de sintaxis.
  3. Conjunto de instrucciones. Necesitará traducir el ensamblaje al código de la máquina, en un conjunto de instrucciones específicas (la CPU típica de Intel y AMD usa el conjunto de instrucciones x86; alternativamente, puede orientar el conjunto de instrucciones de VM de Java o IL de .NET).
+2

-1 Lex no es un analizador. – alternative

+0

@mathepic: no lo hice afirmar que fue un analizador. –

+0

Quise decir generador de analizador. – alternative

4

se analiza la entrada, usted debe leer sobre recursive descent parsing (esos son, probablemente, los analizadores más fáciles de poner en práctica a mano), aunque también se necesitará un analizador léxico de algún tipo para producir fichas para su analizador. Se pueden codificar a mano (lo he hecho), aunque es más fácil usar un generador lexer como lex o flex.

Una vez que haya analizado la entrada, deberá transformarla en la salida adecuada. No puedo ayudar mucho allí, ya que no conozco muy bien la cadena de herramientas de Windows. La manera "fácil" es generar ensamblaje y ejecutarlo a través de NASM, MASM o cualquier ensamblador que tenga su entorno de compilación. Si su lenguaje es lo suficientemente simple, puede generar el ensamblaje a medida que avanza en el código del analizador.

+0

Gracias, personalmente, la razón por la que estoy tratando de aprender esto (y la razón por la que odio las bibliotecas), es porque me encanta escribir cosas, y este es un tema que quiero entender. El lexing y tal lo entiendo, es ese punto mistificado en el que el texto va del texto al código ejecutable. Por otro lado, me gustaría darle las gracias por el enlace. – Cr15py

0

Recomendaría www.antlr.org. Trabajé en C#, pero tiene soporte para C, Java, Python y más.

2

En realidad, lo más importante que necesita es descifrar el formato binario de los archivos .exe (a menos que esté planeando usar un enlazador existente, en cuyo punto creo que necesita generar archivos obj que también tengan un binario formato).

También necesita lidiar con MUCHO ensamblaje, a menos que ya esté MUY familiarizado con el conjunto de instrucciones x86, probaría otra cosa.

Aquí hay algunas posibilidades:

  • Antes había una cosa llamada "Tiny C" - supongo que esto es: http://bellard.org/tcc. Tiny C es un compilador suficientemente bueno para compilarse, pero no tan complejo que es difícil de entender. Es una lección escueta de "Cómo construir un compilador" en una caja. Metido con eso en el 8088.

  • Salida para una CPU "incrustada". Tienden a tener lenguajes de ensamblaje simples y formatos ejecutables muy claramente definidos. Este sería un buen lugar para comenzar.

  • Salida del código C en lugar de un código binario. Seguro que se trata de una trampa, pero puedes concentrarte en tu idioma y no preocuparte demasiado por el lenguaje ensamblador.

  • Por último, si realmente desea crear directamente un .exe, primero escriba una aplicación que produzca un exe "Hello world". No se moleste en tenerlo "Compile" nada, simplemente edite manualmente el código, póngalo en el formato exe y ejecútelo; al hacer esto SABRÁ que tiene todos sus bits alineados y en los lugares correctos, entonces usted puede comenzar en un compilador con cierta confianza.

Después de esto, entonces la creación de la lengua se puede hacer a través de una gran cantidad de los procedimientos que se dan aquí - pero si lo que desea es ver cómo funciona todo, definitivamente haría unas pocas iteraciones pequeñas primero, no te preocupes por lo que te encontrarás hasta que te encuentres con él.

0

Para aprender acerca de cómo construir un compilador es diferente en C++ que en, digamos, C o Pascal, pruebe el marco de análisis Boost Spirit.

Esto asume la familiaridad con C++.

Para obtener información sobre cómo crear un compilador, sugiero utilizar un lenguaje más simple que C++, y luego avanzar a C++.

Saludos & HTH.,

Cuestiones relacionadas