Introduction to Compilers
Language Implementations¶
将高级的 programming languages 转化为 machine code 主要有两种方法:
- Compilers translate your program
- "Offline"
- low-level languages (e.g. C, C++, Rust, Go) 主要使用 compilers
flowchart LR
A[Program]
B[Compiler]
C["Machine"]
D["Binary Code"]
E["Machine"]
subgraph Compiler
direction TB
B-->C
end
subgraph BC[Binary Code]
direction TB
D-->E
end
A-->Compiler-->BC
- Interpreters run your program
- "Online"
- high-level languages (e.g. Python, Ruby) 主要使用 interpreters
flowchart LR
Program-->Interpreter-->Machine
也有一些语言 (e.g. Java, Javascript, WebAssembly) 同时提供了这两种方法:Interpreter + Just in Time (JIT) compiler
The Structure of a Compiler¶
- Lexical Analysis - identify words (syntactic)
- 将 program text 提取为 "tokens"
if x == y then z = 1 else z = 2
\(\to\)['if', 'x', '==', 'y', 'then', 'z', '=', '1', 'else', 'z', '=', '2']
- Parsing - identify sentences (syntactic)
- 有了 tokens,下一步就是理解 sentence structure
- Parsing = Diagramming Sentences (a tree)
- 相当于给你一个 CFG 生成的 string,根据它找出每一步生成的规则得到它的 deriviation 或者说 parsing tree
- Semantic Analysis - analyze sentences (semantic)
- 明白了 structure,我们现在需要理解 sentence 具体的含义,不过这对于 compilers 来说太难了,因此 compilers 一般只是进行有限的分析来 catch inconsistencies
- Optimization - editing
- 这一步则是直接修改程序,一般进行以下的几种优化:
- Run faster
- Use less memory
- 一般而言是为了节省某些 resources
- 这一步则是直接修改程序,一般进行以下的几种优化:
- Code Generation - translation
- 生成 assembly code (compiler) 或者翻译成另一种语言 (interpreter)
- 过程中可能会生成多次 IR 来逐步发掘高层次抽象中隐藏的 features
相比于以前大部头是 lexical analysis 和 parsing,现在的编译器中最 expensive 的部分是 optimization,其次是 semantic analysis。
Programming Language Economics¶
这部分主要回答三个问题:
- Why so many programming languages?
- 因为 applications 有不同甚至是相互矛盾的需求
- Why new programming languages?
- 为了填补市场空白
- 可能是实现用某些已有的语言难以实现的 application
- 也有可能技术发展得以提高语言设计的质量(主要原因)
- 另外,新的 PL 并不是 completely new,而是会和一些已有的 PL 很像,甚至算是同一个 family
- 最主要的原因是 programmer training,其次还有重复造轮子之类的,都是非常 costly 的
- 还有一个原因就是,已经被广泛使用的 PL 是很难去改变的,从现在很多 PL 的版本更替所导致的众多问题也可以看出来
- 为了填补市场空白
- What is a good programming language?
- 这个问题目前没有公认的说法
- 有一种说法是"A good language is one people use.",这种说法显然(至少我认为显然)是错误的
- 这个问题目前没有公认的说法