编程范式 | 青训营笔记

53 阅读3分钟

编程范式

编程语言

  • 机器语言
  • 汇编语言
  • 中级语言
    • 面向过程代表-C
      1. 可对位,字节,地址直接操作
      2. 代码和数据分离倡导结构化编程
      3. 功能齐全:数据类型和控制逻辑多样化
      4. 可移植能力强
  • 高级语言
    • 面向对象语言代表-C++
      1. C with Classes
      2. 继承
      3. 权限控制
      4. 虚函数
      5. 多态
    • 函数式语言代表-lisp
      1. 与机器无关
      2. 列表: 代码即数据
      3. 闭包
    • 多范式代表-JavaScript
      1. 过程式
      2. 面向对象
      3. 函数式
      4. 响应式

编程范式

什么是编程范式

可以根据一些特性将程序语言进行分类,例如:

  • 是否允许副作用
  • 操作的执行顺序
  • 代码组织
  • 状态管理
  • 语法和词法

常见编程范式

  • 命令式
    • 面向过程
    • 面向对象
  • 声明式
    • 函数式
    • 响应式

面向过程问题

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

因为这些问题,所以后面有了面向对象编程

面向过程编程

  • 封装---关联数据与算法
  • 继承---无需重写的情况下进行功能扩充
  • 多态---不同的结构可以进行接口共享,进而达到函数复用
  • 依赖注入---去除代码耦合

面向对象五大原则

  1. 单一职责原则SRP
  2. 开放封闭原则OCP
  3. 里式替换原则LSP
  4. 依赖倒置原则DIP
  5. 接口分离原则ISP

面向对象的缺点:面向对象通过类封装数据和操作,我们有时候只需要一个类的一部分功能但我们不可避免的会把整个类引进过来,没办法进行新功能的功能导入.同时面向对象这种隐藏数据的特点也带来了先天缺陷,即数据的修改历史完全被隐藏.所以推荐函数式编程

函数式编程

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

  2. Pure Function

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

  4. Composition

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

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

  7. Applicative---直接对两个容器直接操作

响应式编程

  • 异步/离散的函数式编程
    • 数据流
    • 操作符
      • 过滤
      • 合并
      • 转化
      • 高阶
  1. Observable
  • 观察者模式
  • 迭代器模式
  • Promise/EventTarget超集
  1. 操作符 响应式编程的"compose"
  • 合并
  • 过滤
  • 转化
  • 异常处理
  • 多播
  1. Monad
  • 去除嵌套的Observable

领域特定语言

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

lexer

SQL Token分类

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

语法规则

上下文无关语法规则

  • 推导式:表示非终结符到(非终结符或终结符)的关系
  • 终结符:构成句子的实际内容.可以简单理解为词法分析中的token
  • 非终结符:符号或变量的有限集合.它们表示在句子中不同类型的短语或子句

LL

LL:从左到右检查,从左到右构建语法树

LR

LR:从左到右检查,从右到左构建语法树

语法规则这一节正好对应上了正在上的编译原理这一门课,所以对这里会有很熟悉的感觉,也更容易理解