计算机内部程序代码,计算机为什么能够读懂程序代码?

01 引子

上一回,我们的主人公小A初次亮相,凭借基础的前后端理解,从技术实现的层面为我们剖析了微信扫码登录的原理和机制。可能很多人因此会好奇,小A到底是做什么的呢?为什么能够弄懂这些原理呢?

其实,小A是一名业余码农。为什么要叫业余码农呢,是因为他觉得自己属于半路出家,很多计算机基础思想都不够专业,还有很大的进步空间,因此称自己为业余码农。

但是兴趣总是最好的老师,这不,小A正又盯着屏幕上的几行代码发愁:#include int main(){std::cout << "Hello World!" << std::endl;return 0;}

编译并运行这段 C++ 代码就能够完美打印出Hello World!,似乎没啥毛病呀!

“计算机是怎么知道我敲的这些代码的意思呢?”小A 苦皱着眉头,喃喃道。原来,我们的业余码农小A 是没想明白计算机是如何将这些一串串的字符转变成计算机能够执行的机器码的,这其实不就是编译原理嘛。

小A 回想起之前上过的数电模电课,知道计算机的世界里都是数字化的,也就是说计算机只知道二进制 0 和 1 。不同数量 01 的组合在计算机的内部构成了不同的指令,而不同指令的组合又构成了不同的操作。

这就好比流水线的生产模式,假如把计算机看作一条流水线,那么在这条流水线上有不同的工位,每一个工位代表着不同的指令。生产不同的产品就需要不同工位的一同参与,可能按顺序执行,也有可能并列执行。

想到这,小A意识到其实这些由 0 和 1 构成的指令应该就是计算机能够执行的机器码。不过那这些机器码好像与上面的 C++ 代码还相差甚远,中间肯定是经历了一系列的转换。嗯?这个过程有点像是翻译的过程,好像是将程序代码翻译成了机器码!

小A 茅塞顿开,好像又找回了之前英语四级怒考 605 分的自信。看来,英语没白学!

计算机理解程序代码的过程是不是就像是将英文翻译成了另一种语言呢?一想到英语的那些高阶语法,小A 就开始忍不住头疼,“不会这编程还得学个什么时态转换语态切换从句倒装吧...”。

不过头疼归头疼,该学的还是得耐着性子学。小A 知道,在计算机真正运行 C++ 程序代码之前,还需要经过复杂的编译过程,这个编译过程似乎对计算机理解程序代码起着关键性作用。

02 C++编译过程

找到了分析问题的方向,小A 迫不及待的到处查询 C++ 编译过程到底是如何发生的。他发现 C++ 的整个编译过程包含多项操作,主要可分为四个阶段:1.编译预处理

2.编译优化阶段

3.汇编过程

4.链接过程

这四个阶段按顺序执行,每一个阶段分别处理上一个阶段的输出代码,并输入下一个阶段。每个阶段的作用分别为:

0x00 编译预处理

读取 C++ 源代码,对其中的伪指令和特殊符号进行处理。这个预处理实际上可看作是将源程序中的一些特殊指令或者符号进行替换。经过预处理的替换,就会生成一个没有特殊指令、没有特殊符号的输出文件。这个文件的含义和源文件本质上是相同的,但内容和表达方式有所不同。特殊指令:称为伪指令,包括宏定义指令、条件编译指令、头文件包含指令。比如上述 C++ 代码中第一行的 #include 就是头文件包含指令,会在编译预处理阶段被替换。

0x01 编译优化阶段

经过预编译后的输出文件会经过编译优化阶段,将原始代码转化为汇编语言。这个阶段是整个编译过程的核心,也是起到 “ 翻译 ” 作用的关键。整个阶段的工作过程一般可分为六个步骤:1.词法分析

2.语法分析

3.语义分析

4.中间代码生成

5.代码优化

6.目标代码生成

在进行编译时,会经过词法分析、语法分析和语义分析将高级语言代码一步步分解剖析,按照定义的语法将不同的代码语句拆解,并根据一些标准来对代码语句进行分析检查,最后生成中间形式的代码用于优化。而优化步骤则是对中间代码进行优化改进,力图提升生成的汇编代码的效率。

0x02 汇编过程

汇编语言可看做是一种低级语言,十分接近于机器码的实现。汇编语言:用于硬件底层编程的低级语言,常用助记符代替机器指令,用地址符号或标号代替指令或操作数的地址。特定的汇编语言和特定的机器语言指令集一一对应,通过汇编过程转换成机器指令。

由此可见,汇编过程实际上就是将汇编语言翻译成为了机器码,这些机器码就是 C++ 源代码的底层表达,理论上计算机可以通过执行这些机器码来实现对源代码的运行。

0x03 链接过程

但是要知道,一个普通的高级语言程序,都不单单只包含一个文件。可能某个源文件就会调用其它库文件中的函数或者其它源文件中定义的符号函数等。因此多个文件在经过编译汇编之后,还需要通过链接过程将不同的目标文件连接起来,建立起引用和调用的联系。直至这步完成之后,程序语言代码才能够真正意义上的被计算机理解和运行。

反复思索 C++ 编译的整个过程,小A 感觉那几行简洁的代码仿佛经过了千锤百炼一般,虽然最终似乎面目全非,但是却变成了最原始最纯洁的样子。

小A 忍不住一阵感叹整个编译过程的环环相扣以及精巧绝伦,同时对编译阶段的原理产生了更大的兴趣。

03 编译原理

编译阶段的过程是通过编译器所实现的,编译器通过六个步骤将由数字、字符串以及一些关键字组成的字符流进行解析,最后经过优化生成汇编代码。

8b4f1ecfb7abbbdd67c6bbbf4c2b404d.png

图 一个编译器的各个步骤

那是如何进行解析的呢?小A这时候想到了中英文中的主谓宾结构,难道也可以把程序代码划分为主语、谓语、宾语吗?不妨举个栗子来分析好了,小A 熟练的写下了一行代码:position = initial + rate * 60

不如就来分析这一行赋值语句的翻译过程吧。

0x00 词法分析

最先输入编译器的是源程序代码的字符流,如上述例子所示的是由英文、符号和数字组成的字符串。词法分析的过程就是将字符流中有意义的词或符号进行提取并分类表示,同时保存在符号表中,并映射为『词法单元』。

比方说上述代码中的词position,可映射为词法单元。id 表示的是标志符(identifier),而 1 表示符号表中的第一个条目。

但是,符号=却不会保存在符号表中,因为其不具有值的概念,只是一个赋值符号。所以其对应的词法单元直接用它本身来表示<=>。

对上述代码所有词及符号进行词法分析后,可获得词法单元:词及符号词法单元position

=< = >

initial

+< + >

rate

*< * >

60<60>

对应的符号表为\\\1position...

2initial...

3rate...

因此该上述赋值语句代码可用词法单元表示:<=><60>

这样一来,通过词法分析就把代码语句给剥离抽象化,清晰的展现出语句的结构性。

0x01 语法分析

语法分析,故名思义就是检查语言的表述是否符合已经设定的语法规则。而在语法分析器中,这样的规则称之为『文法』。文法:通过集合来描述语法结构的规则。如主谓宾结构就可看作一种文法。

每一种编程语言都有其对应的文法,根据制定的文法规则可以对词法分析产生的词法单元串进行解析。文法解析的方法有多种,优劣势不一,但目的都是为了构建一颗语法分析树。这同时也是语法分析阶段输出的结果。

对于上述赋值语句而言,根据不同运算符的执行顺序,将赋值运算符=作为根节点,可得到语法分析树:

获得语法分析树之后,整个代码结构用树的形式进行表示,从而方便后续进一步对源程序进行分析。

0x02 语义分析

语义分析是使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。如果说语法的分析是对程序语句的结构进行分析,那么语义分析则是对语句的逻辑性和合理性进行分析。比方说:语句:猴子是程序员

语法分析得到主谓宾结构,『猴子』是主语,『是』是谓语,『程序员』是宾语。从语法上来说并没有错误。

但是很明显,语义上是有问题的。

因此在语义分析环节很重要的部分就是对程序语句进行类型检查,比方说应保证运算符两边的数值类型一致。这本质就是要检查出『猴子是程序员』这样的错误。

对于上述的赋值语句,假设position、initial、rate已被声明为浮点数类型,那么表面上整数60应与rate的类型不同,在语义分析的时候就会找出这样的问题。

只不过在很多语言中允许自动类型转换,会将整数60转换成浮点数从而满足语义的要求。因此经过语义分析后,语法树会新增inttofloat节点以达到类型转换的目的:

0x03 中间代码生成

在翻译源程序的过程中,往往会使用多个中间表示形式进行以方便不同的运算处理。一般常用一种称为『三地址代码』的中间表示形式将语法树的结构进行改写。该形式根据运算完成的顺序,生成临时名字以存放运算的值。如上述赋值语句的中间代码:

t1 = inttofloat(60)t2 = id3 * t1t3 = id2 + t2id1 = t3

0x04 代码优化

代码优化阶段试图改进中间代码,以达到提高效率或者其它更有优势的目的。优化阶段会根据一些既有的规则去对中间代码进行改进,不同的编译器之间往往具有差异性。上述中间代码可以将inttofloat操作进行优化,使用浮点数60.0来代替整数60从而满足语义分析。中间代码优化为:

t1 = id3 * 60.0id1 = id2 + t1

0x05 目标代码生成

目标代码的生成是将中间代码翻译为汇编语言。在这个过程中,需要为变量合理地分配寄存器,选择内存位置。之后再根据汇编语言的操作完成翻译。上述赋值语句对应的汇编代码为:

LDF R2, id3MULF R2, R2, #60.0LDF R1, id2ADDF R1, R1, R2STF id1, R1

在上面的代码中,每个指令的第一个运算分量指定了目标地址以存放计算结果。这样的操作已经是从硬件层面对数值操作和运算执行。之后通过汇编过程即可获得真正的机器指令序列。

看到这,小A 已经快有些迷糊了。尽管例子里对赋值语句的编译过程看起来简单明了,但是一想到其它程序代码里无数的关键字、变量和函数调用还是忍不住微微叹了口气。

毕竟,这些内容还只不过《编译原理》的第一章。真正每一阶段的实现需要考究的东西还有太多。不过学习都是循序渐进的,学到这小A 已经大致清楚 C++ 程序从源代码到运行起来的经过了。

04 解释器

此外,他还发现一个彩蛋。原来除了编译器能够起到翻译的作用,还有一种称作“解释器”的东西同样可以起到翻译作用。

简单来说,编译器是将源代码完整转换为机器码;而解释器是将源代码直接生成机器码并交由硬件执行。因此编译器事先需要将整个程序编译成另外的代码,而解释器可一行一行读取程序,然后翻译执行。解释性语言编译性语言不生成目标程序生成目标程序

一边解释,一边执行整体编译,一次执行

每个语句执行时都要进行翻译可只翻译一次,可多次执行

一般程序执行速度慢一般程序执行速度快

跨平台性好跨平台性差

C/C++/elphi等为编译性语言Python/JavaScript / Perl /Shell等为解释性语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

符号主义对深度学习的意义浅谈

来源&#xff1a;混沌巡洋舰符号主义人工智能经历过古典时期的专家系统阶段&#xff0c; 中期的知识图谱阶段&#xff0c; 和近期深度学习和符号主义的再次联姻。那么一个很重要的问题是符号主义为什么会复兴&#xff0c;它对当下的机器学习又有何意义&#xff1f;参考阅读&…

400多家单位、30余万科研人员,10多年奋斗!北斗卫星核心器件实现100%国产!(附:北斗研发建设历程​)...

来源&#xff1a;EETOP国务院新闻办公室8月3日上午10时举行新闻发布会&#xff0c;中国卫星导航系统管理办公室主任、北斗卫星导航系统新闻发言人冉承其介绍&#xff0c;工程建设提前半年完成&#xff0c;彰显中国速度。“北斗三号2009年11月启动建设。10余年来&#xff0c;工程…

深度学习败于“捷径”

来源&#xff1a;AI科技评论深度学习的未来在哪里&#xff1f;这一话题已经有过了无数讨论&#xff0c;大部分讨论都承认当前的深度学习还不是真正的智能&#xff0c;必须转向理解、常识。但是只看当前AI成功的案例&#xff0c;似乎还无法窥探理解。近日&#xff0c;来自多伦多…

互联网是由多个计算机相互连接而成,计算机网络

第一章&#xff1a;三类网络&#xff1a;电信网络有线电视网络计算机网络互联网基本特点&#xff1a;连通性共享计算机网络的组成&#xff1a;若干结点和连接这些结点的链路组成结点分类&#xff1a;计算机集线器交换机或路由器等互联网internet&#xff1a;泛指由多个计算机网…

ftp服务器PDF文件在线查看

曾做过电厂的项目&#xff0c;有一些功能需要和甲方的厂家对接&#xff0c;其中就有需要实现甲方ftp服务器上的PDF、JPG等文件的查看功能。就PDF文件为例&#xff0c;这里使用的是pdf插件&#xff0c;需要将参数通过链接发给ftp&#xff0c;获取到PDF文件&#xff0c;并在后端处…

从MEMS专利数量分析我国MEMS传感器产业现状

来源&#xff1a;传感器专家网MEMS传感器是采用微机械加工技术制造的新型传感器&#xff0c;是MEMS系统的重要分支。MEMS传感器以其优异的性能&#xff0c;如体积小、重量轻、成本低、功耗低、灵敏度高、可批量化生产、易于集成和实现智能化等特点&#xff0c;逐步取代传统机械…

配置手工模式链路聚合示例(交换机之间直连)

组网图形 图1 配置手工模式链路聚合组网图 手工模式链路聚合简介配置注意事项组网需求配置思路操作步骤配置文件 手工模式链路聚合简介 以太网链路聚合是指将多条以太网物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而实现增加链路带宽的目的。链路聚合分为手工模式和LA…

知乎热议:科学网发布文章称「我国数学家证明 NP=P」,会带来怎样的影响?

来源&#xff1a;运筹OR帷幄2020年7月出版的《计算机科学》&#xff08;中国计算机学会会刊&#xff09;发表了国防科技大学教授、湘潭大学计算机学院特聘教授姜新文题为《哈密顿图判定问题的多项式时间算法》的论文&#xff0c;这标志着在数学和计算机科学领域中最为重要的难题…

2008r2服务器频繁自动重启,解决windows server 2008 更新后不断重启现象

今天遇到一台服务器提示windows2008r2系统更新失败&#xff0c;进入启动界面时提示&#xff1a;“未正确配置更新&#xff0c;正在还原更改&#xff0c;请勿关闭计算机&#xff01;”&#xff0c;不久就再次重新启动&#xff0c;然后不断自动重复这个过程。从保护数据安全的角度…

【代码笔记】iOS-自定义loading(IanAlert)

一&#xff0c;效果图。 二&#xff0c;工程图。 三&#xff0c;代码。 ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewController {//loading UIView *backViewLoad; } end ViewController.m #import "ViewController.h" //load…

专业|尧德中:脑器交互学,一个发展中的新学科

来源&#xff1a;人工智能人物尧德中专家简介&#xff1a;电子科技大学信息医学研究中心主任&#xff0c;生命科学与技术学院首任院长&#xff08;2001-2017&#xff09;&#xff1b;四川省脑科学与类脑智能研究院院长&#xff0c;神经信息科技部国际联合研究中心主任/教育部重…

服务器的创意工坊文件,Steam 创意工坊实现指南

简介Steam 创意工坊系统使用后端存储、前端网页的形式&#xff0c;便于存储、整理、排序、评分及下载游戏或应用程序。本文提供了为产品实现 Steam 创意工坊的技术细节。 在开始将 Steam 创意工坊与您的游戏整合前&#xff0c;请参见 Steam 创意工坊概览&#xff0c;了解更多您…

CCF-GAIR 2020 全球人工智能和机器人峰会今日开幕

于 2020 年 8 月 7 日-9 日召开的 2020 全球人工智能和机器人峰会&#xff08;CCF-GAIR 2020&#xff09;今日正式开幕。CCF-GAIR 2020 峰会由中国计算机学会&#xff08;CCF&#xff09;主办&#xff0c;香港中文大学&#xff08;深圳&#xff09;、雷锋网联合承办&#xff0c…

ajax获取返回随机数,AJAX

AJAXAJAX&#xff1a;即“Asynchronous Javascript And XML”(异步的JavaScript和XML)&#xff0c;是指一种创建交互式网页应用的网页开发技术&#xff0c;尤其是在一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。传统Web开发World Wide Web(简称Web)…

Neuron:迄今为止最大的颗粒细胞数据,发现海马齿状回神经元可过滤并放大空间信息...

来源&#xff1a;brainnews小柯生命 报道北京时间2020年8月6日晚&#xff0c;奥地利科学与技术研究所 &#xff08;IST, Austria&#xff09;的科研团队在《神经元》上发表论文&#xff0c;发现海马齿状回的神经元可以过滤并且放大空间信息。 出租车司机如何在错综复杂的大街小…

u盘服务器安装win7系统安装教程,最简单的u盘装win7系统详细教程及步骤

随着技术的进步&#xff0c;越来越多的安装电脑系统的方法&#xff0c;有硬盘方式安装&#xff0c;有一键重装系统软件&#xff0c;有U盘重装系统&#xff0c;有光盘安装方法&#xff0c;那么哪种方式最安全呢&#xff1f;答案肯定是U盘安装电脑系统方式最安全&#xff0c;因为…

周志华:“数据、算法、算力”人工智能三要素,在未来要加上“知识”| CCF-GAIR 2020...

来源&#xff1a;雷锋网作者 | 李雨晨如何将“机器学习“与“逻辑推理”相结合&#xff0c;是人工智能领域的“圣杯问题””编者按&#xff1a;2020 年 8 月 7 日&#xff0c;全球人工智能和机器人峰会&#xff08;CCF-GAIR 2020&#xff09;正式开幕。CCF-GAIR 2020 峰会由中国…

ISC 2020周鸿祎:以云端大脑为核心打造国家安全反导系统

来源&#xff1a;秦安战略“进入数字孪生时代&#xff0c;网络攻击影响力更甚核弹。”在第八届互联网安全大会&#xff08;ISC 2020&#xff09;上&#xff0c;360董事长兼CEO周鸿祎说道。360董事长兼CEO周鸿祎2020伊始&#xff0c;伴随一系列新基建政策的落地&#xff0c;各行…

b站的服务器在哪个位置,b站用的是哪个云服务器

b站用的是哪个云服务器 内容精选换一换介绍常见的安全组配置示例。如下示例中&#xff0c;出方向默认全通&#xff0c;仅介绍入方向规则配置方法。不同安全组内的云耀云服务器内网互通仅允许特定 IP 地址远程连接云耀云服务器SSH远程连接Linux云耀云服务器RDP远程连接Windows云…

丘成桐讲数学简史(2小时完整视频)

转自&#xff1a;数学杂说中国数学学者对于数学历史大都厥如&#xff0c;数学历史学家的重点在于考古&#xff0c;研究的是中国古代数学的断纸残章&#xff0c;对于古代文献的处理&#xff0c;不如一般歴史学家考证严谨&#xff0c;对于世界数学发展的潮流并不清楚&#xff0c;…