如果你有足够的野心和固执,几乎所有事情都可以做到,但是,问题通常在于时间、成本和功能。
在其核心中,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 代码不创建任何对象,哦。
不要误会我的意思:即使是指针算术等难以翻译的东西也是可翻译的:您可以生成大量帮助/接线代码,将它们替换为“适当的东西”第二平台”。然而,它会非常复杂和缓慢。我认为任何理智的人都不会尝试。
因此,似乎唯一可用的是非常有限的 C++ 代码 有限的 Java 代码。如果我们将问题简化为这个,那么是的,那应该是可翻译的。 但是..
翻译代码是什么意思?你是怎么做到的?您必须阅读、处理、分析源代码,然后以某种方式以其他语言生成其他代码。好吧,好吧。生成代码很简单,它只是文本。但是,您是否尝试过分析代码?长话短说,让我告诉你,阅读/解析 Java 代码至少比阅读/解析 C++ 代码要容易一个数量级。 Java 在一定程度上被设计成可以通过相对简单的算法轻松解析。如果您放弃任何优化尝试,编写 Java 解析器/编译器是相对简单的事情。另一方面,C++ 不是。像 Java 一样,要正确解析 C++,您必须有效地创建一个自定义 C++ 编译器,而且还需要一个预处理器。在某种程度上,您可能还需要实现链接器的某些部分。更糟糕的是,C++ 是从较旧的语言演变而来的,并且确实包含了一些在你的一生中使用过的特性,这些特性使得语法真的难以准确过程(即,您曾经使用过 alternate token set 吗?..这只是开始:))。不过,不要太害怕!我只是想给你一种你试图触摸的感觉。你可能不需要写它。这样的工具已经存在,对于 Java(实际上真的很多)和 C++(很少,而且我敢打赌合理的工具不是完全免费的......或者你可能可以使用 GCC 工具集......)。它们生成源代码的机器可处理表示,如果你真的想做一些翻译工作,我建议你从那里开始。
当然,我的知识可能会落后几年,也许有人已经写过一些更无聊的工作翻译 - 我很想看看!
如果没有,我认为不值得。尝试在您的 C++ 应用程序中嵌入 Java 的运行时,或者通过 JNI 从 Java 到 C++ DLL。它要简单得多!