编程范式| 青训营笔记

101 阅读4分钟

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 命令式

面向过程

  • 自顶向下

1.drawio.png

  • 结构化编程

2.drawio.png

面向过程的问题:

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

面向对象

  • 封装

    关联数据与算法

  • 继承

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

  • 多态

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

  • 依赖注入

    去除代码耦合

五大原则:

  • 单一职责原则 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 声明式

函数式

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

    • 聚合转发
  2. Pure Function

    • 优势

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

  4. 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));
  5. Functor

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

    • 可以去除嵌套容器的容器类型
    • 常见 monad: Array.flatMap, Promise.then
  7. 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));

响应式

  • 异步/离散的函数式编程

    • 数据流

    • 操作符

      • 过滤
      • 合并
      • 转化
      • 高阶
  1. Observable

    • 观察者模式
    • 迭代器模式
    • Promise/EventTarget 超集
  2. 操作符

    • 响应式编程的“compose”

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

    • 去除嵌套的 Observable

3. 领域特定语言

领域特定语言(DSL,Domain-specific language)指的是专注于某个应用程序应用程序领域的计算机语言计算机语言。又译作领域专用语言。不同于普通的跨领域通用计算机语言(GPL),领域特定语言只用在某些特定的领域。 比如HTML,以及Emacs所使用的 Emac LISP 语言。

3.drawio.png

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) ()内是向前看符号数量