编程范式 | 青训营笔记

133 阅读4分钟

编程范式

一、编程语言

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、什么是编程式范式

Snipaste_2023-04-19_21-28-48.png

2、常见编程范式

2.1命令式

  • 面向过程
  • 面向对象

2.2 声明式

  • 函数式
  • 响应式

3、过程式编程

  • 自顶向下

Snipaste_2023-04-19_22-00-10.png

  • 结构化编程

image.png

4、JS中的面向过程

image.png

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

Snipaste_2023-04-19_22-21-56.png

6.7.2、函数式编程—Pure Function

优势:

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

Snipaste_2023-04-19_22-23-44.png

6.7.3、函数式编程—Currying

Snipaste_2023-04-19_22-25-45.png

6.7.4、函数式编程—Composition

Snipaste_2023-04-19_22-28-04.png

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超集*

Snipaste_2023-04-19_22-42-25.png

Snipaste_2023-04-19_22-42-48.png

6.8.2、响应式编程—操作符

响应式编程的“compose”

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

Snipaste_2023-04-19_22-44-44.png

Snipaste_2023-04-19_22-45-10.png

6.8.3、响应式编程—Monad

去除嵌套的Observable

Snipaste_2023-04-19_22-46-33.png

三、领域特定语言

1、什么是领域特定语言

Snipaste_2023-04-19_22-47-53.png

2、语言运行

Snipaste_2023-04-19_22-48-49.png

3、lexer

SQL Token分类

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

4、Parser 语法规则

上下文无关语法规则

Snipaste_2023-04-19_22-50-26.png

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

4.1、Parser_LL

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

Snipaste_2023-04-19_22-53-17.png

4.2、Parser_LR

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

Snipaste_2023-04-19_22-55-33.png

5、tools

Snipaste_2023-04-19_22-57-00.png