2011-04-18 11 views
11

Estoy buscando una manera de tener que escribir y mantener un cierto algoritmo (un submódulo de representación gráfica de mi código, en realidad) solo una vez. Necesito el algoritmo en C++, PHP y Javascript. Teóricamente podría escribirlo en C++ y envolverlo en una extensión PHP; pero eso tiene muchos problemas en sí mismo y no resuelve el enlace de Javascript.Meta programación en varios idiomas de salida

Lo que estoy buscando, creo, es una herramienta que convierte de un idioma (no importa cuál) a los tres (o dos, si el idioma de origen es uno de los tres) idiomas de salida I estoy apuntando Encontré MetaL (http://www.meta-language.net/) que parece hacer lo que quiero, pero también se ve como muerto (no hay actualizaciones desde 2007) y solo se dirige a uno de los tres idiomas que necesito. Necesita ser bastante flexible y permitirme actualizar los resultados, por ejemplo, uso Cairo en mi representación en C++ y PHP, y HTML Canvas en el lado de Javascript. Entonces necesito personalizar la API para ciertos efectos.

Como alternativa, me conformaría con un analizador y un analizador de PHP que me daría un AST con suficiente información para escribir generadores para C++ y Javascript como un back-end alternativo.

¿Alguna idea? Gracias.

+1

Su pregunta me recordó la cita anterior: _Algunas personas, cuando se enfrentan con un problema, piensan "I Sé, usaré expresiones regulares ". Ahora tienen dos problemas. Entiendo su voluntad de centralizar el mantenimiento, pero me parece que está tomando un problema algo molesto pero razonable y lo convierte en un problema MUY complicado. (Estoy pensando en la compilación automática, los problemas con el motor de traducción y el infierno de depuración que está a punto de ingresar) Piense en el pobre que tiene que mantener esta solución después de que se haya mudado .. – NightDweller

+0

If está hablando de como mucho miles de líneas de código, sería mejor que diseñara la API cuidadosamente y simplemente las recodifique. La generación automática de código para todas las cosas raras que uno encuentra en un lenguaje (por ejemplo, para C++: clases, herencias múltiples, espacios de nombres, declaración/definición separada, macros, plantillas, sobrecargas, ...) es una gran tarea y no es vale la pena el esfuerzo por unos pocos miles de líneas. Si desea generar 100K SLOC, bien valdría la pena el esfuerzo, o si compuso fragmentos de código de manera arbitraria. Pero 3 copias de un algoritmo fijo? No creas que vale la pena el problema. –

+0

Puedo permitirme restringirme a un subconjunto mucho más pequeño de un idioma para escribir esto. Obviamente no necesito traducir todos los matices de C++ a varios idiomas. La representación es 90% 'calcular la ubicación del píxel, rectángulo o círculo, calcular el color de la misma, llamar a la función API de dibujo'. No tiene que ser de propósito general. De todos modos, parece que HaXe hará lo que necesito. – Roel

Respuesta

5

Puede echar un vistazo a haXe. haXe es un lenguaje de programación de código abierto. podría compilarse en JavaScript, Flash/ActionScript, php5, C++, y en el futuro Java, C#.

+0

Aha muy bien, gracias, no había encontrado eso en mi Google. – Roel

1

¿Quizás busque en 'codificación' su algoritmo original en xml y utilizando varias plantillas xslt para enviar a sus idiomas de destino? O posiblemente antlr (http://www.antlr.org/ http://www.amazon.com/Definitive-Antlr-Reference-Domain-Specific-Programmers/dp/0978739256/ref=sr_1_1?s=books&ie=UTF8&qid=1303114884&sr=1-1).

+0

Sí, eso es más o menos lo que MetaL intentó hacer, creo, sin el xslt de lo que puedo decir. No he tenido muchas buenas experiencias con xslt, así que me voy a saltear eso, pero tal vez pueda hacer algunas otras transformaciones de código xml-> fáciles ... Gracias. – Roel

2

El proyecto emscripten (que yo sólo vi la semana pasada) podría interesarle: http://syntensity.blogspot.com/2011/04/emscripten-10.html

Este tipo básicamente ha escrito un compilador para C/C++ que compila a código Javascript.

Eso debería resolver el lado Javascript de su problema.

Espero que ayude.

Otro producto en la misma línea, y un poco más conocido es Google Web Toolkit (GWT). Está basado en Java, pero el resultado final es similar: escribes tu aplicación web en código Java y compila las partes frontales en Javascript y las partes de back-end en bytecode de Java. Sé que no estás pidiendo Java, pero si te interesa, el enlace está aquí: http://code.google.com/webtoolkit/

Un poco menos útil, pero posiblemente más relevante para tu pregunta es PHPJS. Este es un proyecto para implementar la mayor cantidad posible de lenguaje PHP en Javascript. Lo están haciendo función por función, por lo que solo será una aproximación, pero dado que las sintaxis del lenguaje son similares, es posible usarlo para escribir código que funcione sin cambios en PHP nativo y también en Javascript en el lado del cliente.

Por supuesto, el único gran inconveniente de compilar un idioma en otro es que el código resultante siempre será subóptimo. No hay mucho que pueda hacer al respecto, pero vale la pena tenerlo en cuenta antes de comenzar a escribir una base de código compartida en un solo idioma.

+0

Gracias, Emscripten parece muy relevante. Supongo que si tiene un back-end de javascript, un back-end PHP no debería ser tan difícil, especialmente porque solo necesito un subconjunto muy limitado de construcciones de lenguaje. – Roel

1

Tal vez puedas simplemente escribirlo en javascript y luego utilizar un intérprete de JavaScript C++ y PHP.

+0

idea interesante, gracias. – Roel

+0

@Roel: "Rendering" suele ser computacionalmente intenso. Crear una capa de intérpretes para hacer esto frente a una tarea computacionalmente intensa no me parece una buena idea. –

+0

En mi caso, no importa. Vale la pena el intercambio. – Roel

-1

Un enfoque completamente diferente sería usar código de ensamblado. Escriba el algoritmo en un idioma de su elección, compílelo en la fuente de ASM.A continuación, proporcione los contenedores de interfaz en los idiomas de implementación.

Por supuesto, esto es todo tanto 'air pie'. Depende de tantas variables, cantidad de plataformas de destino, importancia de la optimización, frecuencia del cambio de interfaz relacionado con el cambio de implementación, etc.

Cuestiones relacionadas