without with only net name from filename extension convert c# c compiler-construction

with - get filename only c#



Compilador de código abierto C en C#? (5)

El lenguaje real más directo en términos de sintaxis parece ser C.

No estoy seguro de lo que quiere decir con "lenguaje real", pero cualquiera sea el significado de "lenguaje real", no puedo aceptar que C tenga una gramática léxica o sintáctica "directa" y que su semántica no esté bien especificada. Si desea un lenguaje extremadamente sencillo con una semántica bien definida, ¿por qué no ir a Scheme? Scheme tiene una gramática muy fácil, pero ciertamente no es trivial para obtener su semántica correcta.

Me he metido en la creación del compilador. He encontrado algunas cosas excelentes para principiantes y cosas avanzadas pero nada en el medio. He creado 3 compiladores diferentes de prueba de concepto diferentes para lenguajes de juguete, pero quiero exponerme a algo real.

El lenguaje real más directo en términos de sintaxis parece ser C. Dado que el lenguaje con el que me siento más cómodo en este momento es C #, me encantaría estudiar el código fuente de un compilador C real no tutorial escrito en C #. ¿Existe uno (con el código fuente disponible)?

Idealmente, me gustaría un compilador de C, no un compilador .NET o C #, pero con el código fuente escrito en C #.
Sé que C # -> C se siente un poco atrás, pero me permitirá adentrarme más en los compiladores, comenzando con un lenguaje familiar antes de cambiar eso también.

Aunque no estoy buscando compiladores de C # / .NET, aquí hay algunos en caso de que alguien vea esta pregunta quién está buscando eso:




No sé de una que exista, pero no hay razón por la que uno no pueda o no deba.

Escribir un compilador para un lenguaje tipo C es un proyecto clásico para los cursos de compilación universitarios de un semestre. Si ya conoces C #, proporciona muchas funciones que harán tu trabajo más fácil que cuando estaba en la universidad. Hay muchas bibliotecas alrededor que facilitarán el trabajo, sin eliminar el desafío, y siempre puede reemplazarlas con su propio código ad-hoc si necesita flexibilidad que no ofrecen.

El primer compilador de C fue escrito en BCPL porque es lo que tenían. Los compiladores de C actuales normalmente se escriben en C porque pretenden ser portátiles. No creo que nadie diría que C es un buen lenguaje para escribir compiladores. (¡C # no es perfecto pero es mucho mejor!) En un lenguaje compilado estáticamente como C, no creo que obtengas muchos beneficios , en su caso, de utilizar el idioma de destino para escribir el compilador.

Un compilador en un HLL tiene potencialmente muchas ventajas. Sería más corto y más simple que uno escrito en C. Eso solo podría hacer muchas cosas lo suficientemente fáciles como para que pudieran ser superadas por debajo del umbral de "demasiado difícil para que nadie las vaya a hacer". (GCC es el tipo de niño de póster de cómo un compilador escrito en un LLL puede ser tan complejo que se mueve a una velocidad glacial). Las optimizaciones son básicamente transformaciones gráficas, que no son exactamente el fuerte de C.

No considero "al revés" usar C # para compilar C. A menos que alguien proponga volver a escribir todo su código C en un lenguaje de nivel superior, aún debe compilarse de alguna manera, y eso significa que necesita un compilador. ¿No debería escribirse ese compilador con herramientas que le permitan ofrecer la mejor confiabilidad y rendimiento?

¡Buena suerte! Espero ver lo que escribes!


Va a tener dificultades para encontrar el código de ejemplo. Los escritores de compiladores usan bootstrapping . El primer compilador de C se escribió en B, que luego se usó para escribir el primer compilador de C ++. Que se utilizó para escribir el compilador de C #. Que se utiliza muy comúnmente para escribir compiladores para código administrado.

Este no es un proceso que siempre retroceda. Si bien las vías laterales eran comunes, los compiladores de C a menudo se usaban para compilar de forma cruzada un compilador para otro sistema operativo.

Creo que usé este libro , tiene un excelente código de compilador de C en los apéndices. Escrito en C. Usé partes de él cuando escribía un compilador básico que necesitaba en un proyecto grande. El analizador de expresiones es difícil de entender, tiene una solución elegante para las reglas de precedencia del operador.

Dirigirse a un lenguaje administrado es la forma más fácil de hacer que esto funcione. El lenguaje no debería importar demasiado, es hacer que funcione, ese es el verdadero desafío. Aunque es mucho más fácil conseguir que el código administrado funcione. Si desea apuntar a C, necesitará una habilidad de código de máquina de cinturón negro y una visión profunda en el formato de archivo de objeto y el vinculador.