¿Cuál es el conjunto de habilidades deseable para trabajar en el área de lenguajes de programación / compiladores?

Necesita conocer su informática básica: estructuras de datos, algoritmos, complejidad. Las pilas, las colas, el hash, especialmente cómo manejar los punteros de forma natural en un lenguaje como C, e incluso cómo manejar los punteros C de manera abusiva (por ejemplo, matemática de punteros, enmascarar punteros, etiquetar punteros, construir punteros a partir de múltiples fragmentos).

Debe conocer las arquitecturas de la computadora: álgebra booleana, bits, bytes (¿por qué los bytes son de 8 bits?), Representación del valor de datos (decimal, uno y dos complementarios, formato de punto flotante IEEE), conjuntos de instrucciones (especialmente el Intel x86 “de gama alta”, y dispositivos de gama baja como un 8051), hardware (compuertas, buffers, tuberías, predictores de rama, jerarquías y cachés de memoria, interrupciones y trampas, instrucciones y registros de punto flotante, memoria virtual). En estos días, necesita comprender los multiprocesadores y las acciones atómicas, las instrucciones atómicas y algo sobre la programación sin bloqueo. Debe tener conocimiento práctico del código de ensamblaje.

Debe conocer (y haber codificado) múltiples lenguajes de programación. por ejemplo, C, C ++, Prolog, Java y cómo se han implementado elementos de lenguaje clave para cada uno en varias máquinas: enteros, flotantes, evaluación de expresiones, matrices, procedimientos, parámetros y argumentos, ámbitos léxicos, cierres, clases, herencia múltiple y cómo método de despacho de llamadas. (Leer sobre el Burroughs B5500 es una revelación: Algol en hardware). Es bueno si ha implementado algunas bibliotecas centrales, como la conversión precisa de punto flotante o las bibliotecas de cadenas de alto rendimiento. Debe saber por qué los genéricos de Java están mal diseñados.

Necesita saber acerca de la tecnología del compilador: análisis, creación de AST, análisis semántico, construcción de tablas de símbolos, resolución / búsqueda de nombre y tipo (¡no tiene idea de lo complicado que es para C ++ 14!), Flujo de control y flujo de datos construcción de gráficos, lenguajes intermedios y varias formas de representarlos, generación de código, optimización, selección de registros y derrames.
En estos días necesitas saber sobre la compilación JIT y la recolección de basura.
Es útil saber acerca de la transformación dirigida por patrones. Debe saber cómo funcionan los depuradores, y debe sentirse cómodo mirando los volcados de memoria hexadecimal.

Estos 3 libros deben estar en su estante, y usted debe saber lo que contienen:

Compiladores: Principios, técnicas y herramientas (2ª edición): Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman: 9780321486813:

Ingeniería de un compilador, segunda edición: Keith Cooper, Linda Torczon: 9780120884780

Computer Architecture, Fifth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design): John L. Hennessy, David A. Patterson: 9780123838728

Necesita algo de experiencia en el uso de todas las áreas anteriores. Puedes elegir mucho en las clases de la Universidad si eliges bien (a menudo usan estos libros). Puede leer mucho sobre esto si tiene la fuerza de voluntad y mucho tiempo libre. Lo mejor que puede hacer es adquirir el fondo, y construir algunos compiladores de juguetes por su cuenta, y luego quizás sumergirse en compiladores de código abierto existentes. Clang y LLVM te harán girar la cabeza.

Finalmente, debe comprender la ingeniería de software: recopilación de requisitos, especificación, diseño, implementación, pruebas y planificación de proyectos. Los proyectos compiladores más importantes requieren más de una persona, y alguien lo ha manejado.

Es mucho que aprender. Es intelectualmente muy satisfactorio.

Una forma realmente interesante de aprender sobre los compiladores es construir un metacompilador.
El artículo MetaII de Val Schorre de 1963 le enseñará cómo hacerlo en 10 páginas cortas pero impresionantes. (Así es como aprendí por primera vez sobre la compilación en 1971). Nunca volverás a pensar en los compiladores de la misma manera. Si desea más ayuda, este Tutorial: Metacompiladores lo guiará a través del proceso de hacerlo en JavaScript.

(Vea el comentario de Peter Schachte para algunas adiciones muy útiles).