请问 C++这种支持多继承的语言是怎么跑在 JVM 上的?

2020-03-09 13:17:24 +08:00
 lbllol365
各位前辈好,没毕业小菜鸟在看《深入理解 Java 虚拟机》时有一个如题的疑惑,想请教大家。

是这样的:我在看到第六章 类文件结构时,看到“super_class (父类索引)”这个字段,书上说“由于 Java 语言不允许多继承,所以父类索引只有一个”。我联想到 JVM 是语言无关的,所以我当时觉得 JVM 应该会支持多个父类索引吧。然后我去查了 Java SE 8 的 JVM 规范,里面说 super_class 这个索引指向一个“ CONSTANT_Class_info”结构,然后我看这个结构是代表一个类或者接口( The CONSTANT_Class_info structure is used to represent a class or an interface )。那么这样是不是可以认为 JVM 在“super_class"这一字段上不支持多继承?然而我们又知道 C++是可以跑在 JVM 上的? But how ?

懂的前辈点一个关键点就可以了,我自己去查资料就好。谢谢!
3953 次点击
所在节点    Java
31 条回复
lbllol365
2020-03-09 14:21:32 +08:00
@augustheart 前辈说得很有道理,我可能就是忽视了编译的本质,感谢!
CismonX
2020-03-09 14:37:49 +08:00
Java Bytecode 作为 IR,如楼主所说,是语言无关的,它不需要关注诸如 C++ 的多继承这类高级语言的特性。因此楼主的问题可以拆开成两个问题:

1. C++的多继承可以如何实现? 答:可以使用 vtable 实现。

2. C++如何编译为 Java Bytecode ?答:可以参考 gcc (C++ -> GIMPLE) 和 clang (C++ -> LLVM IR) 等编译器的前端,它们的实现原理都是大同小异的。
si
2020-03-09 14:54:49 +08:00
我对 C++和 Java 都不熟,只提供一些想法。
可以编译的时候把多个父类组合成一个类,然后直接继承这个组合后的类。
比如 A 继承 B 和 C 两个,把 B 和 C 的代码组合成 D,然后 A 直接继承 D。
或者根本不用在 class 文件里标明继承关系,不用和 java 一样一个 class 文件表示一个类,
直接把整个程序编译成一个 class 文件就行,中间进行什么组合拼接都可以,只要程序执行的效果一样的就行了。
所有程序都是要最终的执行结果,中间有什么变化都没什么关系。
就像是打开一个网页的时候,也只会关心打开快不快,只要用起来一样,不管后面是 Java 还是 php,都不影响。
qieqie
2020-03-09 15:10:56 +08:00
有 Clang,只要上一个 LLVM JVM Backend 就行。
不过 Hotspot VM 本身都是 c/c++写的,不知道这样套娃的意义何在。
tabris17
2020-03-09 15:27:55 +08:00
@lbllol365 C++的类不一定要映射成 JVM 的 class 呀,比如早期 C++编译器就是将 C++翻译成 C 语言再进行编译的
jinsongzhao
2020-03-09 16:40:23 +08:00
应该没有这种东西,就算有,也是玩具。C++代码没有 GC 机制,如果要编译出带 GC 功能的,这个编译器一定对代码有要求,比如不允许使用指针等等
cluulzz
2020-03-09 16:55:15 +08:00
cluulzz
2020-03-09 16:55:53 +08:00
xcstream
2020-03-09 19:00:36 +08:00
虽然啥也不懂,但是理论上图灵完备肯定可以。
Michaelssss
2020-03-09 20:45:54 +08:00
…都不是同一个语境
abcbuzhiming
2020-03-10 20:31:16 +08:00
C++可以跑在 JVM 上?我孤陋寡闻了,没听说过,如果你说的是指用 jni 调用 C++,那是二进制调用,已经越过了 jvm 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/651159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX