可以用c++代码读取java .class文件

Can c++ code read java .class files?

本文关键字:java class 文件 读取 代码 c++      更新时间:2023-10-16

我已经在java中工作了一段时间了,现在想学习c++在编译和执行方面是如何工作的。

我想知道是否有一种方法将编译的c++类转换为java中的。class文件,反之亦然。我对java代码和c++代码都可以使用的单一格式感兴趣,可以直接执行以查看结果

如果你有足够的雄心和毅力,几乎所有的都可以完成,然而,问题往往在于时间、成本和功能。

在其核心,Java 语言是c++的一个子集。添加了一些语法糖,可能会让你觉得有"更多的东西",比如匿名类实现或指向外部类的隐藏指针,但它只是语法的一个薄层,一旦编译代码就无关紧要了。

编译后,c++代码由机器码表示。Java的字节码当然可以翻译成机器码——仅仅是因为JVM执行它,并且抖动可以动态地将它重新编译成机器码。

所以,粗略地说,每个Java代码,无论编译与否,都可以翻译成c++。

然而,c++中有一些代码结构可以被编译成机器码,但是可能在Java的字节码中是可表示的,但是不能在Java语言中表示。它有很多:从一些容易处理的,如传递参数作为引用,到更复杂的,如指针(list ->)算法,到一些非常痛苦的转换,如多重继承,自定义内存管理(即重载操作符new和delete),或一些邪恶的类型,如联合。

所以,很明显,c++代码不能翻译成Java。显然,c++编译的代码更不可翻译,因为c++编译器通常会彻底优化产品,因此很难猜测"类"或"函数"是什么。

然而,如果您限制了c++语言,并限制自己不使用任何难以翻译的结构(参见' list '),那么您可以使c++代码可翻译。同样,是代码,但不是二进制文件。

这还不是全部。"可译性"是一回事,但另一个问题是:它能运行吗?最显著的运行时差异是GarbageCollector。假设您实际上设法将一些Java代码转换为c++,并将其与c++应用程序对齐。您的Java/c++代码执行并创建一些对象。谁来清理?通常,c++中没有GC。因此,您的Java代码将会泄漏——或者您将不得不为Java/c++代码提供/实现某种GC。不漂亮。当然,您可以限制Java代码不创建任何对象,d'oh。

不要误解我的意思:即使是那些难以翻译的东西,如指针算术等,也是可翻译的:你可以生成大量的helper/wireup代码,将它们替换为"第二平台的适当的东西"。然而,这将是荒谬的复杂和缓慢。我不认为任何有理智的人会去尝试。

因此,似乎唯一可用的东西是非常有限的c++代码<->有些有限的java代码。如果我们把问题简化成这样,那么是的,这应该是可以翻译的。, .

翻译代码是什么意思?你是怎么做到的?您必须阅读、处理、分析源代码,然后以某种方式用另一种语言生成其他代码。好吧,好吧。生成代码很简单,它只是文本。但是,您是否尝试过分析代码?长话短说,让我告诉你,阅读/解析Java代码至少比阅读/解析c++代码要简单一个数量级。Java在一定程度上被设计成可以通过相对简单的算法轻松解析。如果您放弃任何优化尝试,编写Java解析器/编译器是相对简单的事情。另一方面,c++不是。像Java一样,要正确解析c++,您必须有效地创建一个自定义c++编译器,但也需要一个预处理器。在某种程度上,您可能还需要实现链接器的某些部分。更糟糕的是,c++是从旧的语言演变而来的,并且实际上包含了一些一生只使用一次的特性,这些特性使得语法很难准确地处理(例如:您是否使用过备用令牌集?..而这仅仅是开始:)。不过,不要太害怕!我只是想给你一种你想摸的感觉。你可能不需要写出来。这样的工具已经存在了,无论是Java(实际上很多)还是c++(很少,我敢打赌合理的工具都不是完全免费的。或者也许你可以使用GCC工具集…)。它们产生机器可处理的源代码表示,如果你真的想做一些翻译工作,我建议你从那里开始。

当然,我的知识可能会落后几年,也许有人已经写了一些更少的工作翻译-我很想看到它!

如果不是,我认为它不值得。尝试在c++应用程序中嵌入Java的运行时,或者通过JNI从Java切换到c++ dll。就简单多了!

编译后的c++代码由操作系统加载。也就是说,c++链接器生成依赖于操作系统的可执行模块。而Java .class是由JVM加载的。JVM执行Java字节码。

如果你想做一个Java字节码加载器/运行器,你可以从JVM源代码开始。
=>链接

如果您的目标是在Java环境中加载/执行编译后的c++代码,则需要以下内容:
(假设32位Windows平台)

。PE解析器/加载器=> link
. X86 CPU指令解析器(?)=> link
. X86指令到Java字节码转换器

总之,这几乎不可能。

对于简单的C/c++与Java互操作,JNI就可以了。链接

我认为,JNI将是有用的:

"Java本机接口(JNI)是一个编程框架,它使运行在Java虚拟机(JVM)中的Java代码能够调用和被本机应用程序(特定于硬件和操作系统平台的程序)和用其他语言(如C、c++和汇编)编写的库调用。"

下面是一些很好的技巧,教你如何编写一个使用Java Native interface的简单示例(编写一个调用C函数的Java应用程序)。

将已编译的c++代码转换为JVM字节码并不是一件容易的事情,特别是如果您希望能够在多个平台上使用已编译的c++代码。

为clang做一个jvm后端可能会更容易。这里的缺点是想要这个功能的人必须使用你的编译器。

简而言之,如果您想要编写针对Java虚拟机的代码,那么就使用已经为之开发的语言和编译器。像Java…