12
返回列表 发新帖
楼主: Edsger.X
跳转到指定楼层
上一主题 下一主题
收起左侧

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

🔗
debuger 2020-4-19 02:23:40 | 只看该作者
全局:
ourgit 发表于 2020-4-18 10:22
看楼主感觉不是计算机科班出身的,
但是很乐意研究技术。

同学能分享一下吗 谢谢
回复

使用道具 举报

🔗
cs900601 2020-4-26 02:21:13 | 只看该作者
全局:
本帖最后由 cs900601 于 2020-4-25 12:58 编辑
ourgit 发表于 2020-4-17 20:22
看楼主感觉不是计算机科班出身的,
但是很乐意研究技术。


这个回复,有点intimidate的意味我小时候研究文曲星时也被大佬这么不屑地嘲笑过
不过那时嘲笑我的人就是现在的MJ0011,所以心服口服,不服都不行
一上来就证明应该丢给研究计算理论的人;其实可以从“C++是如何可以在编译期做计算/光线追踪的”开始

回复

使用道具 举报

🔗
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++”,楼主你认为呢

回复

使用道具 举报

全局:
Edsger.X 发表于 2020/04/18 12:26:09
太棒了,谢谢你的回复。我想确认一下,C++用GCC编译出来后,直接是机器码,也就是0和1的组成吗?
GCC编译过程其实蛮复杂的,基本是预编译处理-编译成汇编-链接器链接-最后是可执行程序。可执行程序也有各种格式的,不仅仅包含指令机器码,所以C/C++不跨平台(这里不仅仅是机器码指令不同的问题)
回复

使用道具 举报

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

本版积分规则

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