01 | 编译的全过程都悄悄做了哪些事情?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
编译的全过程包括词法分析、语法分析和语义分析等前端工作,以及目标代码生成和优化等后端工作。在词法分析阶段,源代码被转换为Token,而在语法分析阶段,Token串被转换成抽象语法树(AST)。语义分析阶段识别数据类型并进行语义理解和检查。后端工作包括生成目标代码或中间代码,并进行优化工作。优化工作的目的是提高性能和减少资源消耗。编译器在生成目标代码时选择合适的指令、优化寄存器分配,并对指令进行重新排序。采用中间代码编写优化算法的好处是可以降低编译器适配不同CPU的工作量。整个编译过程使得编译器能够完全理解程序的含义,并将其表示成带有语义信息的数据结构,以便进行进一步的处理和优化。文章还提到了编译器在运行时花费时间最长的部分通常是优化工作。
《编译原理实战课》,新⼈⾸单¥59
全部留言(22)
- 最新
- 精选
- 鱼_XueTr自然语言与编程语言翻译基本都是经过相同的步骤流程:词法分词,语法分析,语义分析,token翻译,重组,优化结构,到最后的结果。 但是编程语言与自然语言相比: 1. 词汇量:编程语言的关键字等标识有限,自然语言的词汇量巨量无限 2. 结构化:编程语言是结构化的,自然语言是非结构化 3. 歧义性:编程语言都有确定的语义表达,自然语言不同语境不同的意思 4. 容错性:程序必须保证拼写绝对正确,自然语言更随意,也容许有错误表达 5. 易变性:编程语言的变化缓慢又小,自然语言的变化随着社会发展 6. 简略性:编程语言要求准确细致满足所有运行条件,自然语言简略干练形式不限
作者回复: 你总结得太好了!手动点赞!
2020-06-01385 - sugar回答课后思考题: 计算机语言编译和自然语言的翻译,做的事情本质上都是输入“遵循某种文法所说出的话”,输出“按照另外一种文法,把同样的话给表达出来”,这么件事~ 如果说区别的话,处理的文法是不一样复杂的,自然语言是0型文法,而计算机语言的处理基本上都是在2型文法和3型文法的层面上,只有涉及意义处理才会做一些1型文法层面的事儿。 毕竟,计算机语言在设计时就要考虑到可以被计算机去执行,所以其必须考虑逻辑严谨; 而自然语言,中文、英文这些语言的历史包袱很重,而且语言最初设计的目的也不是为了给机器去跑,而是服务于广大人民群众呀~ 按形式语言这门学科的定义,自然语言对应的是图灵机,所以对自然语言的处理已经是AI领域研究的范畴~ 望老师指点~
作者回复: 你讲得非常好。从文字中可以看出,你对形式语言的知识掌握得不错! 你说的很对,自然语言的意义处理是比较复杂的。编译技术都是做的确定性的翻译,而自然语言的翻译,有时候不能保证完全准确。所以,对于自然语言翻译,吴军那一代人是用概率的方法来处理,最近几年是用机器学习的方法来处理。
2020-06-01413 - 😐饲养员小张😐老师可以在这些流程里面带上符号表么?我理解编译的整个过程都会贯穿符号表,但好像这里面一直没有提,之前的那个编译原理之美中也没有提及
作者回复: 在第4讲语义分析里面有一张图,是带了符号表的。而且那一讲也专门会讲符号表相关的知识。 现代语言,在语法解析过程,是可以不依赖符号表的,所以符号表一般都推迟到语义分析阶段才去建立,我在分析Java编译器的时候,你也会看到这一点。 在之前有个别语言,在语法解析阶段如果需要查一下符号表(也就是借助上下文信息),才能知道某个标识符应该位于哪个语法中。所以,这个时候符号表会提前建立,在词法分析的时候就开始建立。
2020-06-025 - 吃鱼老师,引用消解和我之前在二进制学习里面看到的符号决议是一个概念吗?还有就是汇编的代码以后能否提供intel语法😅表示看这种不是很明了
作者回复: 第1个问题:符号表可以用于编译过程的所有环节。在链接的过程中,也要去消解符号的定义,看看是在哪个目标文件,是去静态链接还是动态链接。“决议”和“消解”,应该是对resolve的不同翻译。 第2个问题:汇编有很多种不同的写法,这确实是个问题。我在课程里用GNU格式,原因是采用了GNU的汇编器,并且clang输出的也是GNU格式。 不过,在本课程中,在学习Java的JIT编译器时,把机器码反汇编后,是以intel格式显示的。 这几种不同的格式,在阅读文献和使用工具时,都不可避免的会碰到。看多了就在脑子里可以自动转换了。
2020-06-163 - Matrix计算机语言的编译和自然语言的翻译,从编译器的角度来看,二者在“前端”上是相同的,在“中端”和“后端”上是不同的。自然语言的翻译也需要经过词法分析:获取每个单词;语法分析:分析句子的语法结构;语义分析:通过单词的含义结合句型来获取句子的含义。机器语言的编译为了生成质量更高的目标代码,“中端”会对“前端”的输出进行一系列的优化。而自然语言的翻译会直接利用“前端”的输出,将源语言翻译为目标语言。
作者回复: 感谢你的分享。 我有时会把“优化”看做是“意译”的过程,也就是说,用目标语言可以更简单地表达相同的意思。从这个角度看,其实自然语言的翻译,也有类似编译器后端的工作。
2020-06-013 - thomas1994赞,希望多点图,有图就直观多了
作者回复: 收到。在解析具体编译器时,我画了好多图。我争取多用图来表达!
2020-06-0123 - 皮特尔问一个小白问题:不同编程语言的AST规则都一样吗?
作者回复: 不,是不一样的。 每种语言的语法规则有相似的地方,但也有不同之处。 每种语言都会设计自己的AST。
2020-06-052 - 奕希望老师 能详细 讲解一下 AST 有关的知识, AST 在日常工作中用的还是很多的 https://astexplorer.net/ 这个网站经常用,但是有些AST知识还不是很懂
作者回复: 在讲语法分析的时候会讲。 在我们分析每种编译器的时候,你都会见到一个不同的AST设计,从而增加直观认识。 另外,在讲Python编译器的时候,还会介绍一个与AST相关的概念:CST。然后你会借此加深对AST的理解。
2020-06-032 - Charles自然语言翻译的是人与人之间的语言,包含人的感性(动物性)语言和理性语言。计算机语言编译一般是将人类语言的理性部分翻译为计算机的语言(CPU指令),以驱动计算机为人类工作。计算机语言编译的抽象语法树可以很深,自然语言一般不会。计算机语言一般要求有明确的语意,而自然语言的上下文可能会非常庞大,同一段语言在不同场合和文化中有不同语意(比如“意思意思“这样的段子),有的甚至是by design的(比如双关)。自然语言以生命(大脑)为基础,从建立于动物(人类)的视觉,听觉,触觉等感官之上的感性语言发展至建立在逻辑之上的理性语言,并在此处与基于二进制运算的计算机语言汇合。
作者回复: 很好,感谢分享!
2020-06-022 - Nulk完整读下来花了将近30分钟,从整体大概理解了编译做的事。打算试着做一个最简单语法的js for循环的解析试下,熟悉整个过程
作者回复: Great! 只有动手,才会真正get到。
2020-10-191