1

我已经在 java 中工作了一段时间,并且想了解 c++ 在编译和执行时是如何工作的。

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

4

4 回答 4

5

如果您有足够的野心和固执,几乎所有事情都可以完成,但是,问题通常在于时间、成本和功能。

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。它要简单得多

于 2013-01-17T08:58:28.747 回答
3

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

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

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

. PE 解析器/加载器 =>链接
。X86 CPU 指令解析器(?) =>链接
。X86 指令到 Java 字节码翻译器

简而言之,这几乎是不可能的。

对于简单的 C/C++ 与 Java 互操作,JNI 可以。关联

于 2013-01-17T08:43:33.887 回答
0

我认为,JNI会很有用:

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

以下 是如何编写一个使用 Java Native Interfac 的简单示例(编写一个调用 C 函数的 Java 应用程序)的好技巧。

于 2013-01-17T08:37:48.400 回答
0

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

相反,为clang创建一个 JVM 后端可能会更容易。这里的缺点是想要这个功能的人必须使用你的编译器。

简而言之,如果您想编写针对 Java 虚拟机的代码,那么请使用已经制作好的语言和编译器。像爪哇...

于 2013-01-17T08:48:00.153 回答