Un viaje de escritura del compilador
En este repositorio de Github, estoy documentando mi viaje para escribir un compilador autocompilador para un subconjunto del lenguaje C. También estoy escribiendo los detalles para que, si quieres seguirlos, haya una explicación de lo que hice, por qué y con algunas referencias a la teoría de los compiladores.
Pero no demasiada teoría, quiero que este sea un viaje práctico.
Estos son los pasos que he tomado hasta ahora:
- Parte 0: Introducción al viaje
- Parte 1: Introducción al escaneo léxico
- Parte 2: Introducción al análisis
- Parte 3: Prioridad del operador
- Parte 4: un compilador real
- Parte 5: Declaraciones
- Parte 6: Variables
- Parte 7: Operadores de comparación
- Parte 8: Declaraciones If
- Parte 9: bucles while
- Parte 10: Bucles For
- Parte 11: Funciones, parte 1
- Parte 12: Tipos, parte 1
- Parte 13: Funciones, parte 2
- Parte 14: Generación de código ensamblador ARM
- Parte 15: Consejos, parte 1
- Parte 16: Declaración adecuada de variables globales
- Parte 17: Mejor verificación de tipos y compensaciones de punteros
- Parte 18: Valores L y Rvalores revisados
- Parte 19: Matrices, parte 1
- Parte 20: Literales de caracteres y cadenas
- Parte 21: Más operadores
- Parte 22: Ideas de diseño para variables locales y llamadas a funciones
- Parte 23: Variables locales
- Parte 24: Parámetros de función
- Parte 25: Llamadas a funciones y argumentos
- Parte 26: Prototipos de funciones
- Parte 27: Pruebas de regresión y una agradable sorpresa
- Parte 28: Agregar más indicadores de tiempo de ejecución
- Parte 29: Un poco de refactorización
- Parte 30: Diseño de estructuras, uniones y enumeraciones
- Parte 31: Implementación de estructuras, Parte 1
- Parte 32: Acceso a miembros en una estructura
- Parte 33: Implementación de sindicatos y acceso de miembros
- Parte 34: Enumeraciones y Typedefs
- Parte 35: El preprocesador C
- Parte 36:
break
y continue
- Parte 37: Declaraciones de cambio
- Parte 38: Colgando más y más
- Parte 39: Inicialización de variables, parte 1
- Parte 40: Inicialización de variables globales
- Parte 41: Inicialización de variables locales
- Parte 42: Conversión de tipos y NULL
- Parte 43: Corrección de errores y más operadores
- Parte 44: Plegado constante
- Parte 45: Declaraciones de variables globales, revisadas
- Parte 46: Parámetros de función nula y cambios de escaneo
- Parte 47: Un subconjunto de
sizeof
- Parte 48: Un subconjunto de
static
- Parte 49: El operador ternario
- Parte 50: Limpiando, parte 1
- Parte 51: Matrices, parte 2
- Parte 52: Consejos, parte 2
- Parte 53: Limpiando, parte 2
- Parte 54: Derrame de registros
- Parte 55: Evaluación perezosa
- Parte 56: Matrices locales
- Parte 57: Limpiando, parte 3
- Parte 58: Fijación de incrementos/disminuciones del puntero
- Parte 59: ¿Por qué no funciona? Parte 1
- Parte 60: Pasar la prueba triple
- Parte 61: ¿Qué sigue?
- Parte 62: Limpieza de código
- Parte 63: Un nuevo backend usando QBE
- Parte 64: Un backend para la CPU 6809
No hay un cronograma ni un cronograma para las partes futuras, así que sigue revisando aquí para ver si he escrito más.
Derechos de autor
He tomado prestado parte del código y muchas ideas del compilador SubC escrito por Nils M Holm. Su código es de dominio público. Creo que mi código es lo suficientemente diferente como para poder aplicar una licencia diferente a mi código.
A menos que se indique lo contrario,
- Todo el código fuente y los scripts son (c) Warren Toomey bajo la licencia GPL3.
- todos los documentos que no son de código fuente (por ejemplo, documentos en inglés, archivos de imágenes) son (c) Warren Toomey bajo la licencia Creative Commons BY-NC-SA 4.0.