2011-08-22 15 views
7

Quiero saber cuáles son las estrategias para crear una fuente para el traductor de origen, es decir, la traducción de un lenguaje de alto nivel a otro. Las dos formas que vienen a la mente sonCrear fuente a traductor de origen

1- Cambio de árbol de sintaxis de un idioma a otro idioma árbol de sintaxis 2- Si lo cambia a lenguaje intermedio y luego convertir ese a otro lenguaje de alto nivel

Mi pregunta es que es posible hacer la conversión usando ambas estrategias y que es más factible de hacer, ¿alguien puede dar algunas referencias a cualquier teoría o implementación hecha por algún convertidor como cualquiera de los métodos anteriores? Y si hay algún lenguaje intermedio basado en xml estándar, sé que xmlvm usa xml como lenguaje intermedio pero no proporciona ninguna especificación adecuada del lenguaje intermedio.

+0

Consulte la respuesta de mi SO sobre la traducción entre lenguajes de programación: http://stackoverflow.com/a/3460977/120163. Se trata de herramientas industriales reales para hacer esto, no teoría. –

Respuesta

7

Cualquier compilador es, más o menos, un traductor de fuente a fuente. El idioma de destino puede ser un lenguaje ensamblador (o directamente un lenguaje de código máquina binario), o C, o cualquier lenguaje de alto nivel que desee. Por lo tanto, el general compilers theory es aplicable.

Y solo como un consejo: un lenguaje intermedio normalmente no es suficiente. Usa más Use docenas de idiomas intermedios, cada uno diferente de uno anterior en solo un aspecto minúsculo. De esta forma, cualquier traducción de idioma a idioma no es más que trivial.

Otro consejo (anticipando votos abajo aquí) - aléjate de XML, especialmente como una representación de AST s.

+2

De acuerdo con SK-logic sobre XML. Ver http://stackoverflow.com/a/2831343/120163 para una discusión sobre los (de) méritos de XML como una representación AST. –

0

Los convertidores se basan generalmente en la construcción del árbol semántico de un programa y luego se lo vuelve a dar forma al objetivo PL. Como ejemplo, eche un vistazo al C# to Java convertor.

El segundo enfoque también es posible, pero la organización de su código puede cambiar completamente después de la conversión. Por lo tanto, es mejor mantener la estructura común intermedia (IL, ST, etc.), tan alto como sea posible.

2

Me gustaría ver LLVM, que puede hacer de fuente a fuente. Aunque la salida no es bonita, podría proporcionar algunas buenas ideas.

+1

¿Puede hacer de fuente a fuente para qué idiomas? Creo que LLVM/Clang está bastante integrado en C y C++, y es probable que otros lenguajes sean bastante difíciles. –

+0

@Ira Baxter: LLVM tiene un CBackend, que compila código de bits LLVM a C. LLVM también tiene un proyecto de servidor de JavaScript, llamado emscripten. Entonces, técnicamente, cualquier interfaz que salga a LLVM, puede usar cualquiera de esos backends. Esto no considera proyectos en desarrollo o proyectos que estarán en desarrollo. Las interfaces de ejemplo serían Clang, llvm-lua, llvm-gcc, LDC ... etc. No es una "solución completa", pero si alguien estuviera trabajando en algunas ideas y quisiera ver algún código, sería un lugar para comienzo. – TechZilla

0

¡Prueba Clang! Es poderoso para la traducción fuente-fuente. A partir de ahora es totalmente compatible con C, C++, Objective C y Objective C++. Es posible que también desee consultar la infraestructura del compilador ROSE.

Cuestiones relacionadas