2009-02-17 23 views
45

Siempre me pregunté si sería posible crear un convertidor de Java a C++.¿Existe un convertidor/herramienta Java to C++?

¿Quizás una herramienta que convierta la sintaxis de Java a la sintaxis de C++?

Soy consciente de que las lenguas son diferentes, pero las cosas simples como bucles en la semántica de los partidos 1 a 1.

¿Hay una herramienta de este tipo? ¿O es posible hacer uno?

+8

Es una buena pregunta. Siempre me he preguntado: ¿por qué traducimos automáticamente los lenguajes naturales complejos (http://translate.google.com/translate_t), pero no traducimos automáticamente entre los lenguajes de programación restringidos y mucho más simples? – Frank

+20

Una razón, por supuesto, es que no se toleran errores al traducir entre lenguajes de programación, mientras que los humanos son más flexibles y entienden la traducción de todos modos, incluso si contiene errores. – Frank

+0

Algunos intentos: [ONE] (http://tech.novosoft-us.com/product_c2j.jsp) y [TWO] (http://www.soften.ktu.lt/~stonis/c2java/index.html) para hacer un convertidor de C a Java. – Lazer

Respuesta

22

Es posible hacer cualquier cosa con tiempo, dinero y recursos suficientes. ¿Es práctico? Más allá de ejemplos triviales en realidad no. O más bien depende de lo que constituye una tasa de error aceptable.

El problema real es que las expresiones idiomáticas son diferentes en Java a C++. Java a C#, por ejemplo, en realidad sería mucho más fácil (porque los modismos son mucho más similares). El más grande, por supuesto, es que C++ tiene destructores y memoria administrada manualmente. Java usa finalmente bloques para este tipo de comportamiento y tiene recolección de basura.

También Java tiene un supertipo de objeto común. C++ no.

Los genéricos de las plantillas serían casi imposibles, me imagino.

+10

Common Object no es un problema. El convertidor solo proporciona uno y luego cualquier clase sin una clase base solo agrega la herencia. Los genéricos en Java son solo azúcar sintáctico y las plantillas de C++ podrían manejarlo sin problemas. Ir por el otro lado sería imposible sin embargo. –

+0

En general, estoy de acuerdo en que los modismos simplemente no coinciden. Escribir C++ no se hace de la misma manera. –

+0

El objeto común sigue siendo un problema. Las colecciones se basan en eso (particularmente con genéricos). La idea es que puedes insertar cualquier cosa. Equiparar ese tipo de cosas con contenedores STL no es exactamente 1: 1. – cletus

7

Es posible, no hay duda, pero no será tan simple. Sería un compilador de Java que genera C++.

Si quieres hacer eso desde cero, será muy difícil, tienes que hacer todo el trabajo que javac y JVM hacen por ti (por ejemplo, recolección de basura).

BTW. Google tiene un compilador Java a JavaScript (incluido en GWT)

+0

Afortunadamente, ya hay varias soluciones para GC, genéricos, etc. en C++ que podrían reutilizarse fácilmente. – peterh

+0

motor de juego de unidad tiene un convertidor IL (C#) a cpp. No debería ser demasiado difícil hacer bytecode java a cpp –

2

Existen programas que afirman que pueden hacerlo, pero ninguno ha ganado suficiente popularidad como para mencionarlo con frecuencia, por lo que los dejaremos en "intentos". Hacer un convertidor requeriría una gran cantidad de inteligencia artificial integrada en su programa. La dificultad aumenta diez veces cuando se trata de swing, ya que GTK/wxWidgets/Qt/win32 API difieren mucho de swing. Pero es posible. No es que la calidad del código sea excelente y no hay garantías de que su programa no se bloquee debido a métodos separados de manejo de memoria, pero es posible.

3

Como dije, sería difícil convertir Java a C++, pero podemos tener una aplicación o herramienta que genere código en Java y código C++ de Equivalnet.

Conozco una aplicación que genera código en C++/Java/C# dado un modelo que tiene su propia manera de definirlo.

Esa herramienta pertenece a CA y su nombre es CA Plex. Buscar en www.ca.com

2

Algo ordenada sería una herramienta, que se traducen java a "C++ utilizando la API de Java" (como GNU GCJ CNI), siendo uno de los problemas es la gestión de array.length (matriz no vector) .. .

+1

'std :: vector v; v.length() '? –

2

El problema principal es que java es un lenguaje que está escrito y diseñado para hablar con una máquina virtual. Supongo que sería posible, pero todo lo que quedará es una aplicación muy pobremente optimizada con una capa de auto traducción que hace lo que la VM ya hace. Quiero decir, seguro, es posible, todavía no sería una solución para cualquier cosa que pudiera pensar. Si buscas hacer que tu lenta aplicación java sea nativa, tal vez tu forma de pensar es demasiado difícil, simplemente utiliza una aplicación como JET, en realidad es bastante buena, y te dará los beneficios que una aplicación nativa podría traer. Por supuesto, si la VM ya está haciendo lo que la aplicación le está pidiendo que haga tan bien como podría hacerlo el código nativo (sucede ... a veces: P) podría no cambiar nada.

Java a C#, sin embargo, suena más razonable, ya que ambos idiomas están escritos de manera similar, hablando con un marco como tal, pero esto dejaría el código muy desoptimizado ya que el código escrito desde cero para un marco particular puede no ser superado

2

Java to C sería en realidad el más fácil. Recuerde que necesita convertir el idioma. Si lo hace, el compilador nuevo puede convertir las bibliotecas necesarias. En otras palabras, Swing y AWT no deberían ser un gran problema ...

Comenzaría echando un buen vistazo a la interfaz Java Native Interface (JNI). El JNI es una parte de Java que permite su uso con C y C++. La razón por la que comenzaría aquí es que se vuelve bastante obvio cómo partes de Java pueden implementarse en C. Una vez comprendí las estructuras básicas, como cómo se pueden mapear los objetos Java en estructuras C (struct) y cómo casi todo en Java es un objeto que incluye matrices; podría echar un vistazo al código fuente de Open JDK.

El convertidor real tendría que convertir todas las bibliotecas Java importadas (y sus bibliotecas importadas y así sucesivamente ...) lo que significa que necesitaría el código fuente para todo. Esta conversión no es una tarea pequeña ya que las bibliotecas de Java son grandes.

El proceso llevaría mucho tiempo, pero no debería requerirse AI. Sin embargo, no veo ninguna razón para realizar una conversión como esta. Pierde la portabilidad de Java y no obtendría la eficiencia de C (excepto que se compilaría con código nativo, pero sería mejor compilar el código de máquina directamente desde Java).

10

El Firefox HTML5 parser is written in Java and converted to C++. Pero creo que el convertidor utilizado allí es bastante específico para este proyecto. Curiosamente, resultó que el analizador de C++ resultante era más rápido que el analizador antiguo escrito en C++.

También estoy escribiendo un convertidor como parte de H2 database, en src/tools/org/h2/java. La idea es permitir la conversión de un subconjunto de la base de datos H2 a C++, por lo que este tampoco es un traductor de propósito general.

Y está el proyecto de código abierto J2C.

Así que hay formas de convertir Java a C++. Pero no espere que el traductor admita todas las características, y no espere que el código resultante sea más rápido que una buena Java JVM.

+0

¿Tiene algún artículo de blog sobre la conversión de H2 a C++ o algo así (es interesante cómo se le ocurrió esta idea y qué problemas encontró)? –

+0

No escribo muchos artículos de blog ... Escribí el convertidor para comprobar si la versión C++ sería más rápida que una JVM en una Raspberry Pi (ya que las JVM disponibles para esta plataforma, Cacao y Zero VM, no son tan rápidas y necesita mucha memoria). Descubrí que es un poco más rápido y necesita menos memoria. La versión de C++ es un poco más lenta en una computadora "normal" (como esperaba). El estado actual es: se pueden convertir aplicaciones de demostración muy simples. Actualmente no estoy trabajando en el convertidor, pero tal vez continuaré en el futuro. –