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

Gal*_*xin 1 c++ java compilation .class-file

我已经在java工作了一段时间,并且想要了解c ++在编译和执行时的工作原理.

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

que*_*atl 5

如果你雄心勃勃并且足够顽固,几乎所有事情都可以完成,但问题通常在于时间和成本以及特征.

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

编译后,C++代码由机器代码表示.Java的字节码当然可以转换为机器代码 - 简单地说就是JVM执行它并且抖动可以动态地重新编译成机器代码.

因此,粗略地说,每个编译或未编译的Java代码都可以翻译成C++.

但是,C++中有一些代码构造可以编译成机器代码,但这可能在Java的字节码中可以表示,但是不能用Java语言表示.有很多东西:从一些易于转换,如传递参数作为引用,到更复杂的指针(TheList->)算术,到一些真正痛苦的翻译像多继承,自定义内存管理(即重载运算符)新的和删除),或一些邪恶的类型,如工会.

所以,很明显,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++从旧语言的演化发展,并从字面上挤满了一些曾经在你的一生使用的功能,使语法真的很难准确地处理(即你曾经使用设置备用的令牌?..这只是开始:)).不过,不要太害怕!我只是想让你感受到你试图触摸的东西.你可能不需要写它.这些已经存在的工具既存在于Java(实际上很多,实际上也存在)和C++(很少,我敢打赌,合理的工具不是完全免费的......或者你可能可以使用GCC工具集......).他们生成源代码的机器可处理的表示,如果你真的想做一些翻译工作,我建议你从那里开始.

当然,我的知识可能会在几年内消失,也许有人已经写了一些无用的翻译工作 - 我很乐意看到它!

如果没有,我认为这不值得.尝试在您的C++应用程序中嵌入Java的运行时,或者通过JNI从Java到C++ DLL进行交谈.它简单得多!