编程范式|青训营笔记

106 阅读3分钟

编程范式|青训营笔记

编程语言

机器语言

屏幕截图 2023-05-07 145612.png

汇编语言

屏幕截图 2023-05-07 150752.png

高级语言

  • 高级语言:C=A+B
  • 汇编语言:LOAD A,ADD B,STORE C
  • 机器语言:12234234532450 34523452345234 6789678456768 12234345435645

C/C++

C:"中级语言"过程式语言代表
  • 可对位,字节,地址直接操作
  • 代码和数据分离倡导结构化编程
  • 功能齐全:数据类型和控制逻辑多样化
  • 可移植能力强

屏幕截图 2023-05-07 173934.png

C++:面向对象语言代表
  • C with Classes
  • 继承
  • 权限控制
  • 虚函数
  • 多态

屏幕截图 2023-05-07 174529.png

Lisp

Lisp:函数式语言代表
  • 与机器无关
  • 列表:代码即数据
  • 闭包

屏幕截图 2023-05-07 174610.png

JavaScript

基于原型和头等函数的多范式语言
  • 过程式
  • 面向对象
  • 函数式
  • 响应式

屏幕截图 2023-05-07 174743.png

汇编语言总结

屏幕截图 2023-05-07 174841.png

编程范式

什么是编程范式

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

常见编程范式

mindmap
      编程范式
          命令式
            面向过程
            面向对象
          声明式
            函数式
            响应式

过程式编程

  • 自顶向下

屏幕截图 2023-05-07 175624.png

  • 结构化编程

屏幕截图 2023-05-07 175704.png

JS中的面向过程

屏幕截图 2023-05-07 175848.png

面向过程式编程有何缺点?为什么后面会出现面向对象

面向过程问题

  • 数据的算法关联弱(更难找到相关代码)
  • 不利于修改和扩充
  • 不利于代码重用

面向对象编程

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

面向对象编程_封装

  • 关联数据与算法

屏幕截图 2023-05-07 180738.png

面向对象编程_继承

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

屏幕截图 2023-05-07 180953.png

面向对象编程_多态

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

屏幕截图 2023-05-07 181435.png

面向对象编程_依赖注入

  • 去除代码耦合

屏幕截图 2023-05-07 181542.png

面向对象编程_五大原则

  • 单一职责编程SRP
  • 开放封闭原则OCP
  • 里式替换原则LSP
  • 依赖倒置原则DIP
  • 接口分离原则ISP
面向过程式编程有何缺点?为什么我们推荐函数式编程

面向对象问题

屏幕截图 2023-05-07 181950.png

函数时编程

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

屏幕截图 2023-05-07 184549.png

函数式编程_First Class Function

屏幕截图 2023-05-07 185801.png

函数式编程_Pure Function

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

函数式编程_Currying

屏幕截图 2023-05-07 191828.png

函数式编程_Composition

屏幕截图 2023-05-07 191930.png

函数式编程_Functor

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

屏幕截图 2023-05-07 192140.png

函数式编程_Monad

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

屏幕截图 2023-05-07 192318.png

函数式编程_Applicative

  • 直接对两个容器直接操作

屏幕截图 2023-05-07 192458.png

响应式编程

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

屏幕截图 2023-05-07 192726.png

响应式编程_Observable

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

屏幕截图 2023-05-07 192947.png

响应式编程_操作符

  • 响应式编程的 "compose"
    • 合并
    • 过滤
    • 转化
    • 异常处理
    • 多播

屏幕截图 2023-05-07 193119.png

响应式编程_Monad

  • 去除嵌套的Observable

屏幕截图 2023-05-07 193221.png

总结

屏幕截图 2023-05-07 193319.png

什么是领域特定语言

屏幕截图 2023-05-07 193508.png

语言运行

屏幕截图 2023-05-07 193608.png

lexer

屏幕截图 2023-05-07 193809.png

Parser_语法规则

  • 上下文无关语法规则

屏幕截图 2023-05-07 193932.png

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

Parser_LL

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

屏幕截图 2023-05-07 194305.png

Parser_LR

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

屏幕截图 2023-05-07 194454.png

tools

  • exp::=exp'+'exp
  • exp::=exp'*'exp
  • exp::='NUMBER'

屏幕截图 2023-05-07 194648.png

visitor

屏幕截图 2023-05-07 194737.png

总结

屏幕截图 2023-05-07 194901.png