FNC Reckless 2020-07-02 23:00 采纳率: 0%
浏览 141
已结题

有关高级语言和汇编语言的一些问题

今天突发奇想,想研究一下有关高级语言和汇编语言的一些问题,但是由于我学识浅薄,所以想把自己的拙见给大神们看一下,望各位不吝赐教,谢谢!
1.有关高级语言和汇编语言的运行过程
计算机语言共分为三个等级:机器语言,汇编语言,高级语言。机器语言就是机器能够直接运行的,汇编语言和高级语言都需要编译为机器语言才可以运行。之前我以为高级语言需要编译为汇编语言,但是看到网上的资料都没提汇编语言的事情,所以我现在认为高级语言和汇编语言一样,都是直接编译为机器码(这里以C/C++语言为主,JAVA由于有虚拟机,后面讨论),然后交给机器执行,不知道是否正确。
2.有关可移植性的问题
可移植性就是指编译后的文件在不同的操作系统中都可以直接运行,所以汇编语言和C语言可移植性都很差,如果更换平台需要重新编译一遍才可以运行(这里我产生了第一个疑问,就是汇编语言的等级和汇编语言是否可以讨论可移植性的问题),而JAVA有虚拟机,所以只要操作系统配置了JAVA虚拟机,就可以直接运行编译过的JAVA程序,所以JAVA的可移植性很好。
上面是我的个人见解,下面是我想不明白的问题。
1.由高级语言编写的程序的运行为什么跟操作系统有关
假设我上面描述的程序运行的过程是正确的(如果是错的,那么我或许就能明白这个问题了),那么编写的文件是由编译器编译为机器语言的(仅考虑C/C++语言,这里插个题外话,说高级语言的时候都是说JAVA,C/C++等,那么为什么C和C++要同时出现,这也算是个问题),是不是本身不同操作系统的编译器就不一样,正如我在操作系统中学到的,不同的操作系统有不同的API,所以,使用了越多的API就导致可移植性越差(有什么可以不使用API就能进行的操作吗,我对API理解不够深刻,目前来说我确定编写操作系统时没有用到API,对于其他操作,我就不是很确定了。比如计算1+1用的到API吗,我觉得用不到,因为我认为API是需要进行一些系统调用时才会用到的东西,但是也不确定,这也算是一个问题),所以才会产生不同操作系统需要不同的编译器。JAVA程序和C/C++程序同理,因为JVM是C/C++语言写的,所以也有不同版本。由此可见,只要编译(或解释)完成了,后面的运行就和操作系统关系不大了。不知道这样理解是否正确。
2.汇编语言的等级问题
我认为汇编语言的等级应该比操作系统更低。因为汇编语言直接面对的是机器语言,它和机器语言一一对应。那么,是不是可以这么认为,汇编语言编写的代码可以在相同指令集的CPU中移植(具体术语忘记了,好像从网上看到过,叫硬件移植)而不需要关心是什么操作系统。如果真是这样,再进一步想,虽然看起来汇编语言的移植性很差,但是换个角度,在英特尔CPU一家独大的今天,汇编语言或许是可移植性最好的语言呢,因为英特尔的CPU指令集应该是一样的,而且很多其他的CPU跟英特尔CPU指令集也是相同的,而且汇编语言可以在任何指令集相同的CPU上运行而不需要关注操作系统是什么。
3.不同操作系统的核心操作是否相同
这个问题其实比较无聊,但是想到了就问一下吧,不同的操作系统,比如Windows和Mac的操作系统在中断机制或者其他的一些特权指令是否相同,个人感觉一些API的操作应该不同,但是最核心的一些操作,比如中断处理机制,我就不确定了,因为我学操作系统的时候从来没有单独拿出来一个具体的操作系统讲解中断处理机制
我这个人比较喜欢刨根问底,也比较喜欢自己总结与思考,但是由于学识尚浅,所以肯定会有缺漏之处,还请各位大神不吝赐教,再次感谢!

  • 写回答

2条回答 默认 最新

  • marty535 2020-07-03 10:19
    关注

    我在这里和你复习下c语言的编译过程
    预处理 --- 编译 ---- 汇编 ---- 连接
    这里的编译指的就是讲c语言编译成汇编代码而不是机器代码,所以你第一步理解就错了

    可移植性问题是指程序员不需要开发多份代码,仅仅是指代码层面的,实际上以java举例,他的虚拟机在不同操作系统下的实现肯定是不同的
    只是在语言层面帮你解决了这些问题,你不需要关心编译器是如何工作的,他能将你写的同一份代码翻译成不同操作系统都能理解的机器代码
    而汇编语言移植性差是因为汇编和机器码是一一对应关系,它是针对具体机器的语言,而高级语言因为有编译器可以将语言代码编译成不同机器都可识别的机器码所以移植性好,以go语言举例,go语言开发时你只需要写一份代码,但是当你要实际部署时,如果你有windows和linux两种服务器,你是需要编译两份可执行文件分别对应不用操作系统的。

    不同操作系统的核心显然不同,只是很多时候大家都遵循同一规范来开发操作系统,所以对外界来说好像都能实现差不多的功能,实际上这些功能里面的实现可能是完全不同的,只是大家遵循规范对外暴露的调用感觉相同而已。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月20日

悬赏问题

  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏