021-3391 0332ENGLISH

杏彩体育平台app编译原理一:想初步了解编译原理?看这篇文章就够了

  作为程序员,不管是前端开发工程师还是后端开发工程师,编译技术都与我们的工作息息相关。在实际工作中也经常会碰到需要编译技术的场景。比如,前端开发工程师想要了解TypeScript是如何把一门语言翻译成另一门语言的,以及babel是如何编译JavaScript的等等。学习编译技术有助于提升我们的职场竞争力,更有助于程序员在技术的道路上走的更远。那么学习完本篇文章你会对编译原理有个初步的认识,比如:

  日常开发过程中我们使用的语言一般都是高级语法比如 JAVA、Python、PHP、JavaScript等等,但是计算机只能识别0、1这样的机器码。那么这些高级语言是如何翻译成机器能识别的0、1等呢?这就用的了编译,首先我们通过下面这幅图看下编译与计算机程序语言的关系,有助于我们直观的了解编译的作用。

  编译:专指由高级语言转换为低级语言,整个程序翻译。常用的例如:c、c++,delphi,Fortran、Pascal、Ada

  解释:接受某种高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这个句子的执行结果,然后再接受下一个语句。类似口译,一句一句进行解释。常用的例如:python 解释以源程序作为输入,不产生目标程序,一边解释一边执行。优点:直观易懂,结构简单,易于实现人机对话。缺点:效率低(不产生目标程序,每次都需要重新执行,速度慢)

  了解了编译与程序设计语言的关系,那么我们接下来再来看下编译器在语言处理系统中所处位置,如下图

  然后进行语义分析根据句子结构分析出句子中各个短语在句子中充当什么成分,从而确定各个名词性成分同各个核心谓语动词间的关系语意关系

  实际上编译器在工作的时候也是经过了以上几个步骤,我们成为阶段(计算机的逻辑组织方式,在实现过程中多个阶段可能会被组合在一起实现),可以分为两大部分:分析源语言、生成目标代码,在编译器中他们分别对应编译器的前端和后端两个部分。编译器的结构如下图

  了解了编译器的结构,让我们从编译器的前端开始讲起,看看词法分析、语法分析、语义分析等各个阶段都做了什么。

  编译的第一个阶段,从左到右逐行扫描源程序的字符,识别出各个单词(是高级语言中有是在意义的最小语法单元,由字符构成),确定单词的类型。将识别的单词转换成统一的机内表示即词法单元 简称Token

  多词一码:例如,所有的标示符统一作为一类单词分配同一个种别码,为了区分不同的标示符,用token的第二个分量“属性值”存放不同标示符具体的字面值

  一型一码:不同类型的常量他们的构成方式是不同的,例如,我们为每种类型的常量分配一个种别码,为了区分同一类型下的不同常量,也用token的第二个分量“属性值”存放每个常量具体的值 下面图中是一个词法分析后得到的token序列的例子

  描述词法规则的有效工具是正规式和有限自动机。正规式:用来确定单词是否和程序语言规范。有限自动机:通过有限自动机进行单词和正规式比较

  语法分析器从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree),语法分析树描述了句子的语法结构

  计算机通过语法树来进行分析,即语法分析过程也可以用一颗倒着的树来标示,这颗树叫语法树。正确的语法树叶子节点数必须是表达式的符号,例如

  参数和返回值信息,参数个数、参数类型、参数传递方式、返回值类型、... 语义分析阶段收集的标识符的信息都会存储在一个符号表里,每个标识符都对应符号表中的一条记录,记录的每个字段记录标识符的每个属性,符号表通常带有一个字符串表用来存放程序中用到的标识符和字符常数,Name 就会被分为两个部分,一部分存放标识符在字符串表中的起始位置,另一部分用来存储标识符的长度,符号表如下图:

  除了符号表还有常量表(登记各类常量表);标号表(登记标号的定义和应用,不常用目标);入口名表(登记过程的层号、程序符号表入口等),各种表的生成大部分在词法分析阶段但是在后面各个阶段都有维护;中间代码表

  通常和语义分析一起实现。对语法分析识别出的各类语法范畴,分析他的含义,进行初步翻译,产生介于源代码和目标代码质检的一种代码

  三地址码 (Three-address Code):三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)

  对前面生成的中间代码进行加工变换,以便在最后极端产生更为高效的目标代码 ,需要遵循等价变换的原则,优化的方面包括:公共子表达式的提取、合并已知量、删除无用语句、循环优化。

  可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码

  如果源程序有错误,编译程序应设法发现错误并报告给用户。由专门的出错处理程序来完成。错误类型:

  指对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标代码。遍与阶段的含义毫无关系

  多遍扫描: 优点:节省内存空间,提高目标代码的质。


杏彩体育平台app 上一篇:确定和不确定的有限自动机以及正则表达式——形式语言 下一篇:百度出品Nature重磅 -- 优化的mRNA设计

相关推荐