2012-01-12 11 views
6

Recientemente he estado muy interesado en los compiladores y cómo funcionan. Como gcc tiene su fuente disponible, pensé que sería el mejor material para estudiar.Aprendiendo gcc internals

Lo primero que me di cuenta es que sería inútil estudiar gcc si no tuviera un conocimiento básico de los principios simples del diseño del compilador. Desde entonces, he estado leyendo diligentemente el "Libro del Dragón" que, por lo que he visto, es el libro de facto sobre la implementación del compilador.

No obstante, leer ese libro solo ha fomentado mi deseo de aprender sobre compiladores como gcc.

Además, me parece pertinente decir que tengo una comprensión intermedia de c/C++ (también conocido como, no estoy tratando de estudiar gcc sin saber c). Espero que estudiar gcc me ayude a mejorar eso también.

He descargado la última versión que pude encontrar; sin embargo, me pierdo al leer el código fuente.

Lo que estoy buscando son sugerencias sobre cómo proceder. ¿Hay algún proyecto similar, que no sea tan masivo, que pueda usar como un trampolín para gcc? ¿Hay algún módulo particular de gcc que uno recomiende estudiar primero? ¿Hay algún libro que vaya a la implementación de gcc, en lugar de usarlo? Tal vez debería dejar de lloriquear y seguir leyendo la fuente hasta que haga clic.

Todos y cada uno de los comentarios serán muy apreciados.

EDITAR: Si crees que debería estudiar un compilador/intérprete diferente, agradecería mucho las sugerencias sobre cuáles.

+3

Deberías leer el libro del dragón y luego escribir tu propio compilador. Ayuda muchísimo. –

+2

He escuchado que GCC es una molestia para hackear. Tal vez LLVM sería una alternativa? – Blender

+0

1. Debe comprender el idioma por completo a nivel de experto 2. Primero escriba su propio compilador para un lenguaje pequeño 3. GCC es un desastre. Hay muchas mejores alternativas – Pubby

Respuesta

6

Si quiere ver un compilador muy pequeño, le recomiendo el Tiny C Compiler de Fabrice Bellard.

También vale la pena mencionar, Fabrice Bellard ganó el concurso de código c ofuscado con su Obfuscated Tiny C Compiler. También hay una versión desofuscada, y cabe en un single c file.

Estos deberían ser geniales si quieres algo pequeño y manejable para aprender.

+0

'8c' from plan9 es bastante fácil de leer, también. – Dave

5

Definitivamente miraría clang/LLVM. Creo que la base de código es muy legible. Una opción muy viable que tendría es usar LLVM como un back-end y escribir su propio lexer y analizador.

+2

Acepto, LLVM es mucho mejor para aprender/piratear que gcc. En la escuela de posgrado, el curso de compilación utilizó LLVM para proyectos. – TJD

+1

Descargo de responsabilidad: soy un poco parcial. Mi proyecto de compilador usa LLVM: http://ellcc.org :-) –

0

Creo que es bueno leer el libro "ruby under a microscope" y practicar con el desarrollo de ruby ​​core, antes de leer el código de gcc. Pero deberías necesitar conocimiento sobre la programación de ruby. Se trata de Internels Ruby.

Como sé, el mejor libro sobre gcc es "la guía definitiva para gcc" https://www.amazon.com/Definitive-Guide-GCC-Guides-Paperback/dp/1590595858. Aunque es un poco viejo, creo que deberías leer esto.

0

Apasionados por los compiladores también, aprendí mucho del libro de Niklaus Wirth Algorithms + Data Structures = Programs. Uno de los últimos capítulos describe los lenguajes Pascal-0, y los capítulos anteriores muestran cómo analizar y compilar un lenguaje muy minimalista. Pascal-0, PL/0 son compiladores de dos pasos, generan p-code, que es 'código de máquina' para una máquina virtual minimalista (no a diferencia de Java).

This page describes a PL/0 virtual machine instruction set, y, al final, enlaces a un compilador PL/0 y otra información interesante.

Niklaus Wirth has always had a knack para escribir código legible y bien estructurado.Aquí está la definición del lenguaje y muchos otros enlaces interesantes.

La ventaja de estudiar y usar Pascal es que el lenguaje es muy estructurado, y no una evolución de Assembler (como C). Hace la compilación mucho más fácil. Ni siquiera es necesario hacer varios pases ...