编程范式|青训营笔记

78 阅读3分钟

一、编程语言

1.为什么需要编程语言

image.png

2.机器语言

image.png

3.汇编语言

image.png

4.高级语言

image.png

5.C/C++

C:"中级语言”过程式语言代表

  • 可对位,字节,地址直接操作
  • 代码和数据分离倡导结构化编程
  • 功能齐全:数据类型和控制逻辑多样化
  • 可移植能力强 C++:面向对象语言代表
  • C with Classes
  • 继承
  • 权限控制
  • 虚函数
  • 多态

6.Lisp

Lisp:函数式语言代表

  • 与机器无关
  • 列表:代码即数据
  • 闭包

7.JavaScript

基于原型和头等函数的多范式语言

  • 过程式
  • 面向对象
  • 函数式
  • 响应式

二、编程范式

1.什么是编程范式

image.png

2.常见编程范式

image.png

3.过程式编程

  • 自顶向下
  • 结构化编程

4.自顶向下

image.png

5.结构化编程

image.png

6.面向过程问题

  • 数据与算法关联弱
  • 不利于修改和扩充
  • 不利于代码重用

7.面向对象编程

  • 封装
  • 继承
  • 多态
  • 依赖注入

8.面向对象编程_封装

关联数据与算法

9.面向对象编程_继承

无需重写的情况下进行功能扩充

10.面向对象编程_多态

不同的结构可以进行接口共享,进而达到函数复用

11.面向对象编程_依赖注入

去除代码耦合

12.面向对象编程_五大原则

  • 单一职责原则
  • 开放封闭原则
  • 里式替换原则
  • 依赖倒置原则
  • 接口分离原则

13.面向对象问题

面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。

14.函数式编程

  • 函数是“第一等公民”
  • 纯函数/无副作用
  • 高阶函数/闭包

15.函数式编程_First Class Function

image.png

16.函数式编程_Pure Function

优势

  • 可缓存
  • 可移植
  • 可测试
  • 可推理
  • 可并行

17.函数式编程_Currying

image.png

image.png

18.函数式编程_Composition

image.png

19.函数式编程_Functor

可以当作容器的类型,类型支持对容器内元素进行操作 常见的functor:Array(lterable).map.Promise.then

20.函数式编程_Monad

可以去除嵌套容器的容器类型 常见monad:Array.flatMap Promise.then

[1,2].flatMap(()=>([1,2]))
Promise.resolve(1).then(r)=>Promise.resolve(2*r))
Maybe.prototype.flat=function(level=1){
   if(this.$value?'constructor!==Maybe){
      return new Maybe(this.$value);
      }
      return level?this.$value.flat(--level):this.$value;
      }

21.函数式编程_Applicative

直接对两个容器直接操作

ap(other){
   return other.map(this.$value);
}
  • 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));

22.响应式编程

  • 异步/离散的函数式编程
    • 数据流
    • 操作符
      • 过滤
      • 合并
      • 转化
      • 高阶

23.响应式编程_Observable

  • 观察者模式
  • 迭代器模式
  • Promise/EventTarget超集*

image.png

24.响应式编程_操作符

响应式编程的“compose”

  • 合并
  • 过滤
  • 转化
  • 异常处理
  • 多播

image.png

25.响应式编程_Monad

去除嵌套的Observable image.png

三、领域特定语言

1.什么是领域特定语言

  • Domain-specific language(DSL):应用于特定领域的语言

  • HTML

  • SQL

  • General-purpose langue

  • C/C++

  • Javascript

  • ...

2.语言运行

image.png

3.lexer

SQL Token分类

  • 注释
  • 关键字
  • 操作符
  • 空格
  • 字符串
  • 变量

image.png

4.Parser_语法规则

**上下文无关语法规则 **

<selectStatement>::- SELECT <selectList> FROM <tableName>  
eselectList> ::= <selectField> [,<selectList>]  
<tableName> ::= <tableName> [,<tableList> ]  
  • 推导式:表示非终结符到(非终结符或终结符)的关系。
  • 终结符:构成句子的实际内容。可以简单理解为词法分析中的token。
  • 非终结符:符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。

5.Parser_LL

LL:从左到右检查,从左到右构建语法树
select name from user

image.png

6.Parser_LR

LR:从左到右检查,从右到左构建语法树 LL(K)>LR(1)>LL(1)

image.png

7.tools

image.png

8.visitor

image.png

image.png