前言
一、什么是编译器前端
让机器理解代码并生成可执行文件,这是一件很困难的事情,所以编译器是一个非常浩大的工程,它内部工作过程十分复杂 。
不过计算机科学中有句名言,任何一个问题都可以通过增加一个中间层/抽象层来解决,这也是最常用的计算机分层思想 。
All problems in computer science can be solved by another level of indirection. —— David John Wheeler所以为了降低编译器工程的复杂性,提高发展效率,一般把编译器分为两个完全解耦的两个部分
- 编译器前端 :只负责理解代码,不考虑各种CPU指令不兼容等问题
- 编译器后端 :只负责生成可执行文件,不考虑各种语言特性
这样,两个部分只需要约定好数据格式,就可以大幅度提高编译器的发展效率,编译器整个工作流程也变得非常简单清晰了,如下图所示,如果对图中的编译器前端不理解没关系,接下来的 第二节《编译器前端的原理》 会对这部分进行讲解
文章插图
结论 :所以编译器前端就是编译器中的前端部分,负责理解代码并生成中间语言
二、编译器前端的原理
既然编译器前端的工作是理解代码,那么它的原理是什么呢,首先看下面一段简单的C语言代码
int age = 18;复制代码
从人类阅读代码的角度来看,我们是如何理解上述代码的呢1、局部理解
- 看到 int 关键字
- 看到 age 标识符
- 看到 = 赋值符号
- 看到 18 字面量数值
- 看到 ; 结束符
局部理解的过程,就是词法分析的过程2、全局理解
通过联系孤立的、局部的理解结果,可得到一个整体 int age = 18 ;,对其在脑海中进行全局理解后,发现它符合C语言的整型赋值语法
整型赋值语法 -> 关键字 标识符 赋值符号 字面量关键字 -> int | long标识符 -> [a-zA-Z_]+[a-zA-Z+_*0-9]*字面量 ->[0-9]+复制代码
所以通过全局理解,最终可知道上面代码是一个整型的赋值语句全局理解的过程,就是语法分析的过程3、总结
结合人类理解代码的过程,编译器前端主要可以分为局部理解和全局理解两个步骤,其中
- 局部理解会生成一个一个的理解结果,称为Token
- 全局理解会把孤立的token联系成为一个整体,进行语法规则匹配,如果符合语法则理解成功,否则理解失败
词法分析器就是在做对字符序列的局部理解,每完成一次局部理解,就生成一个Token 。常见的Token包括操作符、符号、空白符、关键字、标识符、数字、浮点数、字符串、字符等 。
所以词法分析器的工作内容也比较简单,只要能把输入的字符序列,生成一个有序的token列表即可 。
四、词法分析器的原理
1、直接扫描法
直接扫描法的思路类似二重循环的暴力法,每一轮的扫描都是如下过程
- 先第一层的扫描,根据第一个字符判断属于哪种类型的token
- 进入第二层的扫描,向后依次读取,直到读出一个完整的token为止,跳出第二层循环
- 继续开始第一层的扫描
let end = s.length-1;for(let i=0; i<=end; i=n){ let tokenType = justTokenType(s[i]); switch(tokenType){ case "string": let queue = []; for(let j = i; j<=end-1; ++j){ if(!match){ break; } queue.push(s[j]); } let token = queue.join(''); tokens.push(token); n=j+1; break; }}复制代码
推荐阅读
-
-
-
-
-
-
-
-
-
-
- 暴风魔镜app旧版本? 暴风影音飞屏版电脑端+魔镜端使用教程且魔镜APP怎么用
- 如何清理钉钉的空间,浙政钉清理缓存会删除记录吗
- 深入人心的励志语录句子,保证你看了还想看!
- 学前教育专业学什么,学前教育专业主要课程是什么
- 魔渊之刃困难5怎么打,宠物天才怎样,打败第十五层
- 豆瓣2022经典的软文推广素材励志,句句经典走心!
- 陆风x7电源故障怎么解决,陆风x7出现电源故障是什么原因
- 豆瓣2022排名榜的软文推广素材励志,句句深入人心!
- 语文朗读语调主要有哪几种