查看: 2101| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 为何JVM可以读取Javascript编译出来的Bytecode,但无法读取C++编译出的ByteCode

头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:非丝薄克最近六个月 高频题 LC(2020.04 )
下一篇:一些开始刷题找工作的困惑。求大神指点。
推荐
reab 2020-4-18 11:04:35 | 只看该作者
全局:
本帖最后由 reab 于 2020-4-18 11:07 编辑

JVM只能读取运行Java Bytecode。注意,"Java Bytecode"是这种指令集的名字,就像英语名叫英语,但是不一定只有英国人说。但是因为JVM应用的地方很多(或者说跨平台),所以有人做了一些直接编译成Java Bytecode的语言(比如Scala),也有人做了一些工具把传统或者原生跟JVM没什么关系的语言编译成Java Bytecode。你说的Javascript编译出来的Bytecode,其实是特指这样的工具编译出来的Java Bytecode,Javascript本身跟JVM其实没什么关系,甚至跟Java除了名字类似也关系不大(有人说就像Ham和Hamster的关系)。上面别人也说了有人做了Jypthon把Python编译成JVM可以运行的Java Bytecode(注意Python本身也有bytecode,但是跟Java Bytecode不是同一种Bytecode),你说的JRuby也是把Ruby编译成Java Bytecode。C/C++传统上(或者说几乎市面上所有的编译器)编译出来直接是machine code,理论上你可能也可以做一个编译成Java Bytecode的编译器,但是很可能没有人这么干因为没有什么意义。
回复

使用道具 举报

推荐
ourgit 2020-4-18 10:22:25 | 只看该作者
全局:
本帖最后由 ourgit 于 2020-4-18 11:02 编辑

看楼主感觉不是计算机科班出身的,
但是很乐意研究技术。

先来一个问题热身热身吧
请证明:C++ template是图灵完备

评分

参与人数 1大米 +3 收起 理由
debuger + 3 厉害了我的哥!

查看全部评分

回复

使用道具 举报

推荐
cs900601 2020-4-26 02:23:25 | 只看该作者
全局:
本帖最后由 cs900601 于 2020-4-25 12:43 编辑

我最近倒是正在藉DosBox研究一个DOS游戏,我现在找到了在游戏中绘制地图的函数,想要达成的是找出游戏中的地图资源组织的方式,从而找到地图上所有隐藏元素。C++编出来的是叫PE(portable executable)文件,就是利用系统调用(比如向控制台上印出文字是一个调用,是内核提供的功能)并遵守一定调用规范(比如调用函数时,第几个寄存器放第几个参数,堆栈是放在调用者一侧还是被调用者一侧)的程序
比如那个dos游戏是80386 CPU上运行的32位程序,x86 flat mode寻址模式的程序(就是不同于汇编语言课上教的8086实模式的段地址加偏移量的方式)

不过以上扯得太远了,我只是想说在c++程序中有那些底层的元素,而在Java中,都是有JVM代劳(应该是通过JNI调用原生函数的方式抹平了不同操作系统和体系结构的分别我猜)

另外有种东西叫transpiler,跨语言编译器,举例为emscripten,可以将c++编译为Javascript,如果换个后端,并把库函数配上,编成Java也未尝不可

具体到实现的话emscripten是基于LLVM的,而因为Java和C++都可以编成LLVM Bytecode所以两者在那个层级上也是可以转换的,说不定能够达成楼主说的让JVM运行C++虽然并不是Java Bytecode的C++而是编译成了LLVM Bytecode的C++

或者再退一步,如果用Java编一个DosBox,模拟出一个CPU和周边设备(中断控制器,显示屏等),然后执行Watcom C++编译器(古早的c++编译器有好多现在的功能都不支持的,可能没法试验图灵完备的玩法)程序,我觉得也算是“JVM在执行C++”,楼主你认为呢

回复

使用道具 举报

🔗
invisibili 2020-4-16 12:57:00 | 只看该作者
全局:
可以的 Jython了解下 C/C++就不知道了 可能只是没人愿意做吧
回复

使用道具 举报

全局:
Edsger.X 发表于 2020/04/18 12:26:09
太棒了,谢谢你的回复。我想确认一下,C++用GCC编译出来后,直接是机器码,也就是0和1的组成吗?
我记得出来的是assembly
可执行文件才是机器码
回复

使用道具 举报

🔗
reab 2020-4-18 12:42:06 | 只看该作者
全局:
qiaofengmarco 发表于 2020-4-18 12:33
我记得出来的是assembly
可执行文件才是机器码

gcc加参数-S是不进行汇编阶段,生成出来的结果是assembly code(代码文本),不加参数默认出来是汇编以后可以直接运行的二进制(0,1)可执行文件。
回复

使用道具 举报

全局:
reab 发表于 2020/04/18 12:42:06
gcc加参数-S是不进行汇编阶段,生成出来的结果是assembly code(代码文本),不加参数默认出来是汇编以后可以...
感谢科普!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表