其他 #### 闭包 ==== 一门语言的作用域:: 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,也都能转换成正则表达式 .. figure:: https://img.zhaoweiguo.com/knowledge/images/cores/compilers/nfa_dfa1.jpeg 解析 ``int | [a-zA-Z][a-zA-Z0-9]* | [0-9]+`` 的过程 :: “贪婪(greedy)” 策略(尝试让 * 号匹配尽量多的字符) 非贪婪策略,或者叫 “忽略优先” 策略 有的正则表达式工具会支持多加一个?,比如??、*?、+?,来表示非贪婪策略