1. 编程语言
- 机器语言
- 汇编语言
- 中级语言
- 高级语言
1.1 中级语言
C:“中级语言”过程式语言代表
- 可对位、字节、地址直接操作
- 代码和数据分离,倡导结构化编程
- 功能齐全:数据类型和控制逻辑多元化
- 可移植性强
1.2 高级语言
C++:面向对象语言代表
- C with Classes
- 继承
- 权限控制
- 虚函数
- 多态
Lisp:函数式语言代表
- 机器无关
- 列表:代码即数据
- 闭包(可以理解为定义在一个函数内部的函数)
JavaScript:基于原型和头等函数的多范式语言
编程范式:一种编程风格,可分为命令式、函数式、面向对象等多种范式
- 过程式
- 面向对象
- 函数式
- 响应式
2. 编程范式
程序语言特性:
-
是否允许副作用
在 I/O 模型中,我们希望在从 I 到 O 之间只有计算,如果中间包含且不仅包含触发了其他 I/O、与此次 I -> O 计算并不相关的任何事情,则都称为副作用。
-
操作的执行顺序
- 顺序执行
- 并发执行
-
代码组织
- 元件组织法
- 工具箱组织法
- 层组织法
- 类别组织法
-
状态管理
状态管理具体有两层含义:
- 状态变化之前的逻辑,一般是异步的。
- 状态变化之后的联动处理,比如渲染视图或执行某段逻辑。
-
语法和词法
- 词法, 定义组成语言的单词, 是语言中最小单元。
- 语法, 将单子组织成有含义的短语和句子的规则。
2.1 常见编程范式
2.1.1 命令式
面向过程:
-
自顶向下
-
结构化编程
面向过程的问题:
- 数据与算法关联弱
- 不利于修改和扩充
- 不利于代码重用
面向对象:
-
封装
关联数据与算法
-
继承
无需重写的情况下进行功能扩充
-
多态
不同的结构可以进行接口共享,进而打到函数复用
-
依赖注入
去除代码耦合
五大原则:
- 单一职责原则 SRP(Single Responsibility Principle)
- 开放封闭原则 OCP(Open - Close Principle)
- 里式替换原则 LSP(the Liskov Substitution Principle)
- 依赖倒置原则 DIP(the Dependency Inversion Principle)
- 接口分离原则 ISP(the Interface Segregation Principle)
面向对象问题:
总是附带着所有它需要的隐含环境
2.1.2 声明式
函数式:
- 函数是“第一等公民”
- 纯函数/无副作用
- 高阶函数/闭包
-
First Class Function
- 聚合转发
-
Pure Function
-
优势
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
-
-
Currying
-
Composition
- associativity:
compose(f,compose(g,h)) === compose(compose(f,g),h); - map's composition law:
compose(map(f),map(g)) === map(compose(f,g));
- associativity:
-
Functor
- 可以当作容器的类型,类型支持对容器内元素进行操作
- 常见的 functor: Array(Iterable).map, Promise.then
-
Monad
- 可以去除嵌套容器的容器类型
- 常见 monad: Array.flatMap, Promise.then
-
Applicative
- 直接对两个容器直接操作
- Identity:
Maybe(id).ap(v) === v; - Homomorphism:
Maybe(f).ap(Maybe(x)) === Maybe(f(x)); - Interchange:
v.ap(Maybe(x)) === Maybe(f => f(x)).ap(v); - Composition:
Maybe(compose).ap(u).ap(v).ap(w) === u.ap(v.ap(w));
响应式:
-
异步/离散的函数式编程
-
数据流
-
操作符
- 过滤
- 合并
- 转化
- 高阶
-
-
Observable
- 观察者模式
- 迭代器模式
- Promise/EventTarget 超集
-
操作符
-
响应式编程的“compose”
- 合并
- 过滤
- 转化
- 异常处理
- 多播
-
-
Monad
- 去除嵌套的 Observable
3. 领域特定语言
领域特定语言(DSL,Domain-specific language)指的是专注于某个应用程序应用程序领域的计算机语言计算机语言。又译作领域专用语言。不同于普通的跨领域通用计算机语言(GPL),领域特定语言只用在某些特定的领域。 比如HTML,以及Emacs所使用的 Emac LISP 语言。
3.1 lexer
SQL Token 分类
- 注释
- 关键字
- 操作符
- 空格
- 字符串
- 变量
3.2 Parser 语法规则
上下文无关语法规则
<selectStatement> ::= SELECT <selectList> FROM <tableName>
<selectList> ::= <selectField> [ , <selectList> ]
<tableName> ::= <tableName> [ , <selectList> ]
- 推导式:表示非终结符到(非终结符或终结符)的关系
- 终结符:构成句子的实际内容。可以简单理解为词法分析中的 token
- 非终结符:符号或变量的有限集合。表示在句子中不同类型的短语或子句
LL:从左向右检查,从左向右构建语法树
LR:从左向右检查,从右向左构建语法树
LL(K) > LR(1) > LL(1) ()内是向前看符号数量