导航:首页 > 源码编译 > cpu怎么编译代码

cpu怎么编译代码

发布时间:2023-05-21 21:01:04

‘壹’ C语言如何编译成可以直接在CPU运行的二进制码

你编译好的可执行文件就是二进制文件,包括机器码指令和数据。Linux上生成的一般是ELF格式,带文件头和段记录,你可以用strip什么的去掉。

‘贰’ 什么是代码,代码怎么写,怎样写入电脑

代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括唯一确定性、标准化和通用性、便于识别与记忆、力求短小与格式统一以及容易修改等。

简单的说,你学会一门计算机语言然后就可以开始写代码了。写代码的过程叫做编程,编程是一项非常严谨的工作,一丁点错误都会导致你整个程序的崩溃。

写好了代码后,就可以用相应的编译器写入电脑了。编译器能起到把源代码编译成能直接被计算机或虚拟机执行的目标代码的作用。如果一切顺利,经过编译的代码就生成了程序,就可以直接被电脑执行了。


(2)cpu怎么编译代码扩展阅读

大致说来,从人的易用性来分,电脑语言好用程度从难到易可以分为三类,一类是低级语言,如汇编语言、机器语言,一类是中级语言,如C语言,还有一类为高级语言。

一般来说,我们都是学习的高级语言。电脑语言的级别越高,越接近人类语言,但灵活性与效率也越低。

电脑本身是没有思维能力的,它是严格按照人的预先设定指令工作的。这些指令都是用电脑语言按一定的语法规则写成的。如果你写出的程序有误,电脑就不能正确工作。因此学习编写电脑软件,能培养我们的逻辑思维能力与严谨、周密的思维习惯。

如同任何一种语言,电脑语言也有自己的名词,自己的基本词汇,自己的语法结构。并且它们的语法结构大致相同。

‘叁’ CPU芯片是用什么语言编译的

直接在电脑上编译,“开始”-“运行”,输入“cmd”,还要输入masm xx.asm,就可以编译了。
但是提示你要小心,因为这是在cpu上直接运转,如果程序出错,会直接毁坏cpu,要慎重的使用

‘肆’ CPU是怎么看懂代码的

备注:这是我问答内容的一个精编版,增加了一些内容,所以和原内容略有不同。

去年底,有中国开发者已经开发出文言文编程语言,并在GitHub上摘得了5500星,在国内引起不小反响。这件事给普通人的印象是, 科技 发展日新月异,电脑CPU太厉害,都能读懂文言文了!

CPU真的能看懂文言文代码吗?答案是CPU既看不懂文言文代码,也看不懂英文代码。

现在的CPU晶体管数量动辄几十亿个,结构非常复杂,但内部传输的信号只有两种:高电压和低电压,分别代表数字信号“1”和“0”(也有相反的),因此CPU唯一能看懂的就是由“1”和“0”组成的代码。

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

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

机器语言是CPU唯一能看懂的语言,也是第一代编程语言。

图片说明:早期的计算机程序员使用机器语言编程,将用0和1数字编成的程序代码打在纸带或卡片上(打孔代表1,不打孔代表0),再将它通过纸带机或卡片机输入计算机,进行运算。

机器语言的最大特点是面向计算机硬件编程,简单说就是程序员需要通晓计算机硬件知识,写的程序要真实表示数据是如何被计算机操纵的。对程序员来说这就比较头大,一方面不仅需要通晓计算机硬件知识,另一方面如果计算机使用了不同的硬件,那么就得重新编程。

毕竟上得了“厅堂”(搞掂硬件)下得了“厨房”(玩得转软件),只有少数大神能做到,加上机器语言纯用“0”和“1”序列组成,非常单调枯燥,不仅扼杀了编程的趣味,而且对视力也是一种考验,稍微一眼花,看错1或0的排列位置,就会制造一个大BUG。

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

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

这样一来,就出现了汇编语言,但汇编语言用符号写成,还是不够接地气儿,于是高级语言就诞生了。高级语言的诞生,使程序员将精力从复杂的计算机结构转移到要解决的问题,从而可以专心烹调程序大餐。

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

自从高级语言出现后,人类开始了在编程语言上的放飞自我,经过数十年的发明创造,现在的高级编程语言已超过2500种,像比较知名的C++和Java等,都属于高级语言。

但问题出现了,CPU能理解的机器语言还是那个机器语言,几十年来没有变化,让它读懂高级语言那是不可能的。

怎么办?

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

说白了,这种翻译程序相当于人类中的翻译家。

翻译程序有两种工作方法:编译和解释,相应的程序名称是编译器和解释器。两者的区别是,编译是在执行前把整个源程序(高级语言程序)翻译成目标程序(机器语言程序),而解释是一次只翻译和执行源程序中的一行。

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

经过翻译程序的努力,现在CPU能看懂程序员写的程序了。当然,用开头提到的文言文编程语言编写的程序想要让CPU看懂,还得多一道翻译步骤,即要么翻译成Javascript,要么翻译成Python。多转了一圈,不知道程序执行效率如何。

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

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

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

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

图片源自网络,版权归图片作者所有。

‘伍’ 简述cpu实现分支的过程

可以看到在执行php时,  是一条一条去执行的

1.先判断  $a  是否 等于 1

2.如果不等于1,为false, 就JMPZ 到第4条命令,去比较  $a 是否 等于2

   如果等于1, echo "a is 1"; 然后 无条件跳转 JMP 第9行 return 了

3.如果 $a 不等于2 ,即为false, 就JMPZ 到第8条命令, echo "a is x" 

   如果  $a 等于2,直接echo "a is 2", 然后执行 JMP 第9行 return 了

所以,php编写的程序,对C函数来说,还是要一步的一步去执行的,关于具体php的分支实现,请点击这里

 

如果这个文件被执行100次,有90次 $a=3, 那么解释器每次都要判断 $a 是否等于1和  $a 是否等于2, 尽管第三个分支是满足条件的,如果是C编写的程序, CPU会针对某种策略挑选一个分支来执行, 对应上面的分支来说,CPU会直接取出第三个分支的指令,然后执行。

     从486开始,CPU开始具备流水线这个特性,指令流水线由5,6个不同功能的工作单元组成,将一个x86指令也拆分成5,6个步骤,分别送往不同的工作单元,来达到同时执行多个指令的目的,现在的CPU支持30级的流水线,也就意味着流水线上有30个工作单元,对应的X86指令也拆分成30个步骤。

注:CPU执行的是二进制数据,代码经过汇编编译后,生成一条条二进制指令

   例如 int a=1; 对应的汇编是mov $1, %eax; 对应的机器码可能是00011100011

在执行文件时,根据局部性原理,想关的指令都要加载到CPU缓存中,

一般一条指令的完成 分四个步骤:

1.取指令

2.翻译指令 (看是赋值,还是计算,从内存什么地方取数据)

3.执行指令

4.写指令结果 (要么写回内存,要么写到寄存器)

   取指令翻译指令执行指令写指令结果

                    命令1      命令1

                    命令2

取指令单元取出指令1后,翻译指令单元开始 翻译指令1时,取指令单元可 取出指令2了

 

如果CPU不这么做,等到指令1完成上面四个步骤后,指令2才开始进行,那效率太低了

 

流水化中的单元分的更详细, 更多的指令可以并行处理,但速度不见得快,因为有分支的出现,如果没有命中第一个分支,后面的指令将作废, 需要清空后面所有的指令, 然后中载命中地址的指令,再运行

 

      在有5个分支的情况下,若采取随机挑选一个分支 执行的话,每次赌该分支命中的概率只有五分之一, 于是CPU分支预测功能就出现了。

      分支预测分静态和动态

      静态分支预测:由编译器决定哪个分支可能被CPU命中,一般是第一个分支,即 if 后面的逻辑,而不是后面else的逻辑

      动态分支预测:在CPU硬件中开辟一块缓存,专门记录每个分支最近几次的命中情况,然后做出预测,显然这种方法能及时调整策略,有更好的远詹性,但CPU压力会大些,不过还好。分支地址只有在流水线指令执行阶段才能计算出来,为了避免等待,需要在译码阶段进行预测

Two-Level分支预测方法使用了两种数据结构,一种是BHR(Branch History Register);而另一种是PHT(Pattern History Table)。其中BHR由k位组成(可理解为记录K次某个分支的执行结果),用来记录每一条转移指令的历史状态,而PHT表含有2k个Entry组成,而每一个Entry由两位Saturating Counter组成。BHR和PHT的关系如图3‑10所示。

假设分支预测单元在使用Two-Level分支预测方法时,设置了一个PBHT表(Per-address Branch History Table)存放不同指令所对应的BHR。在PBHT表中所有BHR的初始值为全1,而在PHT表中所有Entry的初始值值为0b11。BHR在PBHT表中的使用方法与替换机制与Cache类似。

当分支预测单元分析预测转移指令B的执行时,将首先从PBHT中获得与转移指令B对应的BHR,此时BHR为全1,因此CPU将从PHT的第11…11个Entry中获得预测结果0b11,即Strongly Taken。转移指令B执行完毕后,将实际执行结果Rc更新到BHR寄存器中,并同时更新PHT中对应的Entry。

当CPU再次预测转移指令B的执行时,仍将根据BHR索引PHT表,并从对应Entry中获得预测结果。而当指令B再次执行完毕后,将继续更新BHR和PHT表中对应的Entry。当转移指令的执行结果具有某种规律(Pattern)时,使用这种方法可以有效提高预测精度。如果转移指令B的实际执行结果为001001001….001,而且k等于4时,CPU将以0010-0100-1001这样的循环访问BHR,因此CPU将分别从PHT表中的第0010、0100和1001个Entry中获得准确的预测结果。

由以上描述可以发现,Two-Level分支预测法具有学习功能,并可以根据转移指令的历史记录产生的模式,在PHT表中查找预测结果。该算法由T.Y. Yeh and Y.N. Patt在1991年提出,并在高性能处理器中得到了大规模应用。

Two-Level分支预测法具有许多变种。目前x86处理器主要使用“Local Branch Prediction”和“Global Branch Prediction”两种算法。

‘陆’ C#源代码编译成为本地代码的编译过程

很有兴趣的话,可以去阅读下JeffreyRitchie的《ClrviaC#》,目前出到第三版,英文好的话强烈推荐看英文版的,而且我有该电子书和实体书。

下面讲下我的理解:大致上不会出什么差错的,细节部分你可以参照上面的书籍!

1.首先,c#源码经过c#编译器被编译成托管模块(IL中间代码、元数据(Metadata))

2.然后,使用C#编译器以及程序集链接器(AssemblyLinker----AL.exe)将上述托管模块以及项目的资源文件Combine(整合)成一个程序集(Assembly)

上述程序集就是你所看到的exe文件或者dll文件等等,程序集中包含了manifest描述文件,是该程序集内容以及关系的一个清单,具体的内容你可以参见JR的书跟Java中的类似!

双击该exe运行的时候:

3.最后,运行时,CLR装载对应的程序集,使用内部的三个即时编译器(常用的为JIT),再去根据本机的环境去进行相应的优化(针对CPU优化等等),即时的翻译成本地机器指令去执行。

还有一个本地化代码生成工具,NGen.exe~~

这个最好能去看看那本JR的神作!细节不是我三言两语能讲清的~~

‘柒’ 源码怎么编译

使用编译器如VC++6.0,VC++2008

阅读全文

与cpu怎么编译代码相关的资料

热点内容
银河v10驱动重编译 浏览:889
电脑上文件夹右击就会崩溃 浏览:689
右美维持算法 浏览:938
php基础编程教程pdf 浏览:219
穿越之命令与征服将军 浏览:351
android广播重复 浏览:832
像阿里云一样的服务器 浏览:318
水冷空调有压缩机吗 浏览:478
访问日本服务器可以做什么 浏览:432
bytejava详解 浏览:448
androidjava7 浏览:385
服务器在山洞里为什么还有油 浏览:886
天天基金app在哪里下载 浏览:974
服务器软路由怎么做 浏览:292
冰箱压缩机出口 浏览:228
OPT最佳页面置换算法 浏览:645
网盘忘记解压码怎么办 浏览:853
文件加密看不到里面的内容 浏览:654
程序员脑子里都想什么 浏览:434
oppp手机信任app在哪里设置 浏览:189