自动Java到C ++转换

时间:2009-07-08 07:33:23

标签: java c++ code-translation

有没有人尝试过自动Java到C ++转换以提高速度?从长远来看,这是一场维护噩梦吗? 刚读过,用于在Gecko http://ejohn.org/blog/html-5-parsing/

中生成HTML5解析引擎

7 个答案:

答案 0 :(得分:17)

通常,从一种语言到另一种语言的自动转换不会有任何改进。不同的语言有不同的习语会影响表现。

最简单的例子是循环和变量创建。在Java GC世界中,使用new创建对象几乎是免费的,并且它们也很容易被遗忘。在C ++中,内存分配(一般来说)很昂贵:

// Sample java code
for ( int i = 0; i < 10000000; ++i )
{
   String str = new String( "hi" ); // new is free, GC is almost free for young objects
}

直接转换为C ++会导致性能不佳(使用TR1 shared_ptr作为内存处理程序而不是GC):

for ( int i = 0; i < 10000000; ++i )
{
   std::shared_ptr< std::string > str( new std::string( "hi" ) );
}

用C ++编写的等效循环将是:

for ( int i = 0; i < 10000000; ++i )
{
   std::string str( "hi" );
}

从一种语言到另一种语言的直接翻译通常以两个世界中最糟糕的方式结束,并且难以维护代码。

答案 1 :(得分:0)

转换的积极意义在于,您需要一个适当的面向对象设计才能从Java切换到C ++(范式交集)。

然而有些人说,与java代码相比,编码C ++并没有带来速度提升。

答案 2 :(得分:0)

即使这样有效,我也不确定你会看到很多提速。 Java的Hotspot JIT编译器已经变得非常好。

答案 3 :(得分:0)

这种类型的转换壳几乎不可能带来更好的性能。通常在JVM工作时,它会将大部分代码转换为本机代码。你的建议是将Jave代码转换为C ++并从那里转换为本机机器代码,即添加一个额外的阶段。 然而,有一些微不足道的案例,由于以下事实可能会获得一些收益:

1)从头开始加载JVM需要一些时间。

2)执行Jit需要一些时间,在运行非常短的程序时,很多时候,您可能更喜欢在运行之前浪费这段时间。

3)如果您没有在服务器模式下运行,则可能无法在Java上获得相同级别的机器代码。 (在服务器模式下,您需要获得顶级机器代码,并且最适合在运行时检测到的自己的CPU,这通常缺少大多数程序的C / C ++植入,还有机器代码在运行时优化)

答案 4 :(得分:0)

通过程序手动内存管理替换Java的自动内存管理几乎是不可能的。因此,您最有可能最终得到一个程序,它有内存泄漏或使用C ++ - 使用垃圾收集器的代码。但是Java中的垃圾收集器还有很多东西需要依赖(例如没有指针算法,etics),所以C ++中的垃圾收集器是安全的,它的性能会降低。因此,您的自动转换很可能会降低性能。

而是尝试手动将其移植到C ++或优化Java代码。

答案 5 :(得分:0)

这些语言在使用上有不同的风格,无意识的转换几乎没用。由于使用的风格不同,智能转换器可能会无法编写。

一些问题领域:

  • 资源分配由Java中的'try {} finally {}'块控制,而C ++使用RAII。
  • Java在编译时C ++运行时执行异常检查。
  • 异常处理方式不同。两个例外:
    • 在Java中(传播最后一次)
    • 在C ++应用程序中终止。
  • Java有一个庞大的标准库
    C ++具有你需要在网上找到的所有相同功能[这很痛苦]。
  • Java使用指针来处理所有事情。
    • 直接不假思索的转换将为您提供一个只包含shared_ptr对象的程序。

无论如何使用JIT编译Java在速度上与C ++相当。

答案 6 :(得分:0)

一般来说,对于这样的转换器,不能指望它们生成可维护或高性能的代码,因为这些代码通常需要具有理解编写代码的语言的实际人员。它们非常有用的是使端口语言变得容易。例如,任何带有C转换器的语言都可以在各种语言上快速实现。我在90年代中期使用f2c在Macintosh上运行Fortran例程。

如果在C ++中重写代码,则可能会或可能不会提高性能。如果你使用自动转换器,你可能会放慢速度。