本文永久链接:
译者: https://github.com/Starriers
校对者: https://github.com/Raoul1996 , https://github.com/Gavin-Gong
编程语言的工作原理
理解编译器的内部原理会促使你更高效地使用它. 在这个按时间排序的概要中, 了解编程语言和编译器的工作原理.(为此)编写了大量的链接, 示例代码和图表来帮助你理解.
作者标注
理解编译器 -- 从人类的角度 (Version 2) 是我在 Medium 上发表的第二篇文章 (有超过 21000 的阅读量) 的后续. 我很高兴自己的内容对大家产生了积极的影响, 我也很开心能根据从原文章收集到的意见来对其进行完整的重写.
理解编译器 -- 从人类的角度: 尽管你知道点击绿色按钮就可以执行, 但你真的知道它的底层发生了哪些事情么?
我选择 Rust 作为这篇文章的首选语言. 因为它详细, 高效, 现代化, 而且从设计上看, 编写编译器时会相对简单. 我非常喜欢它. https://www.rust-lang.org/
写这篇文章的目的是为了保证读者能集中精神, 而不是 20 页的精神疲惫阅读. 你可以在文中的许多链接中, 选择自己感兴趣的内容, 去了解相关内容的深层解读. 当然, 大部分都是链接向维基百科的.
请随意在文末进行评论, 或者说出问题建议. 感谢你的关注, 希望你可以喜欢这篇文章.
简介
什么是编译器
当然, 你也可以认为编程语言就是叫做编译器的软件, 它读取文本文件, 对其进行大量的处理, 然后生成二进制文件. 由于计算机只能读 1 和 0, 比起二进制, 人类更擅长写 Rust, 所以编译器将人类可读的文本转化为计算机可读的机器代码.**
编译器可以是将一个文本转变成另一个文本的程序. 比如, 这里有用 Rust 编写的编译器, 它将 0 与 1 相互转化:
- // 一个示例编译器, 将 0 与 1 互换.
- fn main() {
- let input = "1 0 1 A 1 0 1 3";
- // 对输入的每个字符 `c` 进行迭代
- let output: String = input.chars().map(|c|
- if c == '1' { '0' }
- else if c == '0' { '1' }
- else { c } // 如果不是 0 或 1, 就忽略它(不进行处理)
- ).collect();
- println!("{}", output); // 0 1 0 A 0 1 0 3
- }
尽管这个编译器不读取文件, 不生成 AST(抽象语法树)或者二进制文件, 但它仍然被看成是一个编译器, 原因很简单, 就是它可以翻译输入的内容.
编译器会做什么事情
简而言之, 编译器读取源代码并生产二进制文件. 由于直接从人类可读的复杂代码转换成 1 和 0 非常复杂, 因此编译器在运行之前会有几个处理步骤:
读取给定源代码的每个字符.
将字符排序为字母, 数字, 符号和运算符.
获取已排序的字符, 通过将它们与已有模式匹配并创建操作树来确定它们要执行的操作.
迭代上一步生成的树中的每一个操作, 并生成等效的二进制文件.
- int main() {
- int a;
- int b;
- a = b = 4;
- return a - b;
- }
- [Keyword(Int), Id("main"), Symbol(LParen), Symbol(RParen), Symbol(LBrace), Keyword(Int), Id("a"), Symbol(Semicolon), Keyword(Int), Id("b"), Symbol(Semicolon), Id("a"), Operator(Assignment), Id("b"),
- Operator(Assignment), Integer(4), Symbol(Semicolon), Keyword(Return), Id("a"), Operator(Minus), Id("b"), Symbol(Semicolon), Symbol(RBrace)]
- expr = additive_expr ;
- additive_expr = term, ('+' | '-'), term ;
- term = number ;
- expr = additive_expr ;
- additive_expr = multiplicative_expr, {
- ('+' | '-'), multiplicative_expr
- } ;
- multiplicative_expr = term, {
- ("*" | "/"), term
- } ;
- term = number ;
来源: https://juejin.im/post/5c10b2f6e51d452ad958631f