2009-07-27 18 views
5

He oído hablar de algunos compiladores que convierten el código en un lenguaje de alto nivel en otro
, por ejemplo Shedskin, que convierte el código python en C++ optimizado.
Me preguntaba por qué alguna vez intentaría hacer eso. ¿Por qué no escribir directamente en el idioma deseado?¿Por qué convertir código en un idioma a otro?

La única razón por la que podía pensar era compilar idiomas como C/C++ son mejores que los interpretados en cuanto a rendimiento.

Cualquier idea adicional es bienvenida.

Respuesta

3

A menudo es útil convertir una parte de una base de código en un idioma diferente si desea reutilizar ese código en otro proyecto.

Por ejemplo, supongamos que tiene una aplicación de Python que utiliza algunas prácticas funciones de utilidad. Más tarde, está escribiendo una aplicación C++ y necesita esa misma funcionalidad.

Tiene dos opciones: utilizar alguna forma de puente para llamar al código python de C++ (que a veces puede ser torpe, aunque es posible) o reescribir la rutina en C++. Las herramientas de traducción pueden simplificar la segunda opción.

+0

sí ..eso tiene sentido :) – sud03r

2

No solo por cuestiones de rendimiento, sino también por conjuntos de habilidades: a veces es más rápido pasar por código ligeramente alterado en el idioma principal de un equipo que aprender el idioma de origen y editarlo debido a limitaciones de tiempo.

0

Se supone que los idiomas de alto nivel son más fáciles de escribir. Incluso un compilador de C++ es una herramienta para convertir un idioma (C++) en otro (código de objeto)

+0

por "idiomas" quise decir "idiomas de alto nivel" – sud03r

0

Esto se debe a que el idioma "interpretado" es de nivel superior. Normalmente, esto significa que se tiene en cuenta gran parte del código difícil o repetitivo que debe escribir, lo que le permite concentrarse más en el problema y menos en el funcionamiento real del lenguaje o compilador.

Otras situaciones como Java o .NET compilan a sus diversos formatos de código de bytes que son entonces o bien interpretadas por una máquina virtual o JIT (Just In Time) compilado a código máquina. Esto hace que el bytecode compilado sea más portátil, de modo que se puede ejecutar en cualquier lugar donde exista la máquina virtual o el compilador JIT, independientemente de la plataforma.

13

Bueno, si lo piensas bien, cualquier compilador se convierte a otro idioma: código de máquina.

Si opta por ese argumento, cualquier cosa que no sea el ensamblaje no tiene sentido. (En realidad, el montaje también lo sería. Los hombres de verdad escriben códigos de operación hexadecimales a mano)

Utilizarías un idioma para convertir a otro si desea escribir desde una perspectiva de nivel superior o si está más cómodo en un idioma que en otro .

Por ejemplo, ¿preferiría escribir y depurar unos pocos cientos de líneas de código de red en un idioma o usar 5-10 líneas en otro idioma?

+1

+1: C es (efectivamente) un lenguaje ensamblador moderno y portátil. Compila a C y luego deja que el compilador de C maneje el resto. Eiffel hizo esto desde el principio. –

+5

¿Usaste hex? Los hombres reales dirigen los electrones por la fuerza de voluntad. –

+0

Propably una de las principales razones de la falta de popularidad de Eiffel, en mi humilde opinión. Este era un enfoque correcto desde tiempos atrás, pero no hoy en día: el rendimiento alcanzado es demasiado grande. –

0

La única buena razón para convertir el código de trabajo a otro idioma es que la plataforma de destino no es compatible con cualquier compilador para el lenguaje nativo. Si esa no es tu situación, entonces es algo estúpido de hacer.

Lo que debe tener en cuenta es que las características del idioma no se superponen perfectamente. Entonces va a tener que haber algo de recodificación. Eso es trabajo

Va a tener que invertir lote de esfuerzo, quizás equivalente a% 50-% 75 del esfuerzo de reescritura desde cero. Al final de todo esto, tendrá algo que solo funciona tan bien como lo que ya tenía trabajando de forma gratuita. Además de cualquier nuevo error que hayas introducido.

2

Otra razón válida para convertir código es para actualizarlo. Por ejemplo, tenemos una aplicación de 10 años escrita en Delphi, y una gran parte de ella se necesitará en C# en una actualización que estamos a punto de comenzar. En lugar de volver a escribir el código en C#, simplemente convertimos la aplicación completa, realizamos las actualizaciones, y tenemos una aplicación nueva en aproximadamente 6 meses en comparación con los dos años que llevaría volver a escribir.

3

Una ventaja es que le permite prototipar sus aplicaciones en un lenguaje dinámico, y luego optimizarlas en un lenguaje compilado estáticamente. Esto le permite enfocarse en el algoritmo en un lenguaje muy permisivo como Python, y luego compilar en un lenguaje estáticamente tipado como C++ cuando le interesan la velocidad y la seguridad de tipo.

La otra ventaja de herramientas como esta es que permite la traducción del código heredado a idiomas más modernos. He usado f2c en el pasado para convertir algunos viejos proyectos de Fortran en C, y aunque no era perfecto, resolvió muchos problemas simples y repetitivos que no quería resolver yo mismo.

+0

Sí, pero argumentaré que f2c es parte de un compilador Fortran . Miré la salida C, y seguro que no tradujo un programa Fortran a un programa C inteligible. –

+0

@David: ese es un problema con la compilación en general. Puede compilar entre casi dos idiomas, pero no hay garantía de que la compilación genere código eficiente o legible. –

2

Aunque esto puede no estar en la parte superior de su lista de prioridades, personalmente consideraría hacerlo para familiarizarse con un nuevo idioma (ya sea en un nivel superior o no desde el idioma de origen).

Leer 'El programador pragmático' ofrece un buen razonamiento detrás de esto. Aprender un nuevo idioma de vez en cuando le da una buena comprensión de otros aspectos de nuestro campo.

¡Muy útil!

0

Algunos idiomas se escribieron para un propósito específico en mente. Erlang, por ejemplo, fue escrito específicamente para ser multihilo y resistente a los choques. El desarrollador de CouchDB dijo que comenzó su proyecto en C++, pero luego cambió a Erlang, ya que se ajustaba mejor a su modelo de programación.

Los lenguajes de máquina virtual como .NET/C# son lenguajes de uso más general, y muy adecuados para programadores que solo desean hacer el trabajo. Las redes de seguridad incorporadas ayudan a proteger de problemas comunes. No hay necesidad de preocuparse por cosas como los ataques de desbordamiento de búfer, ya que los problemas de seguridad generalmente son atendidos por la VM.

C++ es rápido, pero requiere más trabajo.

0

Una razón para ir de un idioma a otro (Python -> C++) es un problema de optimización. Al compilar al código nativo, se deshace de cualquier interprittation o JIT'ing step. Eso normalmente podría ocurrir con Python; también eliminaría cualquier dependencia de tener Python instalado localmente en una máquina.

Además, el programa ahora puede hacer uso de las capacidades de optimización del compilador de destino. He oído que esto es bastante común al escribir un compilador simple; pasar del lenguaje "agradable" a un lenguaje intermedio con un compilador optimizador.

Y, por último, como han dicho otros, la razón de usar Python sobre C++ es porque debería ser más fácil trabajar; de Epigrams in Programming, "Un lenguaje de programación es de bajo nivel cuando sus programas requieren atención a lo irrelevante".

Cuestiones relacionadas