proceso - ¿Cómo crear un compilador de C para una CPU personalizada?
compilar y ejecutar un programa (6)
¿Cuál sería la forma más fácil de crear un compilador de C para una CPU personalizada, suponiendo, por supuesto, que ya tengo un ensamblador para él?
Dado que un compilador de C genera ensamblado, ¿hay alguna forma de simplemente definir bits y piezas estándar de código de ensamblaje para las distintas expresiones idiomáticas en C, reconstruir el compilador y, de ese modo, obtener un compilador cruzado para el hardware de destino?
Preferiblemente, el compilador se escribirá en C y se compilará como un ejecutable nativo para Linux o Windows.
Tenga en cuenta: no estoy preguntando cómo escribir el compilador en sí. Tomé ese curso en la universidad, sé sobre compiladores compiladores generales, etc. En esta situación, me gustaría configurar algunos frameworks existentes si es posible. No quiero modificar el idioma, solo quiero apuntar a una arquitectura arbitraria. Si la respuesta resulta ser "no funciona de esa manera", esa información será útil para mí y para cualquier otra persona que pueda hacer suposiciones similares.
1) Respuesta corta:
"No. No existe un" marco de compilación "en el que simplemente pueda agregar agua (conecte su propio conjunto), revuelva y listo".
2) Respuesta más larga: ciertamente es posible. Pero desafiante Y probablemente sea caro
Si quisieras hacerlo tú mismo, comenzaría mirando a Gnu CC. Ya está disponible para una gran variedad de CPU y plataformas.
3) Eche un vistazo a este enlace para obtener más ideas (incluida la idea de "solo crear una biblioteca de funciones y macros"), esa sería mi primera sugerencia:
http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/
Existe el concepto de un compilador cruzado, es decir, uno que se ejecuta en una arquitectura, pero apunta a una diferente. Puede ver cómo lo hace GCC (por ejemplo) y agregar una nueva arquitectura al conjunto, si ese es el compilador que desea extender.
Editar: Acabo de ver una pregunta hace unos años en una lista de correo de GCC sobre cómo agregar un nuevo objetivo y alguien señaló a esto
Visión general rápida / tutorial sobre cómo escribir un backend LLVM.
Este documento describe técnicas para escribir backends para LLVM que convierten la representación de LLVM en código ensamblador de máquina u otros lenguajes.
[. . . ]
Para crear un compilador estático (uno que emite un conjunto de texto), debe implementar lo siguiente:
- Describe el conjunto de registros.
- Describe el conjunto de instrucciones.
- Describe la máquina de destino.
- Implemente la impresora de ensamblaje para la arquitectura.
- Implementar un selector de instrucciones para la arquitectura.
La respuesta corta es que no funciona de esa manera.
La respuesta más larga es que cuesta un poco escribir un compilador para un nuevo tipo de CPU. Sin embargo, no es necesario crear un compilador desde cero. La mayoría de los compiladores están estructurados en varios pasos; aquí hay una arquitectura típica (son posibles muchas variaciones):
- Análisis sintáctico (lexer y analizador sintáctico), y para el preprocesamiento de C, que conduce a un árbol sintáctico abstracto.
- Tipo de comprobación, lo que lleva a un árbol sintáctico abstracto anotado.
- Generación de código intermedio, que conduce a un código intermedio independiente de la arquitectura. Algunas optimizaciones se realizan en esta etapa.
- Generación de código de máquina, que conduce al ensamblaje o directamente al código de máquina. Se realizan más optimizaciones en esta etapa.
En esta descripción, solo el paso 4 depende de la máquina. De modo que puede tomar un compilador donde el paso 4 esté claramente separado y conectar su propio paso 4. Hacer esto requiere un profundo conocimiento de la CPU y cierta comprensión del compilador interno, pero no necesita preocuparse por lo que sucede antes.
Casi todas las CPU que no son muy pequeñas, muy raras o muy antiguas tienen un back-end (paso 4) para GCC . La documentación principal para escribir un back-end de GCC es el manual interno de GCC , en particular los capítulos sobre descripciones de las máquinas y objetivos . GCC es software libre, por lo que no hay costo de licencia al usarlo.
Puede modificar los compiladores de código abierto existentes, como GCC o Clang. Otras respuestas te han proporcionado enlaces sobre dónde aprender más. Pero estos compiladores no están diseñados para ser redirigidos fácilmente ; son "más fáciles" de redirigir que los compiladores que otros compiladores cableados para objetivos específicos.
Pero si quiere un compilador que sea relativamente fácil de reorientar, quiere uno en el que pueda especificar la arquitectura de la máquina en términos explícitos, y alguna herramienta genere el resto del compilador (GCC hace un poco de esto; no creo Clang / LLVM hace mucho, pero podría estar equivocado aquí).
Hay mucho de esto en la literatura, google "compiler-compiler".
Pero para una solución concreta para C, debería consultar ACE , un proveedor de compiladores que genera compiladores bajo demanda para los clientes. No es gratis, pero escuché que producen muy buenos compiladores muy rápidamente. Creo que produce binarios de estilo estándar (ELF?) Por lo que se salta la etapa de ensamblador. (No tengo experiencia o relación con ACE.)
Si no le importa la calidad del código, es probable que pueda escribir una traducción de C dirigida a la sintaxis mediante un C AST. Puede obtener C AST de GCC, Clang, quizás ANTLR, y de nuestro DMS Software Reengineering Toolkit .
vbcc (en www.compilers.de) es un buen y simple compilador C redestinable escrito en C. Es mucho más simple que GCC / LLVM. Es tan simple que pude redirigir el compilador a mi propia CPU con algunas semanas de trabajo sin tener ningún conocimiento previo de los compiladores.