编程范式 | 青训营笔记

104 阅读4分钟
  • 编程范式是一个较为系统的知识点,目前还缺乏足够多的知识和思想的积累,该节笔记仅仅作为一个知识面的入口

1编程语言

1.1为什么需要编程语言

  • 给机器发指令

1.2机器语言

  • 计算机底层运行的语言,例如8086指令格式
  • 指令集

1.3汇编语言

  • 相当于对指令进行了封装和重命名,开始具有较好的可读性和可移植性

1.4高级语言

  • 目前常见的编程语言

  • 更加贴近自然语言

  • 更加具有可移植性

  • 编译器:将高级语言翻译成机器能运行的语言

  • C:“中级语言”过程式语言代表

    • 可对位,字节,地址直接操作
    • 代码和数据分离倡导结构化编程
    • 可移植能力强->编译完成后机器可以直接运行
  • C++:面向对象语言代表

    • 继承
    • 权限
    • 虚函数
    • 多态
  • Lisp

    • 函数式代表
  • JavaScript

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

      • 过程式

      • 面向对象

      • 函数式

      • 响应式

2编程范式

2.1定义

  • 编程范式,即编程思想,或者由于语言特性所反映出来的思想

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

  • 编程范式

    • 命令式(如何操纵机器改变状态)

      • 面向过程(把操作用过程进行分组)
      • 面向对象(根据操作和其对应的状态进行分组)
    • 声明式(声明响应的结果,而不指明具体的操作)

      • 函数式(通过函数申明逻辑)

      • 响应式(通过数据流和映射函数表示结果)

2.2过程式编程

  • 自顶向下思想

    • 一个整体有多个部分组成,一个部分又由更小的部分组成

      • 例如:程序(模块(变量(数据结构))函数(子函数 语句))
  • 结构化编程思想

    • 顺序结构、选择结构、循环结构替代传统的go to
  • js中的面向过程

    • 数据和算法的分离,导入函数
  • 面向过程的问题(耦合度可能会较高)

    • 数据与算法关联弱

    • 不利于修改和扩充

    • 不利于代码重用

2.3面向对象编程

  • 封装

    • 将数据封装在类当中,限制访问
    • 关联数据与算法
  • 继承

    • 无需重写的情况进行功能
    • 继承父类属性
    • 扩充自身属性
  • 多态

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

    • 去除代码耦合
    • Spring
    • 外部统一管理
  • 面向对象编程五大原则

    • 单一职责原则SRP
    • 开放封闭原则OCP:扩展开放,修改封闭
    • 里式替换原则LSP:子类可以替代父类并应该出现在父类可以出现的任何地方
    • 依赖倒置原则DIP:具体依赖抽象,上层依赖下层,依赖之间通过接口相连
    • 接口分离原则ISP:
  • 存在问题

    • 总是附带着所有它需要的隐含环境

2.4函数式编程

  • 简述

    • 用纯函数的组合来描述过程
    • ramdajs库
    • 函数是“第一等公民”‘’
    • 纯函数/无副作用
    • 高阶函数/闭包
  • First class function

  • 纯函数

    • 不依赖于外部环境

    • 不应该有副作用

    • 不改变参数的值

    • 优势

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

  • 函数组合

  • Functor

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

    • 可以去除嵌套容器的容器类型
  • Applicative

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

2.5响应式编程

  • 简述

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

      • 数据流

      • 操作符

        • 过滤
        • 合并
        • 转化
        • 高阶
    • RxJS库

  • 响应式编程(observable)

    • 观察者模式:订阅获取数据改变
    • 迭代器模式:数据会持续改变
  • 操作符

    • 操作符作为数据管道,留出的数据已经被处理过
    • 合并,过滤,转化,异常处理,多播
  • monad

3.领域特定语言

3.1定义

  • DSL:应用于特定领域的语言,例如:html、sql

3.2语言运行

  • lexer:词法解析器

    • 将字符串切分成有意义的短语
  • parser:语法分析

    • 上下文无关语法规则

    • 推导式:表示 非终结符 到 非终结符或终结符 的关系

    • 终结符:构成句子的实际内容

    • 非终结符:符号或变量的有限集合,表示在句子中不同类型的短语或子句

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

  • visitors