编译原理实战课
宫文学
北京原点代码 CEO
26065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

01 | 编译的全过程都悄悄做了哪些事情?

计算机语言的编译和自然语言的翻译的相同和不同之处
分而治之,找到解决的办法
希望了解每一个阶段存在的原因和要完成的主要任务
概要地讲解了编译的过程
对指令做重新排序
优化寄存器的分配
选择合适的指令
复用中端和后端的程序
写成与具体CPU架构无关的形式
内联
死代码删除
常数折叠
程序员写的代码不是最优的
源语言和目标语言的差异
用于优化
可以直接执行
处于源代码和目标代码之间的一种表示形式
做语义理解和语义检查
识别数据类型
引用消解
上下文相关的分析
附加语义规则到AST
理解源代码的语义
把Token串转换成抽象语法树(AST)
理解语法结构
把字符串转换为Token
读入源代码
一课一思
课程小结
生成目标代码
优化(Optimization)
中间代码(Intermediate Representation)
语义分析(Semantic Analysis)
语法分析(Syntactic Analysis)
词法分析(Lexical Analysis)
编译的全过程都悄悄做了哪些事情?

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。
正如我在开篇词中所说的,这一季课程的设计,是要带你去考察实际编译器的代码,把你带到编译技术的第一现场,让你以最直观、最接地气的方式理解编译器是怎么做出来的。
但是,毕竟编译领域还是有很多基本概念的。对于编译原理基础不太扎实的同学来说,在跟随我出发探险之前,最好还是做一点准备工作,磨刀不误砍柴工嘛。所以,在正式开始本课程之前,我会先花 8 讲的时间,用通俗的语言,帮你把编译原理的知识体系梳理一遍。
当然,对于已经学过编译原理的同学来说,这几讲可以帮助你复习以前学过的知识,把相关的知识点从遥远的记忆里再调出来,重温一下,以便更好地进入状态。
今天这一讲,我首先带你从宏观上理解一下整个编译过程。后面几讲中,我再针对编译过程中的每个阶段做细化讲解。
好了,让我们开始吧。
编译,其实就是把源代码变成目标代码的过程。如果源代码编译后要在操作系统上运行,那目标代码就是汇编代码,我们再通过汇编和链接的过程形成可执行文件,然后通过加载器加载到操作系统里执行。如果编译后是在解释器里执行,那目标代码就可以不是汇编代码,而是一种解释器可以理解的中间形式的代码即可。
我举一个很简单的例子。这里有一段 C 语言的程序,我们一起来看看它的编译过程。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

编译的全过程包括词法分析、语法分析和语义分析等前端工作,以及目标代码生成和优化等后端工作。在词法分析阶段,源代码被转换为Token,而在语法分析阶段,Token串被转换成抽象语法树(AST)。语义分析阶段识别数据类型并进行语义理解和检查。后端工作包括生成目标代码或中间代码,并进行优化工作。优化工作的目的是提高性能和减少资源消耗。编译器在生成目标代码时选择合适的指令、优化寄存器分配,并对指令进行重新排序。采用中间代码编写优化算法的好处是可以降低编译器适配不同CPU的工作量。整个编译过程使得编译器能够完全理解程序的含义,并将其表示成带有语义信息的数据结构,以便进行进一步的处理和优化。文章还提到了编译器在运行时花费时间最长的部分通常是优化工作。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • 鱼_XueTr
    自然语言与编程语言翻译基本都是经过相同的步骤流程:词法分词,语法分析,语义分析,token翻译,重组,优化结构,到最后的结果。 但是编程语言与自然语言相比: 1. 词汇量:编程语言的关键字等标识有限,自然语言的词汇量巨量无限 2. 结构化:编程语言是结构化的,自然语言是非结构化 3. 歧义性:编程语言都有确定的语义表达,自然语言不同语境不同的意思 4. 容错性:程序必须保证拼写绝对正确,自然语言更随意,也容许有错误表达 5. 易变性:编程语言的变化缓慢又小,自然语言的变化随着社会发展 6. 简略性:编程语言要求准确细致满足所有运行条件,自然语言简略干练形式不限

    作者回复: 你总结得太好了!手动点赞!

    2020-06-01
    3
    85
  • sugar
    回答课后思考题: 计算机语言编译和自然语言的翻译,做的事情本质上都是输入“遵循某种文法所说出的话”,输出“按照另外一种文法,把同样的话给表达出来”,这么件事~ 如果说区别的话,处理的文法是不一样复杂的,自然语言是0型文法,而计算机语言的处理基本上都是在2型文法和3型文法的层面上,只有涉及意义处理才会做一些1型文法层面的事儿。 毕竟,计算机语言在设计时就要考虑到可以被计算机去执行,所以其必须考虑逻辑严谨; 而自然语言,中文、英文这些语言的历史包袱很重,而且语言最初设计的目的也不是为了给机器去跑,而是服务于广大人民群众呀~ 按形式语言这门学科的定义,自然语言对应的是图灵机,所以对自然语言的处理已经是AI领域研究的范畴~ 望老师指点~

    作者回复: 你讲得非常好。从文字中可以看出,你对形式语言的知识掌握得不错! 你说的很对,自然语言的意义处理是比较复杂的。编译技术都是做的确定性的翻译,而自然语言的翻译,有时候不能保证完全准确。所以,对于自然语言翻译,吴军那一代人是用概率的方法来处理,最近几年是用机器学习的方法来处理。

    2020-06-01
    4
    13
  • 😐饲养员小张😐
    老师可以在这些流程里面带上符号表么?我理解编译的整个过程都会贯穿符号表,但好像这里面一直没有提,之前的那个编译原理之美中也没有提及

    作者回复: 在第4讲语义分析里面有一张图,是带了符号表的。而且那一讲也专门会讲符号表相关的知识。 现代语言,在语法解析过程,是可以不依赖符号表的,所以符号表一般都推迟到语义分析阶段才去建立,我在分析Java编译器的时候,你也会看到这一点。 在之前有个别语言,在语法解析阶段如果需要查一下符号表(也就是借助上下文信息),才能知道某个标识符应该位于哪个语法中。所以,这个时候符号表会提前建立,在词法分析的时候就开始建立。

    2020-06-02
    5
  • 吃鱼
    老师,引用消解和我之前在二进制学习里面看到的符号决议是一个概念吗?还有就是汇编的代码以后能否提供intel语法😅表示看这种不是很明了

    作者回复: 第1个问题:符号表可以用于编译过程的所有环节。在链接的过程中,也要去消解符号的定义,看看是在哪个目标文件,是去静态链接还是动态链接。“决议”和“消解”,应该是对resolve的不同翻译。 第2个问题:汇编有很多种不同的写法,这确实是个问题。我在课程里用GNU格式,原因是采用了GNU的汇编器,并且clang输出的也是GNU格式。 不过,在本课程中,在学习Java的JIT编译器时,把机器码反汇编后,是以intel格式显示的。 这几种不同的格式,在阅读文献和使用工具时,都不可避免的会碰到。看多了就在脑子里可以自动转换了。

    2020-06-16
    3
  • Matrix
    计算机语言的编译和自然语言的翻译,从编译器的角度来看,二者在“前端”上是相同的,在“中端”和“后端”上是不同的。自然语言的翻译也需要经过词法分析:获取每个单词;语法分析:分析句子的语法结构;语义分析:通过单词的含义结合句型来获取句子的含义。机器语言的编译为了生成质量更高的目标代码,“中端”会对“前端”的输出进行一系列的优化。而自然语言的翻译会直接利用“前端”的输出,将源语言翻译为目标语言。

    作者回复: 感谢你的分享。 我有时会把“优化”看做是“意译”的过程,也就是说,用目标语言可以更简单地表达相同的意思。从这个角度看,其实自然语言的翻译,也有类似编译器后端的工作。

    2020-06-01
    3
  • thomas1994
    赞,希望多点图,有图就直观多了

    作者回复: 收到。在解析具体编译器时,我画了好多图。我争取多用图来表达!

    2020-06-01
    2
    3
  • 皮特尔
    问一个小白问题:不同编程语言的AST规则都一样吗?

    作者回复: 不,是不一样的。 每种语言的语法规则有相似的地方,但也有不同之处。 每种语言都会设计自己的AST。

    2020-06-05
    2
  • 希望老师 能详细 讲解一下 AST 有关的知识, AST 在日常工作中用的还是很多的 https://astexplorer.net/ 这个网站经常用,但是有些AST知识还不是很懂

    作者回复: 在讲语法分析的时候会讲。 在我们分析每种编译器的时候,你都会见到一个不同的AST设计,从而增加直观认识。 另外,在讲Python编译器的时候,还会介绍一个与AST相关的概念:CST。然后你会借此加深对AST的理解。

    2020-06-03
    2
  • Charles
    自然语言翻译的是人与人之间的语言,包含人的感性(动物性)语言和理性语言。计算机语言编译一般是将人类语言的理性部分翻译为计算机的语言(CPU指令),以驱动计算机为人类工作。计算机语言编译的抽象语法树可以很深,自然语言一般不会。计算机语言一般要求有明确的语意,而自然语言的上下文可能会非常庞大,同一段语言在不同场合和文化中有不同语意(比如“意思意思“这样的段子),有的甚至是by design的(比如双关)。自然语言以生命(大脑)为基础,从建立于动物(人类)的视觉,听觉,触觉等感官之上的感性语言发展至建立在逻辑之上的理性语言,并在此处与基于二进制运算的计算机语言汇合。

    作者回复: 很好,感谢分享!

    2020-06-02
    2
  • Nulk
    完整读下来花了将近30分钟,从整体大概理解了编译做的事。打算试着做一个最简单语法的js for循环的解析试下,熟悉整个过程

    作者回复: Great! 只有动手,才会真正get到。

    2020-10-19
    1
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部