编程范式
一、编程语言
1、机器语言
机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。机器语言使用绝对地址和绝对操作码。不同的计算机都有各自的机器语言,即指令系统。从使用的角度看,机器语言是最低级的语言。
2、汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
3、高级语言
高级语言(High-level programming language)是一种独立于机器,面向过程或对象的语言。高级语言是参照数学语言而设计的近似于日常会话的语言。例如,要将2个变量相加并赋值给第三个变量,用高级语言表达为var3=var1+var2。高级语言相对低级语言有较高的可读性,更易理解。由于早期计算机行业的发展主要在美国,因此一般的高级语言都是以英语为蓝本。
4、C/C++
4.1 C:“中级语言” 过程式语言代表
- 可对位,字节,地址直接操作
- 代码和数据分离倡导结构化编程
- 功能齐全︰数据类型和控制逻辑多样化
- 可移植能力强
4.2 C++:面向对象语言代表
- C with Classes
- 继承
- 权限控制
- 虚函数
- 多态
5、Lisp
Lisp:函数式语言代表
- 与机器无关
- 列表:代码即数据
- 闭包
6、JavaScript
- 基于原型和头等函数的多范式语言
- 过程式
- 面向对象
- 函数式
- 响应式
二、编程范式
1、什么是编程式范式
2、常见编程范式
2.1命令式
- 面向过程
- 面向对象
2.2 声明式
- 函数式
- 响应式
3、过程式编程
- 自顶向下
- 结构化编程
4、JS中的面向过程
5、面向过程的问题
- 数据与算法关联弱
- 不利于修改和扩充
- 不利于代码重用
6、面向对象编程
- 封装
- 继承
- 多态
- 依赖注入*
6.1、面向对象编程—封装
- 关联数据与算法
6.2、面向对象编程—继承
- 无需重写的情况下进行功能扩充
6.3、面向对象编程—多态
不同的结构可以进行接口共享,进而达到函数复用
6.4、面向对象编程——依赖注入
去除代码耦合
6.5、面向对象编程的五大原则
- 单一职责原则SRP
- 开放封闭原则OCP
- 里式替换原则LSP
- 依赖倒置原则DIP
- 接口分离原则ISP
6.6、面向对象问题
面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。
6.7、函数式编程
- 函数是“第一等公民”
- 纯函数/无副作用
- 高阶函数/闭包
6.7.1、函数式编程—First Class Function
6.7.2、函数式编程—Pure Function
优势:
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
6.7.3、函数式编程—Currying
6.7.4、函数式编程—Composition
6.7.5、函数式编程—Functor
可以当做容器的类型,类型支持对容器内元素进程操作
常见Functor:Array (lterable).map,Promise.then
6.7.6、函数式编程—Monad
可以去除嵌套容器的容器类型
常见Monad:monad: Array.flatMap Promise.then
6.8、响应式编程
异步/离散的函数式编程
-
数据流
-
操作符
- 过滤
- 合并
- 转化
- 高阶
6.8.1、响应式编程—Observable
- 观察者模式
- 迭代器模式
- Promise/EventTarget超集*
6.8.2、响应式编程—操作符
响应式编程的“compose”
- 合并
- 过滤
- 转化
- 异常处理
- 多播
6.8.3、响应式编程—Monad
去除嵌套的Observable
三、领域特定语言
1、什么是领域特定语言
2、语言运行
3、lexer
SQL Token分类
- 注释
- 关键字
- 操作符
- 空格
- 字符串
- 变量
4、Parser 语法规则
上下文无关语法规则
推导式:表示非终结符到(非终结符或终结符)的关系。 终结符: 构成句子的实际内容。可以简单理解为词法分析中的token。 非终结符∶符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。
4.1、Parser_LL
LL︰从左到右检查,从左到右构建语法树
4.2、Parser_LR
LR:从左到右检查,从右到左构建语法树