我已经在 java 中工作了一段时间,并且想了解 c++ 在编译和执行时是如何工作的。
我想知道是否有办法将编译的 c++ 类转换为 java 中的 .class 文件,反之亦然。我对可以由 java 代码和可以直接执行以查看结果的 c++ 代码使用的单一格式感兴趣。
我已经在 java 中工作了一段时间,并且想了解 c++ 在编译和执行时是如何工作的。
我想知道是否有办法将编译的 c++ 类转换为 java 中的 .class 文件,反之亦然。我对可以由 java 代码和可以直接执行以查看结果的 c++ 代码使用的单一格式感兴趣。
如果您有足够的野心和固执,几乎所有事情都可以完成,但是,问题通常在于时间、成本和功能。
Java语言的核心是 C++ 的子集。添加了一些语法糖,可能会让您觉得还有“更多”,例如匿名类实现或指向外部类的隐藏指针,但这只是语法的一层薄薄,一旦编译代码就无关紧要了。
编译后,C++ 代码由机器码表示。Java 的字节码当然可以翻译成机器码——仅仅因为 JVM 会执行它并且抖动可以将它即时重新编译成机器码。
因此,粗略地说,每个 Java 代码,无论是否编译,都可以翻译成 C++。
但是,C++ 中有一些代码结构可以编译成机器代码,但它们可能可以用 Java 的字节码表示,但不能用 Java 语言表示。它有很多:从一些容易解决的问题,如将参数作为引用传递,到更复杂的,如指针 (TheList->) 算术,再到一些非常痛苦的翻译,如多重继承、自定义内存管理(即重载运算符new 和 delete),或一些邪恶的类型,如联合。
因此,很明显,C++ 代码不能翻译成 Java。显然,C++ 编译的代码更不可翻译,因为 C++ 编译器经常对产品进行彻底优化,因此很难猜测“类”或“函数”是什么样的。
但是,如果您限制 C++ 语言,并限制自己不使用任何那些难以翻译的结构(参见“TheList”),那么您可以使 C++ 代码可翻译。同样,代码,但不是二进制文件。
这还不是全部。“可翻译性”是一回事,但另一回事是:它会运行吗?最显着的运行时差异是 GarbageCollector。假设您实际上设法将一些 Java 代码翻译成 C++,并将其与 C++ 应用程序对齐。您的 Java/C++ 代码执行并创建一些对象。谁来清理它们?通常,C++ 中没有 GC。因此,您的 Java 代码将泄漏——或者您将不得不为 Java/C++ 代码提供/实现某种 GC。不漂亮。当然,您可以限制 Java 代码不创建任何对象,d'oh。
不要误会我的意思:即使是那些难以翻译的东西,比如指针算术等,也是可翻译的:你可以生成大量的辅助/连线代码,将它们替换为“第二平台的适当东西”。然而,它会非常复杂和缓慢。我认为任何理智的人都不会尝试。
因此,似乎唯一可用的是非常有限的 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++ 代码,则需要以下内容。
(假设 32bit Windows 平台)
. PE 解析器/加载器 =>链接
。X86 CPU 指令解析器(?) =>链接
。X86 指令到 Java 字节码翻译器
简而言之,这几乎是不可能的。
对于简单的 C/C++ 与 Java 互操作,JNI 可以。关联
将已编译的 C++ 代码转换为 JVM 字节码并不是一件容易的事,特别是如果您希望能够使用来自多个平台的已编译 C++ 代码。
相反,为clang创建一个 JVM 后端可能会更容易。这里的缺点是想要这个功能的人必须使用你的编译器。
简而言之,如果您想编写针对 Java 虚拟机的代码,那么请使用已经制作好的语言和编译器。像爪哇...