请先食用这一篇计算机工作过程
(1)微指令
前边我们了解到,高级语言编写的代码,最终需要翻译成机器语言,才能被CPU执行。
传统意义上的机器,只能识别机器语言,机器语言就是用二进制表述的指令。
CPU在执行这些用二进制表示的机器指令的时候,还需要把这些指令细分为很多小步骤。这些细分的小步骤可以被成为微指令或者微操作。
之前我们看过的这个例子:
第一条取数指令(就是图示的二进制指令)需要被划分为9个更加细分的操作。(就是图片左边的9个操作)
这9个指令就是微指令,依次执行才能完成取数操作。
微程序机器可以看作 传统机器的分解。用微程序机器的微指令来解释并且执行M1这个传统机器的每一条机器指令。
如图:
(2)汇编语言
由于传统机器只能识别二进制指令,用这种二进制指令来编程是非常不方便的。
20世纪50年代,开始出现符号式的程序设计语言--汇编语言。
虚拟
:任何一台机器,都不可能识别汇编语言。用汇编语言编写的程序想要执行,必须通过汇编程序翻译成机器语言。用汇编语言编程的程序员,在他看来,这台机器可以直接识别汇编语言。但这只是看起来,实际上是需要翻译成机器语言的。
汇编语言指令和机器语言指令一一对应!
结合之前给出的例子来看。
第一个操作码(000001)指明这是一个取数指令,地址码部分(0000000101-->5)指向5号单元。
所以我们这里给出的汇编语言代码,LOAD
说明是取数操作,5
说明了要从地址单元为5的
地方取数。和下面机器指令的两个部分一一对应。
如图:
第二条乘法指令也是类似,MUL
指明这是一条乘法指令,6
说明了要与地址单元为6的那个数进行相乘。
所以,汇编语言编写的程序只是更方便我们理解而已,本质上和机器指令没有太大区别。还是属于低级语言。
(3)高级语言
经过以上分析,用汇编语言编写程序也是非常不方便的。
随着计算机的发展,慢慢出现了高级语言,现在我们编程大多用的是高级语言。比如C、Java。
但是并没有任何一台机器可以直接识别高级语言代码,需要通过编译程序翻译成汇编语言,再经过汇编程序翻译成机器语言。
(4)操作系统
我们编写的程序,难免会用到操作系统提供的一些服务,比如某些系统调用。
所以一般来说,用汇编语言编写的程序,通常也需要请求操作系统的服务。通过系统调用的方式来请求,系统调用又可以称为“广义指令”。
操作系统和操作系统之上的部分,可以划分为软件,下方传统机器和微指令部分可以划分为硬件。
显然,《计算机组成原理》这个课程,关注的是硬件部分。
(5)编译程序与解释程序
用高级语言编写的源程序
,需要编译程序翻译为汇编语言
(助记符:方便人们记忆的符号,本质上和机器语言一一对应),然后通过汇编程序翻译为机器语言程序
。机器语言程序才是让CPU执行的程序。
如果程序里面,调用了其他的库函数,那么在汇编之后,还需要再经过链接的操作,也就是将你的程序以及调用的其他程序链接起来,这是《操作系统》研究的东西。这门课,主要关注语言的逐步转换。
实际上,还有一些语言,经过编译程序的编译之后,可以直接由源程序转换为机器语言程序。(图中绿色箭头)
还有一些高级语言代码的执行,并不是通过编译程序,而是通过解释程序(解释器),把高级语言代码翻译成与之对等的机器语言指令。很多脚本类的语言都是采用这样的机制。(图中红色箭头)
:bookmark_tabs:区别
①编译程序
直接把高级语言编写的源程序全部语句一次全部
翻译成机器语言程序,而后再执行机器语言程序(只需要翻译一次
)。
比如用C语言写的程序,通过编译、汇编之后,最终形成.exe
文件。这个文件其实就是用机器语言描述的程序。只要生成了.exe
文件,之后就不用再编译了,只需要加载这个文件即可。
②解释程序
将源程序的一条语句翻译成对应于机器语言的语句,并立即执行,紧接着再翻译下一句(每次执行都要翻译
)。
比如用JavaScript脚本语言写了几句代码,在执行的时候,每执行一句,都会丢给解释程序,让它帮我们将代码翻译成与之对等的机器语言。翻译一句之后,立即执行,然后翻译下一句。
明显,编译程序的效率更高。
像C、Java这类语言可以称为编译型语言,而JavaScript、Python这类语言可以称为解释型语言。
编译、汇编、解释程序,可以统称为“翻译程序”。
(6)总结
最后,再来看一下这两个概念的理解。
计算机体系结构:必须要探讨的是指令系统应该怎么设计。也就是我设计的这一台计算机,要对上层的机器语言程序提供哪一些指令。比如有没有乘法指令。如果不给这台机器提供乘法指令,那么使用这一台机器的程序员想要实现乘法操作,只能将数一个一个加起来。
计算机组成原理:如果我要给上层提供乘法指令,这个乘法指令如何用硬件来实现。
感谢王道,不懂的可以去B站搜视频,这里我只是总结出来了。希望能够帮到你。
整理不容易,多多支持~