国外精选视频课:编译原理入门1

编译原理的概述

编译指的是将程序员用某种高级语言的源代码转换成目标代码,即计算机能够人认识的可执行机器代码
在这里插入图片描述
编译是由一个叫编译器的程序完成的
因为程序需要被编译运行在特定类型的处理器上,所以,具体如何实现编译器还取决于目标机器的体系结构

在这里插入图片描述

What makes a good compiler?

编译器设计之初就是为了必须让高级语言所写的程序正确运行

works correctly

必须检测到所有的静态错误,也就是说他应该识别所有的不符合变成语言规则的错误,不要指望编译器来捕获动态错误,这些错误只能在运行时检测到,如果没有被捕获到可能后导致程序崩溃,也不要指望编译器去发现代码逻辑上的错误,也就是说这些错误不会使程序运行时崩溃,但会导致程序输出结果有误

Detects akk statuc errors

Produces meaningful diagnostics

一个编译器应该做出明确的有意义的诊断,如果程序在编译时错误就被发现,那么输出的错误信息就应该是明确的,并且精准地之初源代码错误的位置

Generates optimal machine code

一个好的编译器会生成最佳的机器码

Compiles quickly

编译必须要快

Easy to use

编译要简单运用

modular

各个组件之间建立一个耦合度尽可能小的模块编译器需要很多的知识储备
这种方式允许编译器的各个部分可以被多种编译语言和多种目标机器架构平台进行重用

Documented and easy to maintain

如同好的软件一样,一个好的编译器必须要有一个详细的文档,而且易于维护

Stages of Compilation

词法分析

我们写了一个简单的英文句子,然后把它分割成一个个的单词和标点符号

语法分析

用来检查这个句子是什么意思

机器码生成

这一过程就是将一句话翻译成另一种语言

编译器生成了能够被处理器所理解的0和1的机器码,但它同时也对该机器码进行了速度和空间上的优化

因此,代码生成以及优化通常被作为一个阶段来认知
在这里插入图片描述

编译器的一个阶段不是跟着一个阶段的

例如,词法分析和语法分析是同时进行的

在高级编译语言编译的时候,要进行词法和语法分析,但我们的目标机器所处架构平台是独立的,因此,词法和语法分析被称为编译器的前端操作

在这里插入图片描述

另一方面,代码生成与优化仅在根据目标机器的指令集生成机器代码时使用
所以这个阶段在编译过程中被称之为后端操作

前端操作

程序源码将作为一个文本流来输入到词法分析器中,词法分析器将源程序的各个单词转换成词法单元流并输出,并在请求时,将词法单元流一个个送入到语法分析器中
在这里插入图片描述
语法分析器会构建出用于代表源程序的抽象语法树

抽象语法树

抽象语法树是一种动态数据结构,用来表示源程序的层级结构
在这里插入图片描述
当语法书构建完毕,编译器会使用它检查源代码是否遵从了编程语言的语法规则

编译时,词法分析器同时会创建一个符号表,符号表在编译过程的所有阶段都会被频繁的访问和修改,符号表包含了程序员在源代码中使用的名称的信息,例如变量和函数名
在这里插入图片描述
对于某些编译器,抽象语法树是源代码到机器码的唯一中间表现形式,抽象语法树是语法分析器的输出,也是编译器前端的最终输出,接下来抽象语法树将被直接转换为机器码

然而,有些编译器在前端做了更多的工作

在构造抽象语法树之前,编译器可能会先构建一棵简易的树,我们称它为解析树(语法分析树),它是源程序的一种轻量表示
在这里插入图片描述
通过编译抽象语法树获得的信息与符号表的信息进行组合,生成源代码的另一种中间表示形式

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44522477/article/details/112060848