通过LLVM从C ++应用程序移植到Java是否可行


9

使用LLVM(我猜是LLJVM)将C ++应用程序移植到Java字节码的可行性如何?

事实是,我们目前有一个用C ++编写的过程,但是新的客户端已经强制要求能够使用显然没有任何本地代码(没有JNI)的Java虚拟机以多平台方式运行该程序。这个想法是要能够将生成的jar并复制然后复制到不同的系统(Linux,Win,32位-64位),它应该可以正常工作。

环顾四周似乎可以将C ++编译为LLVM IR代码,然后将该代码编译为Java字节码。不需要所生成的代码是可读的。

我已经使用emscripten对类似的东西进行了一些测试,这需要C ++代码并将其编译为JavaScript。结果是有效的JS,但完全不可读(看起来像assambler)。

  • 是否有人使用此技术将应用程序从C ++移植到Java字节码?
  • 我们可能面对什么问题?
  • 生产代码是否有效?

在发表一些评论后,为了更清楚地表明我的观点,也许端口没有被很好地使用,因此我不希望可读的源代码只是Java字节码,因此它不再是将要开发的“端口”,只是目标平台必须是Java JVM,而不是本机。

注意:我知道目前我们有一些非标准C ++和关闭源代码库,我们正在寻求删除此非标准代码和所有关闭源代码库,并使用Free Libre开源软件,因此,假设所有代码均为标准C ++代码,所有代码在编译时可用。

注意2:不能编写可移植的C ++代码然后将其编译到所需的目标平台,因为编译后的程序必须是多平台的,因此要使用JVM。

注意3:现在我们不在研究适用于Python或其他语言库的类似解决方案,但我也想听听它。我的意思是我们的目标可执行文件必须是java字节码,但是如果有一些选项可以将C ++编译为有效的python编译代码,我也想听听它们。


不确定您关于Python的最后一句话的意思,但Jython完全相同:使用JVM而不是Python VM,并且在这种情况下使用:程序员想要使用Python,部署必须在JVM上。
哈维尔2013年

我们在谈论几行代码?可能值得您花时间重写它,但这并不是一个简单的决定。另外,如果您的代码执行任何指针算术运算,我很想知道在JVM上如何处理该指针。
维·莫里森

1
调试应该很有趣O_o
Daniel Gratzer

@LeviMorrison。很好的代码是相当广泛的(用于通信,通用功能的各种库依赖项),但是假设我们在编译时就可以获得所有代码。而且,如果另一个客户端不需要它,我们仍将生成本机二进制文件。
哈维尔先生

@jozefg。关于有针对性的指针算术和调试,我不希望它是可调试的。例如,Emscripten做同样的事情,但目标语言是Javascript,您只以一个大字节数组作为堆,对程序计数器进行按位操作,而只进行了无对象,字符串之类的字节操作。我期望结果类似于Java字节码中的assamblear,可以认为它是不可调试的。
哈维尔先生

Answers:


11

我真的怀疑这是否行得通。您也许可以将代码转换为Java字节代码,但不会神奇地将库调用转换为对Java运行时和库的等效调用。甚至可能没有等效的Java运行时调用!即使您消除了所有专有库,您仍然拥有C ++标准库。

具体来说:您的C ++程序可能包含对fprintf()的调用。该函数在C标准库中实现,对于C ++程序调用它是完全合法的。从LLVM到LLJVM的转换程序可能不会神奇地找出Java运行时调用的顺序,该顺序将产生与fprintf()等效的结果并替换为这些结果。要提供该功能,实际上需要在Java中重新实现C和C ++运行时字节码。

一些工具可以执行C ++到Java的转换,但是它们只能转换少数几个较简单的运行时库调用。其余的留给您找出。


我明白您的意思,但据我所知emscripten与目标Javascript做了类似的事情,如果我没有误解emscripten提供了一个自定义标准库,以避免您指出(甚至通过SDL库为webGL映射) )。但是我找不到Java的等效语言(LLJVM似乎已被放弃)。我正在考虑将llvm字节码建议为独立于平台的版本(当然,根据平台,通过API或数据,没有编译分支;使用apr或类似的方式)
Javier Mr

3
lljvm提供了一个C运行时库,部分作为C编译为JVM字节码,部分作为Java类。这是一个非常完整的libc。您将需要为libstdc ++创建等效项。另外,lljvm后端目前实际上并不支持C ++。我一直在尝试修复lljvm以与更新的llvm构建一起使用。由于llvm API和工具在各个发行版之间变化很大,因此进展缓慢。您可以在这里继续使用,现在几乎可以使用了。github.com/hyc/lljvm/tree/llvm3.3
hyc 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.