编程范式 | 青训营笔记

105 阅读6分钟

编程范式 | 青训营笔记

课件内容

  1. 课程介绍
  2. 编程语言
  3. 编程范式
  4. 领域特定语言

课程介绍

JavaScript 是一种广泛用于客户端和服务器端编程的脚本语言。它通常用于网页开发,可以与HTML和CSS一起使用以实现动态效果和交互性。

课程收益

  1. 了解不同编程范式的起源和适用场景
  2. 掌握 JavaScript 在不同的编程范式特别是函数式编程范式的使用
  3. 掌握创建领域特定语言的相关工具和模式

为什么需要编程语言

编程语言是用来描述计算机程序的一种人工语言。计算机只能理解机器语言,而编程语言可以将人类的思维转化为计算机可以理解的语言,并指示计算机执行一些任务。使用编程语言,可以让程序员写出各种应用程序、网站、游戏等软件,实现人类想象中各种场景的自动化处理和交互。因此,编程语言是现代计算机软件开发的必要基础。

编程语言

  • 机器语言
    • 机器语言是一种由二进制数字组成的计算机程序语言,它是计算机硬件直接执行的编程语言,与人类通常使用的自然语言和高级编程语言不同。
  • 汇编语言
    • 汇编语言是一种低级编程语言,通常用于计算机硬件或操作系统的底层编程。它将机器指令和数据指令转换为容易理解和使用的助记符,使程序员可以更方便地控制计算机的底层操作。
  • 高级语言
    • 高级语言是一种类似于数学语言或人语的自然语言,不依赖于计算机硬件,程序具有通用性。我们所使用的C语言就是高级程序设计语言的一种。

C/C++

C

"中级语言" 过程式语言代表

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

C++

面向对象代表

  • C with Classes
  • 继承
  • 权限控制
  • 虚函数
  • 多条

Lisp

函数式语言代表

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

JavaScript

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

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

小结

编程语言.png

编程范式

什么是编程范式

程序语言特性

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

常见编程范式

编程范式

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

过程式编程

  • 自顶向下

程序.png

  • 结构化编程

    • 顺序结构
    • 选择结构
    • 循环结构

面向过程的问题

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

面向对象编程

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

面向对象五大原则

  • 单一职责原则 SRP
    • 规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分,提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:
      1. 一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力
      2. 当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费
    • 优点
      • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多
      • 提高类的可读性。复杂性降低,自然其可读性会提高
      • 提高系统的可维护性。可读性提高,那自然更容易维护了
      • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响
  • 开放封闭原则 OCP
    • 软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的
    • 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况
    • 对修改封闭,意味着一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改
  • 里式替换原则 LSP
    • 核心思想就是在程序当中,如果将一个父类对象替换成它的子类对象后,该程序不会发生异常
    • 优点
      • 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性
      • 提高代码的重用性
      • 子类可以形似父类,但又异于父类
      • 子与父的不同
      • 提高代码的可扩展性
      • 提高产品或项目的开放性
    • 缺点
      • 继承是侵入性的
      • 降低代码的灵活性
      • 增强了耦合性
  • 依赖倒置原则 DIP
    • 高层模块不应该依赖低层模块,两者都应该依赖其抽象
    • 抽象不应该依赖细节
    • 细节应该依赖抽象
  • 接口分离原则
    • 使用方不应该依赖于它不使用的方法

面向对象问题

总是附带着所以需要的隐含环境

函数式编程

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

优势

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

Functor

可以当做容器的类型,类型支持对容器内元素进行操作

Monad

可以去除嵌套容器的容器内容

Applicative

直接对两个容器直接操作

响应式编程

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

Observable

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

操作符

响应式编程的"compose"

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

Monad

去除嵌套的 Observable

领域特定语言

什么是领域特定语言

  • DSL:应用于特定领域的语言,例如
    • HTML
    • SQL

Lexer

SQL Token 分类

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

Parser 语法规则

  • 上下文无语法规则
    • 推导式
      • 表示 非终结符 到(非终结符或终结符)的关系
    • 终结符
      • 构成句子的实际内容,可以简单理解为词法分享中的token
    • 非终结符
      • 符合或变量的有限集合,它们表示在句子中不同类型的短语或子句
  • LL
    • 从左到右检查,从左到右构建语法树
  • LR
    • 从左到右检查,从右到左构建语法树