计算机系统与编译原理简介——从底层到顶层

发布时间 2023-10-05 01:26:56作者: adamaik

计算机的分层

首先让我们大体了解一下计算机与各种编程语言的关系
image
在这张图中,驱动程序与机器码程序直接控制着硬件的运行;除此以外,上层程序与编程语言统统由下级编程语言实现
接下来,我将从硬件层开始逐级向上讲解

硬件层

即计算机系统中的一切物理实体层级,他们使用高低电平和逻辑电路进行数据交换与计算,对应着二进制的1与0,常用的控制方式有源码,补码,反码等等,具体内容请详参大学课程《数字逻辑电路》

cpu是计算机系统中除gpu外最大的计算单元,也是绝大部分计算工作完成的地方。为了控制cpu的工作,人类提出了一套约定,如当cpu接受到1000011001的信号时(我瞎编的),cpu将缓存中指定位置的数字相加。人类将许多约定的指令合并在一起,形成了指令集。

常见的指令集有以intel和AMD为代表的桌面端x86指令集,以高通骁龙,联发科天玑,华为麒麟,三星猎户座为代表的移动端ARM指令集,以及以龙芯为代表的自研Loongarch指令集等等。

x86指令集,又叫复杂指令系统,指令数量多而全,主要服务于PC端,ARM指令集,又叫精简指令系统,指令数量少而简洁,主要服务于手机等移动端

驱动程序层

由于世界上有很多的指令集,而软件开发者又很明显不可能为每个指令集重新开发一遍软件,所以人们从硬件的实际操作中抽象出了一套通用的过程,如:内存数据移位,内存指针跳转等等,并且规定所有cpu厂商必须提供一套可以将这些抽象出的操作落实到硬件的程序,这些程序便是驱动程序

因此,驱动程序往往由熟悉硬件指令集的硬件厂商提供,自此以后,软件开发者只需要根据这一套通用操作编写程序即可,驱动程序会负责将这些通用操作转换为cpu所对应的指令集。

汇编语言层或系统层

在驱动程序层中提到过的那些统一的,抽象出来的通用操作有一个别名,那就是汇编语言,汇编语言真实的反应着计算机物理结构的工作状况,因此理解难度极大

操作系统同样处于这一层级,他们通过硬件驱动直接控制着计算机硬件

编程语言

由于汇编语言真实的反映着计算机物理结构的工作情况,所以它同样是反人类逻辑的,是难以理解的。所以,为了降低编程的难度,提高效率,人类开创性的提出了语法结构分析这一大法宝,形成了所有编程语言的祖宗——cpp

cpp的编译

当我们写好cpp源代码后,点击运行按钮,编译器程序便会对我们的源代码进行语法分析,首先处理include和define的内容,对我们的源代码完成替换和添加的工作,随后它将会分析我们的代码的语法逻辑并进行逻辑优化,消除掉我们代码中一些冗余的部分,然后根据分析得到的逻辑树(逻辑树相关的知识请参见《编译原理》)构造出对应的汇编代码,也叫目标文件。

随后,编译器会将汇编代码与对应的动态库等等进行链接,然后根据驱动程序翻译为机器码,这也就是为什么exe文件不能在不同指令集或者不同的操作系统中运行。

注:intel与AMD的指令集不完全相同,但大部分相同,所以很多软件会选用二者的共同指令集进行编译,对于不同的指令集部分,则准备两套指令集的机器码供两种cpu使用。

java与python等高级语言的解释

高级语言并不编译,它们采用解释的方法运行。即运行时逐句阅读源代码,逐句翻译为对应的指令发送给计算机,它们不生成任何机器码。负责翻译的程序被称为解释器,通常由cpp编写而成。

优点:源代码只需要更换解释器程序就可以在任何指令集与系统中运行,免去了重新编译的麻烦;语法逻辑更加简单,编写程序更加方便

缺点:由于不是机器码所以运行效率低下,且难以实现很多底层的功能,经常需要调用cpp程序来完成工作