【问题标题】:Can c++ code read java .class files?c++ 代码可以读取 java .class 文件吗?
【发布时间】:2013-01-17 08:25:23
【问题描述】:

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

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

【问题讨论】:

  • 看看docs.oracle.com/javase/specs,jvm是用c/c++写的
  • ¬_¬ 您想获取特定于某些平台的已编译 C++ 代码......并将其转换为 java 字节码......目的是什么?比较“表现”(肯定会被这种干预破坏)。您甚至了解您的要求吗?

标签: java c++ compilation .class-file


【解决方案1】:

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

在其核心中,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。它要简单得多

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我认为,JNI 会很有用:

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

      Here 是如何编写一个使用 Java 本机接口的简单示例(编写一个调用 C 函数的 Java 应用程序)的好技巧。

      【讨论】:

      • JNI 让我们的 Java 接口与本机代码...线索就在名称中。它没有提供将编译后的 C++ 代码转换为 java 字节码的方法。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 2019-07-01
        • 2020-05-26
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多