欢迎访问小城生活网,我们专注于分享生活日常的小常识.
首页 > 数码百科 > 内容

CPU是如何识别代码的?他的工作原理是怎样的?

发布时间:2021-06-15 08:37 来源:豆瓣 编辑:爱思考的奥特曼 阅读次数:
字号:
网友提问:

CPU是如何识别代码的?他的工作原理是怎样的?

优质回答:

CPU其实只认识“0”和“1”

我们经常会听说到某某芯片由多少百亿个晶体管组成这样的科技新闻。没错,CPU就是超大规模的集成电路,由数量超级多的晶体管组成,而晶体管只有“开”和“关”两种状态,刚好可以用“0”和“1”来代表这两种状态,所以CPU是采用二进制来进行运算的。

CPU是什么?

CPU是Central Processing Unit的缩写,中文名全称为中央处理器。CPU的组成包括了运算逻辑、寄存器和控制部件,它可以解释指令和进行数据运算处理。因为CPU本身就是超大规模的数字电路,只认识“0”和“1”,所以所有的指令和数据都需要由“0”和“1”组成。

二进制只有“0”和“1”怎么运算?

所有运算逻辑我们都可以理解为“与”,“或”,“非”,“异或”四种哦

与门:多个条件中,所有条件成立才算成立,

1 and 1 = 11 and 0 = 00 and 0 = 0

或门:多个条件中,只要有一个条件成立,就算成立

1 or 0 =11 or 1 =10 or 0 =0

非门:其实就是反相

not 1 =0not 0 =1

异或门:可以理解为,两个条件不一样,才算成立

1 xor 1 =01 xor 0 =10 xor 0 =0

当然还可以由这四种门延申出“与非门”,“或非门”,“与或非门”,“异或非门”等。

CPU为什么可以运行我们的程序呢?

上面说到CPU只认识“0”和“1”,那它为什么可以运行我们的程序呢?CPU的确不可以直接运行我们编写的程序。但如果直接只用“0”和“1”的组合来写程序,那是相当的烦所,也难以找到错误,是非常不现实的。聪明的人类为了解决这个大麻烦,就发明了汇编语言,用一些容易理解和记忆的字符来代替“0”和“1”组成的指令。

例如:

ADD:表示逻辑加减MOV:代表数据传递JMP:代表跳转

当然还是需要通过汇编器把这些用汇编语言编写的程序翻译为“0”和“1”组成的十六进制机器码。

随着计算机技术的发展,写的程序也越来越复杂了,发现用汇编语言编写程序的效率也相当低,然后聪明的人类又发明了我们现在用的各种高级语言,比如C,C++,PHP,Python等等,当然这些由高级语言编写的程序就需要通过编译器"翻译"为CPU能够识别的十六进制机器码。

汇编器或者编译器可以理解代码与CPU沟统的“桥梁”了,通过它进行“翻译”,CPU就可以认识代码了。

欢迎关注@电子产品设计方案,一起享受分享与学习的乐趣!关注我,成为朋友,一起交流一起学习记得点赞和评论哦!非常感谢!

其他网友观点

提前备注:回答比较硬核,我会尽量软化,但想了解知识还是需要耐心。CPU内传输的信号有两种:高电压和低电压,分别代表数字信号“1”和“0”,因此CPU唯一能理解(问题中的“认识”)的语言就是由“1”和“0”写成的机器语言。

由于程序(代码)存储在电脑硬盘中时,也是“1”和“0”的形式,是否就意味着,只要程序存到硬盘中,CPU就能认识呢?

答案是CPU仍然看不懂这些程序,因为以“1”和“0”形式存储的程序和以“1”和“0”写成的语言完全是两回事,两者的区别类似于汉语书和英语书都用纸和油墨印制,但依然是两种不同的语言,不会英语的依然看不懂英语书。

要让CPU能看懂代码,要做相当多的工作。

现在的程序都是由C++和Java等高级语言写成,这些语言是为方便人类编程发明的,不是为方便电脑执行而设计。

说到这里,需要进一步说说机器语言和高级语言的差别。机器语言的最大特点是面向计算机硬件编程,简单说就是程序员需要通晓计算机硬件知识,写的程序要真实表示数据是如何被计算机操纵的。对程序员来说这就比较头大,毕竟上得了“厅堂”下得了“厨房”只有少数大神能做到,加上机器语言纯用“0”和“1”序列组成,既对视力是一种摧残,也是对编程趣味的扼杀。

于是,有一帮人开始琢磨了:能不能将计算机硬件从编程中分离出来,让硬件知识小白也能编程?

最先开窍的是蓝色巨人IBM,它在其System/360计算机中引入了ISA(Instruction Set Architecture)概念,将编程所需要了解的硬件信息从硬件中抽象出来,这样编程人员就可以面向ISA编程。由于ISA是用来描述编程时用到的抽象机器(不是具体的电脑CPU),包括了一套指令集和一些寄存器,因此,程序员只要知道ISA,不需要了解具体的硬件知识(每一两年硬件都会换新),就可以编写程序,在ISA相同的电脑上运行。

这样一来,程序员不必了解过于专业的计算机硬件知识,不需要下得了厅堂,可以专心在“厨房”烹调程序大餐。

由此也可以看出,程序员很多都是不了解计算机硬件的,所以妹子们不要指望自己的程序员男朋友给你DIY电脑,或者电脑坏了,他能给你省下一笔修理费。他说不会修,那就是真的不会修。

极客漫画《编程语言之战》。

自从不用懂硬件也能编程的高级语言出现后,人类开始了编程上的放飞自我,经过数十年发展,高级编程语言已超过2500种。

但矛盾出现了,CPU能理解的机器语言还是那个机器语言,几十年来没有变化,怎么办?

其实,早在高级语言出现之前的汇编语言时代,聪明的计算机研发人员就开发出了专门的程序,用来将汇编语言和高级语言翻译成机器语言,其过程相当于将英语名著翻译成汉语著作。这种翻译程序相当于人类中的翻译家。

编译器有两种方法用于翻译:编译和解释,相应的名称是编译器和解释器。

两者的区别是,编译是在执行前把整个源程序(高级语言程序)翻译成目标程序(机器语言程序),而解释是一次只翻译和执行源程序中的一行。

打个形象的比方,解释器相当于发布会的实时翻译,演讲的嘉宾说一句,实时翻译马上翻译一句。编译器则相当于著作翻译家,整本翻译完成后,再让出版社印刷上市。

将高级语言翻译成机器语言的过程。个人手绘比较粗糙,大家凑合看。

重点来了,从以上的内容可以看出,由于CPU不能直接理解用高级语言写成的代码,必须由翻译程序翻译成机器语言,因此翻译程序可以极大地影响甚至决定处理器性能的发挥。如果没有一个好的翻译程序,那么CPU的性能再强大,也好比茶壶装的饺子,倒不出来。

正因为如此,谷歌在安卓4.4之后,抛弃了Dalvik虚拟机,改为ART,实际是将翻译程序从解释器切换到编译器,发挥了芯片的性能,提高了程序运行效率。

现在,手机大厂包括华为、OPPO和vivo都开始重视编译器开发,说到底就是为了发挥芯片性能,让它不再成为倒不出饺子的茶壶。

最后总结一下,用翻译程序把程序员编写的程序翻译成二进制代码的机器语言后,CPU就能认识了,而且翻译程序的优劣可以影响乃至决定CPU性能发挥。

其他网友观点

你看看海上船只之间通过打灯光沟通是怎样的,CPU执行代码也是那个原理。

关键是约定一套信号协议。CPU只按传入的二进制代码执行指令,商家约定好了一套指令体系,不管什么编程语言都通过某种方式把代码编译为CPU能懂的二进制指令指挥CPU工作。协议跟人与人的交流一样,是有规矩的。举个例子,发出一串指令,如果是以1开头,则表示做什么,比如做加法,那么後面接着会发过来两个数,CPU做加法後把结果存入特定的寄存器,程序会有後续指令去这个寄存器提取结果,放入指定的内存中,CPU按照这样的约定解析传入的一连串二进制数据,并一一执行。CPU能直接做什么,根据这套指令体系来,不能直接做的,程序员负责编写完整解决方案让CPU能做出来,这就叫编程,整个指令序列叫程序。

CPU不认识你什么语言代码,那是给人阅读的,不是给计算机阅读的,计算机只懂编译过的二进制指令,还必须是按照商家设计好的指令体系编制的指令序列才行。没有什么编程语言是高大上的,它好不好用,在于编译器或解释器把这些人类代码翻译为机器码有多高明,守恒律在这方面仍然起作用,你写的高级语言代码越少,翻译给机器执行的指令实际上越多。C入门最基础的hello world程序,不要以为写的很短就很得意,这程序编译後的二进制机器码有5K,printf()函数的源代码有多长,可以自己去看看,但实际上你输出一个字符串用不着完整的printf()功能,这函数其实一个低效的解释型程序。

×
织梦二维码生成器