¿Cómo puedo hacer que mi propio compilador de C ++ comprenda las plantillas, las clases anidadas, etc., las características sólidas de C ++?

StackOverflow https://stackoverflow.com/questions/618859

Pregunta

Es una tarea de la universidad en mi grupo escribir un compilador de lenguaje C-like. Por supuesto, voy a implementar una pequeña parte de nuestro querido C ++.
La tarea exacta es absolutamente estúpida, y el profesor nos dijo que debe ser auto-compilable (debería poder compilarse por sí mismo), por lo que no quiso usar bibliotecas como Boost y STL.
Tampoco quiere que usemos plantillas porque es difícil de implementar.
La pregunta es: ¿es real para mí, ya que voy a escribir este proyecto por mi cuenta, con la fecha límite a fines de mayo, mediados de junio (este año), para implementar no solo plantillas, sino también anidados? Clases, espacios de nombres, tablas de funciones virtuales en el nivel de análisis de sintaxis?
PS no soy noobie en C ++

¿Fue útil?

Solución

Apégate a hacer un compilador de C.

Créeme, ya es bastante difícil construir un compilador de C decente, especialmente si se espera que se compile. Tratar de admitir todas las funciones de C ++ como clases y plantillas anidadas te volverá loco. Quizás un grupo podría hacerlo, pero por su cuenta, creo que un compilador de C es más que suficiente para hacerlo.

Si no tiene nada que ver con esto, al menos implemente primero un lenguaje tipo C (para que tenga algo que entregar). Luego enfócate en presumir.

Otros consejos

" La tarea exacta es absolutamente estúpida " - No creo que estés en posición de hacer ese juicio de manera justa. Mejor descartar esa vista.

" Voy a escribir este proyecto por mi cuenta " - Dijiste que es un proyecto grupal. ¿Está diciendo que su grupo no quiere aceptar su opinión de que debería transformarse en C ++, por lo que está despegando y trabajando por su cuenta? Hay otro bit que recomendaría cambiar.

No importa qué tan informado esté sobre C ++. Tu habilidad con las gramáticas, analizadores, lexers, AST y generación de código parece mucho más pertinente.

Sin saber más sobre usted o la tarea, diría que le iría bien que la tarea original se realice a finales de mayo. Eso es tres meses de distancia. Se adhieren a la tarea. Podría sorprenderte con su dificultad.

Si terminas temprano y cumples con tu obligación para con tu equipo, diría que deberías sentirte libre de modificar lo que se produce para agregar funciones de C ++.

Apuesto a que Bjarne Stroustrup tardó más de tres meses en agregar objetos a C. No se sobreestime ni subestime la tarea original.

No hay problema. Y mientras estás en eso, ¿por qué no implementar un sistema operativo para que se ejecute también?

Sigue la tarea. ¡Escribe un compilador para un lenguaje C-like ! Lo que haría sería seleccionar un subconjunto de C. Eliminar los tipos de datos de punto flotante y cualquier otra característica que no sea necesaria para construir su compilador.

Escribir un compilador de C es mucho trabajo. No podrás hacer eso en un par de meses. Escribir un compilador de C ++ es una locura total. No podrías hacer eso en 5 años.

Me gustaría enfatizar algunos puntos ya mencionados y dar algunas referencias.

1) STICK AL ESTÁNDAR ANSI C DE 1989 SIN OPTIMIZACIÓN.

2) No se preocupe, esto es factible, con una orientación adecuada, una buena organización y una buena cantidad de trabajo duro.

3) Lea la El lenguaje de programación C para cubrir.

4) Comprenda conceptos importantes del desarrollo del compilador en el Dragon Book .

5) Echa un vistazo a lcc tanto el código como el < a href = "https://rads.stackoverflow.com/amzn/click/com/0805316701" rel = "noreferrer"> libro .

6) Echa un vistazo a Lex and Yacc (o Flex and Bison)

7) Escribir un compilador de C (hasta el punto en que se pueda compilar por sí mismo) es un ritual de paso de pasaje entre los programadores. Disfrútalo.

Para un proyecto de clase, creo que requerir que el compilador sea capaz de compilarse por sí solo es mucho pedir. Supongo que esto es lo que se entiende por estúpido en la pregunta. Esto significa que necesita averiguar por adelantado exactamente la cantidad de C que va a implementar y atenerse a eso en la construcción del compilador. Entonces, construir una tabla de símbolos usando primitivas en lugar de usar un mapa STL. Esto puede ser útil para un curso de estructura de datos, pero pierde el punto para un curso de compilación. Debería tratarse de comprender los problemas relacionados con el compilador y elegir qué estructuras de datos usar, no codificar las estructuras de datos.

Construir un compilador es una manera maravillosa de entender realmente lo que le sucede a tu código una vez que el compilador se apodera de él. ¿Cuál es el idioma de destino? Cuando tomé compiladores, nos llevó a 3 de nosotros todo el semestre construir un compilador para pasar de sorta-pascal a ensamblar. No es una tarea trivial. Es una de esas cosas que parece simple al principio, pero cuanto más te metes en ella, más se complican las cosas.

Debes poder completar el lenguaje c-like dentro del marco de tiempo. Suponiendo que está tomando más de 1 curso, eso es exactamente lo que podría hacer a tiempo. C ++ también es factible, pero con muchas más horas adicionales para ponerlo. Explicar hacer las plantillas / funciones virtuales de c ++ es sobre-esperarte y podrías fallar en la tarea todos juntos. Así que es mejor quedarse con un compilador de subconjuntos c y terminarlo a tiempo. También debe considerar el tiempo que toma para el control de calidad. Si desea ser exhaustivo, el control de calidad también llevará un buen tiempo.

Espacios de nombre o clases anidadas, ya sea que las funciones virtuales están en el nivel de sintaxis bastante simple, solo es una o dos reglas más para analizar. Es mucho más complicado en los niveles más altos, al decidir, qué función / clase elegir (nombre sombreado, nombres ambiguos entre espacios de nombres, etc.), o al compilar en bytecode / running AST. Entonces, puede escribir esto, pero si no es necesario, omítalo y escriba solo un modelo funcional.

Si está hablando de un compilador completo, con generación de código, entonces olvídelo. Si solo tienes la intención de hacer el léxico & amp; Desde el punto de vista del análisis sintáctico, entonces es posible que se pueda hacer algún tipo de plantilla en el marco de tiempo, dependiendo de las herramientas de compilación que utilice.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top