从C源代码到Java字节码?

10

我正在寻找一种将C源代码编译成高性能Java字节码的方法。我已经成功使用了NestedVM,但性能损失对我正在处理的项目来说是不可接受的。我也看到了各种旨在解决这个问题的开源项目和一些商业产品。 这个SO问题涉及将非Java转换为Java源代码的一般问题,但我只想从C转换为Java字节码。

有什么最好的方法可以将C源代码编译成高性能,纯Java字节码?


你在比较性能方面和什么做比较?你是说转换后的C代码在虚拟机中运行比本地C代码慢吗?还是说它比在虚拟机下运行的Java慢?如果是前者,我认为你无法做任何事情(也许可以使用JNI,但这不是你的问题)。 - hhafez
NestedVM 通过在 JVM 之上创建虚拟机来工作。与将 C 源代码直接编译成字节码的方法相比,这会导致显着的开销。 - Rich Apodaca
4个回答

9
作为Cibyl的作者,我可能有点偏见。无论如何,我已经查看了由公理C编译器生成的java字节码,发现它并不高效。NestedVM和Cibyl都通过编译MIPS二进制文件然后将其翻译成Java字节码来工作。令人惊讶的是,它非常高效,主要问题是8和16字节值的内存访问(需要分多步完成)。
NestedVM和Cibyl在性能特征上略有不同,对于整数密集型工作负载,Cibyl通常更快,而NestedVM则更适合处理浮点数和双精度浮点数。这是因为Cibyl使用GCC软浮点支持(虽然使用“真正”的Java字节码浮点指令),而NestedVM则翻译MIPS FPU指令。
Cibyl也更加针对J2ME环境,尽管它也可以在其他平台上使用。我的猜测是,与Axiomatic C编译器相比,你会在其中任何一个上运行得更顺利。

我冒昧在Google Code上链接了Cibyl。希望这个链接是正确的。 - sleske
在经过7年的谷歌搜索后,我很惊讶为什么这个问题没有得到开源社区所需的关注。无论如何,我已将您的精彩项目从关闭的Google Code迁移到了我的GitHub帐户:https://github.com/HorvathAkosPeter/cibyl - peterh
谢谢鼓励的话!不过,我认为Cibyl来得有点晚了,就在智能手机开始流行之前。如果早一年并且有某种J2ME“应用商店”,它可能会引起更多兴趣。无论如何,我不认为它是失败的。我很开心实现它,并用它在我的手机上玩了几个旧的Sierra任务 :-)。早期版本的Waze也使用它进行J2ME和Blackberry(通过一个分支也在Windows手机上)。我还将代码移植到我的github帐户上几年前。 - Simon Kågström

4

虽然不是你要求的内容,但是Cibyl可以将编译好的C程序转换成JVM字节码。这和你提到的NestedVM的思路相同,但由于它是独立实现的,所以可能更快。


3

我相信有些项目已经尝试过这个,但是没有办法在不进行一些严格的限制(基本上它们必须被转换为数组索引并分配数组而不是内存)的情况下处理指针。

如果你的C代码没有太多依赖于指针,并且你想将其转换为JVM,则可以将其转换为Java。这应该很容易,而且性能也不会太差。在大多数方面,C仍然比Java快大约2倍,某些方面甚至更糟糕,在某些方面Java实际上比C快(例如堆内存管理),但与大多数其他语言(至少是解释性语言)相比,Java和C的速度快100倍,因此从这个角度来看,它们之间的差异几乎无意义。


有一个非常重要的区别:我有一个C库(sqlite),我想将其集成到Java项目中,而不会失去平台独立性(因此SNI不可行)。速度对于sqlite来说并不是那么关键。那么该怎么办呢?将库编译为Java .class文件,并将它们集成起来。这是解决方案,在我看来。 - peterh
有没有可能找到一个Java的等效版本?这是同样的东西吗?http://www.tutorialspoint.com/sqlite/index.htm。当你想要平台无关性时,坚持C版本可能不是很好,因为每当你转到不同的架构或想要针对不同的CPU进行优化时,你都必须重新编译或选择不同的库进行链接,而Java版本只需工作,甚至可以重新优化自己的CPU。 - Bill K

1

尝试C2J软件................

在Google中输入“从c到java的翻译器”,你将得到下载链接


由于feroz的提醒,我想起了C2J,看起来它是GPL许可证(至少在测试期间 - 从……2001年开始?)。不确定它是否采用了NestedVM类型的方法或其他方法。也许值得再次检查。 - Rich Apodaca

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