《微软为何选择用Go而非Rust重写TypeScript》阅读笔记
突然看到一篇神文,微软为何选择用Go而非Rust重写TypeScript,TS首席架构师分享了使用GO重写TS编译器的心路历程,其中包含了大量编译器知识,学习记录一下
编译器的组成
一个编译器可能包含
- Front-end
- 词法分析器
- 语法分析器
- 语义分析器
- 中间代码生成
- Optimizer
- Back-end
- 代码生成器
- 辅助部分
- 符号表管理
- 错误检查
- 其他部分
- 预处理
- 汇编器
- 链接器
- 加载器
自举语言
Self-Hosted Language
实现自己的编译器或解释器的语言
Rust借用检查器
Borrow Checker
借用检查器是Rust内存安全的核心
Rust的每个值都有唯一一个所有者,当所有者离开作用域,其所占用的内存就会被自动释放(智能指针?)
Rust可以在不获取所有权的情况下访问数据,这个过程称为借用
- 不可变借用:只读
- 可变借用:读写
借用检查器的规则:
- 一个资源,要么是可变的独占借用,要么是多个共享的不可变借用
- 如果一个数据变为可变借用,那么借用期间,其他代码无法访问该数据(锁?)
- 引用必须是有效的
- 引用不能指向已经被释放的内存
函数式编程
模式匹配
pattern matching
根据数据的结构和内容,按照预先定义的规则进行处理
// C# 使用 switch 表达式进行模式匹配,根据shape的类型,输出不同的字符串 |
高阶类型
higher-kinded types
将类型的构造器作为参数
单子
monads
要求实现该类型的类型都必须支持return和bind操作
class Monad m where |
不透明类型
在类定义中隐藏了底层实现细节,只暴露必要接口的类型
比如我不想用户直接访问一个类型的value属性,而是将其包装为不透明类型,这个类型只能用提供好的借口
interface OpaqueType { |