Comstackción-Progtwigción: ¿Cuáles son los ingredientes más fundamentales?

Me interesa escribir un comstackdor muy minimalista.

Quiero escribir una pequeña pieza de software (en C / C ++) que cumpla los siguientes criterios:

  • salida en formato ELF (* nix)
  • la entrada es un solo archivo de texto
  • C-como gramática y syntax
  • sin enlazador
  • sin preprocesador
  • muy pequeño (max. 1-2 KLOC)

Características del lenguaje:

  • Tipos de datos nativos: char, int y floats
  • matrices (para todos los tipos de datos nativos)
  • variables
  • estructuras de control (si-si no)
  • funciones
  • bucles (sería bueno)
  • álgebra simple (div, add, sub, mul, expresiones booleanas, cambio de bits, etc.)
  • asm en linea (para llamadas al sistema)

¿Alguien puede decirme cómo empezar? No sé en qué partes se compone un comstackdor (al menos no en el sentido de que simplemente podría comenzar de inmediato) y cómo progtwigrlas. Gracias por tus ideas.

En primer lugar, debe decidir si va a hacer un comstackdor o un intérprete. Un comstackdor traduce su código en algo que puede ejecutarse directamente en el hardware, en un intérprete o comstackdo en otro idioma que luego se interpreta de alguna manera. Ambos tipos de idiomas se completan de manera que tienen las mismas capacidades expresivas. Le sugiero que cree un comstackdor que compile su código en un código de bytes .net o Java, ya que le brinda un intérprete muy optimizado para ejecutarse, así como muchas bibliotecas estándar.

Una vez que haya tomado su decisión, hay algunos pasos comunes a seguir

  1. Definición del idioma En primer lugar, debe definir cómo debe verse su idioma sintácticamente.

  2. Lexer El segundo paso es crear las palabras clave de su código, conocidas como tokens. Aquí, estamos hablando de elementos muy básicos como los números, el signo de sum y las cadenas.

  3. Análisis El siguiente paso es crear una gramática que coincida con su lista de tokens. Puede definir su gramática utilizando, por ejemplo, una gramática libre de contexto. Con una de estas gramáticas se pueden incluir varias herramientas y crear el analizador por usted. Normalmente, los tokens analizados se organizan en un árbol de análisis. Un árbol de análisis es la representación de tu gramática como una estructura de datos en la que puedes moverte.

  4. Comstackción o interpretación El último paso es ejecutar algo de lógica en su árbol de análisis. Una forma sencilla de crear su propio intérprete es crear una lógica asociada a cada tipo de nodo en su árbol y recorrer el árbol de abajo hacia arriba o de arriba hacia abajo. Si desea comstackr en otro idioma, puede insertar la lógica de cómo traducir el código en los nodos.

Wikipedia es genial para aprender más, puede comenzar aquí .

Con respecto al material de lectura del mundo real, sugeriría “Progtwigción de procesadores de lenguaje en JAVA” de David A Watt & Deryck F Brown. Utilicé ese libro en mi curso de comstackdores y aprender con ejemplos es excelente en este campo.

Con todo lo que espera lograr, el requisito más desafiante podría ser “muy pequeño (máx. 1-2 KLOC)”. Creo que su primer requisito solo (generar salida ELF) puede llevar más de mil líneas de código por sí mismo.

Una forma de simplificar el problema, al menos para comenzar, es generar código en el texto en lenguaje ensamblador que luego alimenta en un ensamblador existente ( nasm sería una buena opción). El ensamblador se encargaría de generar el código de máquina real, así como todo el código específico de ELF requerido para construir un ejecutable ejecutable real. Entonces su trabajo se reduce a la generación de códigos de ensamblaje y análisis de idioma. Cuando su proyecto madura hasta el punto en el que desea eliminar la dependencia de un ensamblador, puede volver a escribir esta parte y enchufarla en cualquier momento.

Si yo fuera tú, podría comenzar con un ensamblador y construir piezas sobre él. El “comstackdor” más simple puede usar un lenguaje con solo algunas declaraciones muy simples posibles:

print "hello" a = 5 print a 

y traducir eso al lenguaje ensamblador. Una vez que consiga que funcione, puede crear un lexer y un analizador y un árbol de syntax y un generador de código abstractos, que son la mayoría de las partes que necesitará para un lenguaje moderno de bloques estructurados.

¡Buena suerte!

Estas son las partes absolutamente esenciales:

  • Escáner: Esto rompe el archivo de entrada en tokens
  • Analizador: esto construye un árbol de syntax abstracta (AST) a partir de los tokens identificados por el escáner.
  • Generación de código: Esto produce la salida del AST.

También es probable que desee:

  • Manejo de errores: esto le dice al analizador qué hacer si encuentra un token inesperado
  • Optimización: esto permitirá al comstackdor producir un código de máquina más eficiente

Edit: ¿Ya has diseñado el lenguaje? Si no, querrás mirar también el diseño del lenguaje.

No sé qué espera obtener de esto, pero si está aprendiendo, y mirando el código existente funciona para usted, siempre hay tcc .

El número uno esencial es un libro sobre escritura de comstackdores. Mucha gente te dirá que leas el “Libro del Dragón” de Aho et al, pero el mejor libro que he leído en los comstackdores es “Brinch Hansen en los comstackdores de Pascal”. Sospecho que está agotado (Amazon es tu amigo), pero te lleva a través de todos los pasos para diseñar y escribir un comstackdor utilizando el descenso recursivo, que es el método más fácil de entender para los novatos en el comstackdor.

Aunque el libro utiliza Pascal como la implementación y los idiomas de destino, las lecciones y técnicas presentadas se aplican por igual a todos los demás idiomas.

Los ejemplos están todos en Perl, pero Explorar la architecture del lenguaje de progtwigción en Perl es un buen libro (y gratuito).

Un muy buen conjunto de referencias gratuitas, IMHO, son:

Tutorial general del comstackdor: Construyamos un comstackdor por Jack Crenshaw ( http://compilers.iecc.com/crenshaw/ ) Es prolijo, pero me gusta.

Ensamblador: NASM ( nasm.us ) es bueno para Linux y Windows / DOS, y lo más importante es un montón de documentos y ejemplos / tutoriales. ( FASM también es bueno, pero hay menos documentación / tutoriales por ahí)

Otras fonts The PC Assembly book ( http://www.drpaulcarter.com/pcasm/index.php )

Estoy tratando de escribir un LISP, así que estoy usando el Manual de Lisp 1.5 . Es posible que desee obtener la especificación de idioma para cualquier idioma que esté escribiendo.

En cuanto a 1-2KLOC, suponiendo que uses un lenguaje de alto nivel (como Py o Rb) deberías estar cerca si no eres demasiado ambicioso.

Siempre recomiendo flex y bison para este tipo de trabajo como principiante. Siempre puede aprender los entresijos de escribir su propio escáner y analizador más tarde, aunque pueden boost el tamaño del código al menos los generarán las herramientas. 🙂