Translate

domingo, 8 de setembro de 2013

Converter Java para C++

Durante uma pesquisa corriqueira sobre JVMs, me deparei "acidentalmente" com um conversor de códigos em Java para código em C++ bastante interessante chamado J2C.

O J2C segundo o seu site garante a conversão na maior parte das vezes, certamente, códigos complexos como algorítimos utilizadores de ServerSocketChannel, SocketChannel e outras APIs sofisticadas do Java podem não ser de tanta confiança converter somente sem avaliar o comportamento do código em sua versão C++, mas para algorítimos corriqueiros, a conversão é certa e excelente.

Importante: O Java tem a garbage colletor (gc) e faça uma conversão consciente porque não existe coleta automática de objetos em C++.

O IDE dele é o Eclipse, portanto você deve possuir uma versão recente e compatível com JDK6.

O site do projeto J2C está em https://code.google.com/a/eclipselabs.org/p/j2c/.

A partir dele, você deve:

  1. baixar o JAR mais recente do J2C;
  2. após baixar o JAR, copie-o para a pasta $ECLISE_HOME$\dropins;
  3. abra o Eclipse (no meu caso testei no Windows 7 com o Eclipse Juno);
  4. clique sobre algum projeto Java na janela "Package Explorer";
  5. você deve ver uma opção chamada "Translate to C++".

Esta ferramenta exige como você criar um pasta vazia de mesmo nome do seu projeto precedido pela letra "c". Exemplo: Se você tem um projeto chamado "OlaMundo", então deve ter uma pasta paralela e vazia chamada "cOlaMundo".

A classe Java 6 a seguir é simplesmente feita para ser convertida.

HelloWorld em Java 6 antes da conversão

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Olá mundo!");

}

}

HelloWorld em versão C++ após conversão

// Generated from /UmProjetoJava6/src/HelloWorld.java
#include <HelloWorld.hpp>

#include <java/io/PrintStream.hpp>
#include <java/lang/NullPointerException.hpp>
#include <java/lang/String.hpp>
#include <java/lang/System.hpp>

template<typename ComponentType, typename... Bases> struct SubArray;
namespace java
{
    namespace io
    {
typedef ::SubArray< ::java::io::Serializable, ::java::lang::ObjectArray > SerializableArray;
    } // io

    namespace lang
    {
typedef ::SubArray< ::java::lang::CharSequence, ObjectArray > CharSequenceArray;
typedef ::SubArray< ::java::lang::Comparable, ObjectArray > ComparableArray;
typedef ::SubArray< ::java::lang::String, ObjectArray, ::java::io::SerializableArray, ComparableArray, CharSequenceArray > StringArray;
    } // lang
} // java

template<typename T>
static T* npc(T* t)
{
    if(!t) throw new ::java::lang::NullPointerException();
    return t;
}

HelloWorld::HelloWorld(const ::default_init_tag&)
    : super(*static_cast< ::default_init_tag* >(0))
{
    clinit();
}

HelloWorld::HelloWorld()
    : HelloWorld(*static_cast< ::default_init_tag* >(0))
{
    ctor();
}

void HelloWorld::main(::java::lang::StringArray* args)
{
    clinit();
    npc(::java::lang::System::out())->println(u"Olá mundo!"_j);
}

extern java::lang::Class *class_(const char16_t *c, int n);

java::lang::Class* HelloWorld::class_()
{
    static ::java::lang::Class* c = ::class_(u"HelloWorld", 10);
    return c;
}

java::lang::Class* HelloWorld::getClass0()
{
    return class_();
}

É importante deixar claro que apenas mostrei a versão CPP da conversão, mas a ferramenta J2C gera outras classes e protótipos, subpastas para garantir a conversão. Depois basta ter um compilador de sua necessidade do código em C++ para uma plataforma de sua necessidade.

Para maiores informações, consulte a página oficial do projeto.

Espero ter algum oportunidade para utilizá-la em breve.

Nenhum comentário:

Postar um comentário