分享

CPU是怎么认识程序员写的代码的?

 御龙归来 2019-10-14

其实CPU是不认识程序员写的代码的,这需要编译器当中间的翻译官,在说方舟编译器的时候说过这些,这里更系统的说一下,会涉及到的计算机课程包括《计算机组成原理》、《电子电路》、《汇编语言》、《编译原理》、《C/C /JAVA 程序设计》等。

某种意义上来说算盘就是一种早期的计算机,算盘计算需要的是什么?数据和操作,比如“1 1”这个运算“1”就是数据,“ ”就是对数据进行的操作。经过这么多年的发展,我们的电脑可以干很多很多的事情了,但是本质上还是在做类似“1 1”的操作。

目前所接触到的计算机都是以冯·诺依曼体系结构为主,结构如下:

简单说就是CPU从外面取数据,然后在内部通过运算器做运算,最终将计算结果输出,控制器则是对程序规定的控制信息进行分析,控制并协调输入,输出操作或内存访问。

CPU是一颗数字电路芯片(还有模拟电路芯片),他是怎么制造出来的呢?可以参考Intel制作的从沙子到芯片的短片,如下:

CPU上面主要是晶体管电路,晶体管只有两个状体:高电平和低电平,在计算机中用0(false)和1(true)表示,通过0和1能表示多少东西呢?前面我们说CPU的本质就是计算,只有两个状态如何计算“1 1”,“2 2”呢?有一个数学分支——布尔代数。布尔代数只有两个数据表示:true(1)和false(0),运算符也没有加减乘除,只有:NOT(非)、AND(与)、OR(或)(读起来好像跟闹太套很像)。

以AND(为例),只有两个都为true,结果才是true,有一个为false结果就为false,这种看似神奇的逻辑本来是证明哲学的,所以。。。

在布尔代数中,只需要通过,NOT(非)、AND(与)、OR(或)来实现运算,其实还有个常用的XOR(异或)。运算解决了,数字怎么解决,只有0和1怎么表示那么多的数字?这个大家都能想到——二进制就行了,可是程序中不仅有数字还有字母呢,怎么搞?提前编码,就是ascii表,实际上我们输入一个大写字面“A”,在里面对应的就是二进制0100 0001(十进制65);

有了布尔代数以及ascii表,计算机就可以表示所有的数字和字母(初期不支持汉字)以及符号了,下面就可以设计门电路了,CPU就是由各种门电路组成的:

到了这里可以很容易得出一个结论,CPU用0和1就可以搞定数据和运算,CPU是搞定了,对CPU来说各种0和1的组合就是它能读懂的“语言”,这就是我们所说的机器语言。0和1这种语言也是人来规定的,人当然也能读懂,但是当面对非常庞大的一堆的0和1时,任谁都会崩溃,这太反人类了。

于是汇编语言诞生了,汇编语言与机器指令是一一对应的,比如我们要计算1 1,如果直接输入机器码会是很长的一串0和1的组合,如果是汇编语言(8086)呢?大概就是下面的样子:

mov ax, 1    //寄存器ax送入值1,
mov bx, 1    //寄存器bx送入值1,
add ax, bx   // ax和 bx 寄存器值相加

是不是很容易看懂了?寄存器又是什么呢?是CPU内部暂时存储指令、地址、数据的元器件,intel的64位处理器中有16个寄存器。

又说起硬件了,我们继续说软件,汇编语言有很多指令和助记符帮助程序员,所以这些程序编写起来会方便很多,那CPU是如何理解汇编器的呢?其实机器也不懂汇编语言,把汇编语言转换成都是01的机器语言需要汇编器(Assembler),其实就是汇编语言编译器,但是这个很底层,用二进制写的,机器可以读懂这个翻译。

对程序员来说,汇编语言确实比机器码方便了,但是依然会设计寄存器,地址等,想要做一个大型软件还是很麻烦,这就有了C语言等,后来又有了JAVA、python等高级需要,比如要用C语言写一个'1 1',就是下面的形式:

int x;
x = 1 1;

是不是更简单了,C语言一样效率不高,因为想要更好的描述世界,进行大型程序开发面向过程的语言是力不从心的,于是就有了面向对象,有了反射等机制。不管是C语言还是JAVA、python等,都是为了方便程序员更好的抽象和描述世界,描述需求。机器依然不懂,编译器因此诞生了,编译器就是把程序员用的各种高级语言翻译成处理器 才懂的机器语言。

上面我一直说的CPU都是基于Intel 的8086处理器,课本上也一直是这个,现在应该也还是,但是事实上现在已经有很多的处理器已经不是X86处理器了,ARM和X86的区别是什么呢?ISA(An instruction set architecture , 指令集架构)不同,我们还说上面最简单的A B的描述,在不同的指令集上,他们的实现是不一样的,也就是我们平时说的架构不同,所以同一个程序最后编译到不同架构的处理器上得到的机器码也是不同的,无法移植。

那能不能跨平台呢?在IT界,加个中间层没有什么不可以的,比如JAVA就是增加了一个虚拟机,JAVA的虚拟机就是JAVA跨平台的基础。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多