编译原理,对一个程序员来说是必不可少的内容了。那么,就让我们直奔主题吧~
编译
说到编译,首先先谈谈我们熟知的‘翻译’。
翻译,即将一种语言转化成另一种语言。
编译是翻译的一个特殊存在,它是将高级语言转化为汇编语言。
反编译就是将汇编语言转化为高级语言。
研究编译原理,就是研究将高级语言转化为汇编语言的过程。
计算机编译的过程
计算机编译的过程,大体分为以下步骤:
- 词法分析器:输入源程序,按照构词规则分解成一系列单词符号。得到语法流序列(即:token序列)。
- 语法分析器:输入词法分析器的输出结果,检测词法分析器返回的token序列是否符合文法定义的规则,并构建由输入的单词组成的数据结构(语法树)。
- 语义分析器:分析语义是否满足。
注意:前三个属于前端技术,与硬件无关!
后面的都属于后端技术,与硬件有关:
- 中间代码生成器:使编译程序结构在逻辑上更为简单明确
- 代码优化器:将生成的中间代码进行优化,提高效率
- 代码生成器:将优化后的代码用汇编语言表示
拓展
- 什么是语法树?
-
计算机描述世界真理的树状结构。
-
不同的语言,都会配之不同的语法分析器,而语法分析器是把源代码作为字符串读入、解析,并建立语法树的程序。语法的设计和语法分析器的实现是决定语言外在表现的重要因素。
-
看到这里你可能会问,知道语法是又有什么用呢?跟我日常编写代码貌似半毛钱关系都没有。其实语法树还是很有用的,想一下如果想做「语法高亮」、「关键字匹配」、「作用域判断」、以及「代码压缩」等等,都是最好把代码解构成语法树之后再去各种操作,当然仅仅解构还不够,还需要提供各种函数去遍历与修改语法树。
-
另一方面,去研究、去探讨计算机真实的世界不是一个很精彩很刺激的过程么?
- Antlr工具是用来干什么的?
-
Antlr:JAVA写的语言识别工具,它用来声明语言的语法,简称为“元语言” (meta-language)。
-
Antlr 主要功能:词法分析;语法分析;按照指定的语言生成分析器代码;Antlr 支持上下文无关文法 LL(*)。(第一个L:从左至右分析输入;第二个L: 使用最左派生分析语法规则)。
-
Antlr 可以生成Java, C#, Python2, Python3, JavaScript, Go, C++, Swift 等语言对应的分析器代码。
-
Antlr4 现在支持直接左递归,但不支持间接左递归。
- LLVM是什么?
它是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
Pass:拓展部分参考自 百度学术。