在JVM上运行/解释C语言?

29
有没有一种方法可以在JVM上运行纯C代码?
不是通过JNI连接,而是像你可以通过JRuby运行ruby代码或通过Rhino运行javascript代码那样运行。
如果当前没有解决方案,您会推荐我应该怎么做?
显然,我想尽可能使用多个部分解决方案来实现它。
ANTLR似乎是一个很好的起点,有完整的“ANSI C”语法实现...
我应该使用ANTLR生成的代码构建一个“玩具”虚拟机来覆盖JVM吗?

这很有趣... 试图编写一些可移植的 C 代码? - Carlos Rendon
2
尝试在共同的平台(JVM)上交互不同语言编写的代码。 - amitkaz
我已经很久没有看JVM规范了,但是如果我没记错的话,它试图防止在数据类型转换方面过于快速和松散。如果仍然如此,那么有些C程序将无法在JVM上运行。 - David Thornley
1
不一定。编译器可能会为您插入不可见的数据转换。 - Zan Lynx
4个回答

14

更新于2012年1月26日:根据该公司网站上的此页面,该产品已被收购并不再可用。

是的。

这里有一个商业C编译器,可以生成JVM字节码


2
检查时链接已损坏。 - Audrius Meškauskas
2
是的,根据http://axiomsol.com/ampc-acquired-by-private-company/网页上的内容,该产品已被私人公司收购,不再在市场上销售。 - joel.neely
新链接也坏了。 - neoexpert

12

还有两种其他可能性,都是开源的:

JPC 在JVM中模拟整个x86计算机,能够运行DOS和Linux。

NestedVM 为Java字节码提供二进制翻译。这是通过GCC编译成MIPS二进制文件,然后将其转换为Java类文件来完成的。因此,任何使用GCC支持的C、C++、Fortran或任何其他语言编写的应用程序都可以在100%纯Java中运行,无需更改源代码。


1
截至2013年4月,JPC和NestedVM是有效的解决方案,但速度较慢(因为它们在JavaVM中被模拟)。商业解决方案axiomsol.com已经被出售,其网站上没有更多信息。 - michaelt
关于JPC,它很整洁,但是如何与x86代码交互呢? - KIC

7
似乎LLJVM也能满足您的需求。
LLJVM:源代码首先由像llvm-gcc或clang这样的前端编译为LLVM中间表示(IR)。然后将LLVM IR转换为Jasmin汇编代码,与其他Java类链接,然后组装为JVM字节码。

6
截至2016年,有一个年轻而有前途的选择gcc-bridge。它的目的是利用JVM对R的实现。目标是使用用C或Fortran编写的R库。但gcc-bridge也可以作为常规的maven插件独立使用。另请参见gcc-brigde-example

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接