其他¶
闭包¶
一门语言的作用域:
1. 静态作用域(Static Scope)
大多数语言都是采用静态作用域
由程序代码决定,在编译时就能完全确定,所以又叫做词法作用域(Lexcical Scope)
2. 动态作用域(Dynamic Scope)
变量引用跟变量声明不是在编译时就绑定死了的。
在运行时,它是在运行环境中动态地找一个相同名称的变量。
如: bash 脚本语言
在运行时确定,所以又叫做运行时作用域(Runtime Scope)
继承&多态¶
子类型有两种实现方式:
1. 名义子类型(Nominal Subtyping)
需要显式声明继承了什么类,或者实现了什么接口
2. 结构化子类型(Structural Subtyping),又叫鸭子类型(Duck Type)
一个类不需要显式地说自己是什么类型,只要它实现了某个类型的所有方法,那就属于这个类型
编译算法篇¶
NFA 和 DFA¶
NFA 的特点是,它存在某些状态,针对某些输入,不能做一个确定的转换,这又细分成两种情况:
1. 对于一个输入,它有两个状态可以转换。
2. 存在 ε 转换。也就是没有任何输入的情况下,也可以从一个状态迁移到另一个状态。
无论是 NFA 还是 DFA,都等价于正则表达式:
1. 所有的正则表达式都能转换成 NFA 或 DFA
2. 所有的 NFA 或 DFA,也都能转换成正则表达式
“贪婪(greedy)” 策略(尝试让 * 号匹配尽量多的字符)
非贪婪策略,或者叫 “忽略优先” 策略
有的正则表达式工具会支持多加一个?,比如??、*?、+?,来表示非贪婪策略