2009-02-25 12 views
6

He trabajado en una serie de productos que hacen uso de la generación de código. Parece ser la única forma de lograr tanto un alto grado de personalización del usuario como una alta velocidad de ejecución.Al generar código, ¿qué lenguaje debe generar?

El inconveniente es que estamos exigiendo a los usuarios que instalen un compilador (principalmente en MS Windows).

Esto ha sido un dolor de cabeza constante, porque los proveedores como MS mantienen compiladores obsoletos, y algunos usuarios tienden a tener más de un compilador instalado.

Estamos considerando utilizar GNU C, y posiblemente C++, pero incluso allí, hay problemas de versiones continuas.

He considerado la posibilidad de generar lenguaje ensamblador, en un esfuerzo por salir de la compilación-versión-cinta, pero los lenguajes de ensamblaje son todos específicos de la máquina.

Idealmente, habría alguna manera de generar código generado que fuera flexible, rápido y no nos expondría a los caprichos de proveedores externos.

Tal vez estoy pasando por alto algo simple, como Java. Cualquier idea sería apreciada. Gracias.

Respuesta

8

Si está considerando C e incluso ensamblador, echar un vistazo a LLVM primera: http://llvm.org

+0

Eso se ve interesante. Gracias por el enlace. –

+0

Lo estoy usando en un proyecto ahora (http://code.roadsend.com/rphp). Tiene una buena API, licencia liberal, se dirige a muchas plataformas y se optimiza mucho. –

3

puede ser que falte un poco de contexto aquí, pero ¿podrías fijar a sí mismo a una versión específica? Por ejemplo, .NET 2.0 se puede instalar junto con .NET 1.1 y .NET 3.5, así como otras versiones que saldrán en el futuro. Entonces, siempre que su código haga uso de una versión específica de un compilador, ¿cuál es el problema?

+0

Es una buena sugerencia, además de ser específica de Windows. Lo consideraré. –

+0

Idealmente, no estaría limitado por Windows, y se podría confiar en que funcionará entre 10 y 15 años a partir de ahora. –

+0

Sí, pero también podría apuntar a algo como C# 1.0.Eso debería ser compatible y compatible con otras plataformas a través del proyecto Mono. – dhable

2

Una opción sería utilizar un idioma/entorno que proporcione acceso al compilador en el código; Por ejemplo, here is a C# example.

+0

Gracias. Eso se ve bien, pero me pregunto sobre su longevidad y/o independencia de la plataforma. –

+0

No creo que la longevidad sea una preocupación; Siempre que su aplicación se pueda ejecutar en la máquina cliente, la generación de código debería funcionar (ya que ambas dependen del mismo marco). La dependencia de la plataforma dependerá de su idioma; Para C#, puede buscar en Mono (implementación de .NET de fuente abierta). –

+0

Muy útil. Lo comprobaré. –

3

He considerado la posible generación de lenguaje ensamblador, en un esfuerzo por salir de la compilación-versión-cinta, pero los lenguajes de ensamblaje son todos específicos de la máquina.

que se llamaría un compilador :)

¿Por qué no te quedas a C90?

No he escuchado muchas violaciones graves de las normas del lado gcc, si no utiliza extensiones.

Y siempre puede distribuir una cierta versión de gcc junto con su producto, por ejemplo, 4.3.2, dando a los usuarios la opción de utilizar su propio compilador bajo su propia responsabilidad.

Siempre que genere todos los códigos (es decir, no incruste sus instrucciones en el código de los demás), no debería haber ningún problema al probar esta versión y utilizarla para compilar sus bibliotecas.

+0

Eso es a lo que nos estamos inclinando. Me pregunto si las personas han tenido experiencias similares. –

+0

Pro * C se adhiere a C90 y funciona bajo todo lo que he visto desde 1996: Borland C, Visual C, gcc, etc. – Quassnoi

+0

Pro * C es un precompilador de EmbeddedSQL para Oracle, en caso de que no esté familiarizado con él :) – Quassnoi

2

Por qué no enviar un compilador GNU C con su generador de código? De esta forma no tendrá problemas de versión, y el cliente puede generar código constantemente que se pueda usar.

+0

Eso es lo que estamos considerando. Espero que no haya trampas. –

1

Me limitaría al lenguaje que utiliza para generar ese idioma.Puede generar y compilar código Java en Java, código Python en Python, C# en C# incluso LISP en LISP, etc.

Pero no está claro si tales idiomas son lo suficientemente rápidos para usted. Para la velocidad máxima elegiría generar C++ y usar gcc para la compilación.

+0

Gracias. Estamos considerando gcc. Queremos que sea un compilador/enlazador/bibliotecas que aún se puede instalar y que funcionará años y años a partir de ahora. –

+0

FWIW, algunas implementaciones de Lisp son extremadamente rápidas (como CMU CL). Pueden ser inadecuados por otras razones (como la falta de bibliotecas o una mala integración con el sistema operativo). –

+0

@David: Buena sugerencia. Sin embargo, un poco lejos para este atuendo. –

2

Parece que está buscando LLVM.

+0

Shannon sugirió eso también. Gracias por el consejo. –

1

¿Por qué no utilizar algo como SpiderMonkey o Rhino? (Soporte Javascript en Java o C++). Puede exportar sus objetos a espacios de nombres de JavaScript y sus usuarios no tienen que compilar nada.

+0

Gracias. Estoy obteniendo muchas buenas ideas aquí. –

3

Si desea generar código asm, puede echar un vistazo a asmjit.

1

esto podría ser demasiado tarde. pero aquí están mis dos centavos. inserta un intérprete para un idioma como lua/scheme en tu programa. y generar código en ese idioma.

+0

Gracias. No demasiado tarde. Creo que es una buena idea Un argumento en contra es si el rendimiento es un problema, es mejor generar un lenguaje que pueda ser compilado dinámicamente. Por supuesto, el problema con eso es que mi aplicación no está completa sin ese compilador/vinculador. Siempre he estado buscando un término medio. Pero si el rendimiento no es un problema, me gusta tu idea. –

1

En el espíritu de "puede que no sea demasiado tarde para agregar mis 2 centavos" como en el caso de la respuesta de @ Alvin, aquí hay algo en lo que pensaría: si su aplicación está pensada para durar algunos años, es va a enfrentar varios cambios en cómo funcionan las aplicaciones y los sistemas.

Por ejemplo, supongamos que estaba pensando en esto hace 10 años. Estaba mirando a Dexter en ese momento, pero supongo que en realidad tienes recuerdos de cómo eran las cosas en ese momento. Por lo que puedo decir, el multihilo no era un gran problema para los desarrolladores de 2000, y ahora lo es. Entonces la ley de Moore se rompió para ellos. Antes, a la gente ni siquiera le importaba lo que sucedería en "Y2K".

Hablando de la ley de Moore, los procesadores se están volviendo bastante rápidos, por lo que tal vez ciertas optimizaciones ni siquiera serán necesarias. Y posiblemente la matriz de optimizaciones sea mucho más grande, some processors están recibiendo optimizaciones para varias cosas centradas en el servidor (XML, criptografía, compresión y regex! Estoy sorprendido de que se puedan hacer cosas en un chip) y también gasten menos energía (que es probablemente muy importante para el hardware de guerra ...).

Mi punto es que centrarse en lo que existe hoy como una plataforma para el futuro no es una buena idea. Haga que funcione hoy, y seguramente funcionará mañana (la compatibilidad con versiones anteriores es especialmente valorada por Microsoft, Apple no está mal y parece que Linux es muy liberal para que funcione como usted quiera).

Hay, sí, una cosa que usted puede hacer. Adjunte su tecnología a algo que simplemente no morirá (probablemente), como Javascript. Hablo en serio, las máquinas virtuales Javascript ahora se vuelven terriblemente eficientes y van a mejorar, además a todos les encanta, así que no va a desaparecer repentinamente. Si necesita más características/eficiencia, ¿puede apuntar a la CRL o JVM?

También creo que el multihebra será cada vez más un problema. Tengo la corazonada de que la cantidad de núcleos de procesador tendrá la propia ley de Moore. Y las arquitecturas son más que probables de cambiar, desde el aspecto del zumbido de la nube.

PD: En cualquier caso, creo que las optimizaciones C del pasado siguen siendo bastante válidas en los compiladores modernos.

+0

Aprecio tus puntos de vista (aunque me estás dando una risita :). Hay otra ley: la naturaleza aborrece el vacío. El bueno de Moore nunca superará a los codificadores. Si hay más ciclos para grabar, podrían usarse para una maravilla adicional, pero lo que generalmente sucede es que los programadores los aturden por puro descuido, y no existe un límite fundamental en cuanto a qué tan derrochador puede ser el software. Nunca temas, ninguna cantidad de hilos, núcleos, nubes, magia del compilador, quantums, puede superar a cualquier programador de tonterías promedio. –

+0

... No para darte la impresión de que estoy siendo negativo :-) Hay una habilidad de ajuste del rendimiento que, si la gente realmente lo usa (de lo que hablan pero no lo hacen, realmente), puede eliminar el rendimiento errores, y poner todos esos ciclos maravillosos a * buen * uso: http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773 –

+0

@Mike Bueno, tienes razón en eso, y el código actual que las CPU procesan actualmente está lejos de la eficiencia del código anterior.Me sorprendió que un fabricante de GIF muy antiguo (90) que utilicé recientemente era aproximadamente el doble de rápido y eficiente de memoria que Phtoshop CS3 (en mi caso importaba, porque el GIF tenía ~ 600 fotogramas), así que supongo incluso bases de código como Photoshop no están bien optimizados. En serio, soy relativamente nuevo en programación, y estoy empezando a sentirme un poco como tú con respecto a qué tan lento es el software comparado con lo que podría ser si las compañías (y, por lo tanto, los programadores) quisieran realmente optimizar la velocidad. –

Cuestiones relacionadas