首页 > 技术文章 > 关于编译和计算机编译的过程

surplus-G 2021-09-04 16:09 原文

编译原理,对一个程序员来说是必不可少的内容了。那么,就让我们直奔主题吧~

编译

说到编译,首先先谈谈我们熟知的‘翻译’。

翻译,即将一种语言转化成另一种语言。

编译是翻译的一个特殊存在,它是将高级语言转化为汇编语言。

反编译就是将汇编语言转化为高级语言。

研究编译原理,就是研究将高级语言转化为汇编语言的过程。

计算机编译的过程

计算机编译的过程,大体分为以下步骤:

image

  • 词法分析器:输入源程序,按照构词规则分解成一系列单词符号。得到语法流序列(即:token序列)。
  • 语法分析器:输入词法分析器的输出结果,检测词法分析器返回的token序列是否符合文法定义的规则,并构建由输入的单词组成的数据结构(语法树)。
  • 语义分析器:分析语义是否满足。

注意:前三个属于前端技术,与硬件无关!

后面的都属于后端技术,与硬件有关:

  • 中间代码生成器:使编译程序结构在逻辑上更为简单明确
  • 代码优化器:将生成的中间代码进行优化,提高效率
  • 代码生成器:将优化后的代码用汇编语言表示

拓展

  1. 什么是语法树?
  • 计算机描述世界真理的树状结构。

  • 不同的语言,都会配之不同的语法分析器,而语法分析器是把源代码作为字符串读入、解析,并建立语法树的程序。语法的设计和语法分析器的实现是决定语言外在表现的重要因素。

  • 看到这里你可能会问,知道语法是又有什么用呢?跟我日常编写代码貌似半毛钱关系都没有。其实语法树还是很有用的,想一下如果想做「语法高亮」、「关键字匹配」、「作用域判断」、以及「代码压缩」等等,都是最好把代码解构成语法树之后再去各种操作,当然仅仅解构还不够,还需要提供各种函数去遍历与修改语法树。

  • 另一方面,去研究、去探讨计算机真实的世界不是一个很精彩很刺激的过程么?

  1. Antlr工具是用来干什么的?
  • Antlr:JAVA写的语言识别工具,它用来声明语言的语法,简称为“元语言” (meta-language)。

  • Antlr 主要功能:词法分析;语法分析;按照指定的语言生成分析器代码;Antlr 支持上下文无关文法 LL(*)。(第一个L:从左至右分析输入;第二个L: 使用最左派生分析语法规则)。

  • Antlr 可以生成Java, C#, Python2, Python3, JavaScript, Go, C++, Swift 等语言对应的分析器代码。

  • Antlr4 现在支持直接左递归,但不支持间接左递归。

  1. LLVM是什么?

它是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。

Pass:拓展部分参考自 百度学术。

推荐阅读