编程范式
编程语言
机器语言
汇编语言
高级语言
C/C++
C:“中级语言”过程式语言代表 可对位,字节,地址直接操作 代码和数据分离倡导结构化编程 功能齐全:数据类型和控制逻辑多样化 可移植能力强
C++:面向对象语言代表 C with Classes 继承 权限控制 虚函数 多态
Lisp
LISP:函数式语言代表 与机器无关 列表:代码即数据 闭包
JavaScript
基于原型和头等函数的多范式语言 过程式 面向对象 函数式 响应式*
总结
编程范式
什么是编程范式
常见编程范式
过程式编程
自顶向下
结构化编程
自顶向下
结构化编程
JS中的面向过程
面向过程
面向过程问题
数据与算法关联弱
不利于修改和扩充
不利于代码重用
面相对象编程
封装
继承
多态
依赖注入*
面向对象编程_封装
关联数据与算法
面向对象编程_继承
无需重写的情况下进行功能扩充
面向对象编程_多态
不同的结构可以进行接口共享,进而达到函数复用
面向对象编程_依赖注入
去除代码耦合
面向对象编程_五大原则
单一职责原则SRP(Single Responsibility Principle) 开放封闭原则OCP(Open-Close Principle) • 里式替换原则LSP(the Liskov Substitution Principle LSP) • 依赖倒置原则DIP(the Dependency Inversion Principle DIP) • 接口分离原则ISP(the Interface Segregation Principle ISP)
函数式编程
纯函数/无副作用
高阶函数/闭包
函数式编程_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));
函数式编程_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
总结
领域特定语言
什么是领域特定语言
lexer
SQL Token分类 注释 操作符 空格 字符串 变量
Parser_语法规则
上下文无关语法规则
推导式:表示 非终结符 到(非终结符或终结符)的关系。 终结符: 构成句子的实际内容。可以简单理解为词法分析中的token。 非终结符: 符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。
Parser_LL
LL:从左到右检查,从左到右构建语法树select name from user
Parser_LR
LR:从左到右检查,从右到左构建语法树select name from userLL(K) > LR(1) > LL(1)
tools
exp ::= exp '+' exp exp ::= exp '*' exp exp ::= 'NUMBER'
npx kison –m llk –g grammar.js –o cal.js
visitor
课程总结
附录
• 函数式编程 • mostly-adequate.gitbook.io/mostly-adeq… • ramdajs.com/• rxjs.dev/ • 创建 DSL parser 工具 • pegjs.org/ • github.com/antlr/antlr… • github.com/yiminghe/ki…