编程范式 | 青训营笔记

139 阅读7分钟

编程语言

机器语言

第一代计算机(1940年代末至1950年代初):第一代计算机使用的是机器语言,这种语言是二进制的,非常难以阅读和编写

image.png

image.png

汇编语言

汇编语言(1950年代中期):为了使程序员能够更容易地编写代码,汇编语言被发明了出来。汇编语言是一种更高级别的机器语言,使用助记符来代替二进制代码,使程序员能够更容易地编写和阅读代码

image.png

高级语言

高级语言是一种人类易于理解和使用的计算机语言。它使用自然语言的形式来描述问题,而不是使用机器语言或汇编语言。高级语言通常具有较高的可读性和可维护性,使程序员能够更容易地编写和修改代码。一些常见的高级语言包括Java、Python和JavaScript等

image.png

C/C++

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

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

image.png

C++:面向对象语言代表

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

image.png

Lisp:函数式语言代表

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

image.png

JavaScript

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

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

image.png

总结

image.png

编程范式

程序语言特性

  1. 是否允许副作用
  2. 操作的执行顺序
  3. 代码组织
  4. 状态管理
  5. 语法和词法

image.png

编程范式
命令式:
1.面向过程
2.面向对象
声明式:
1.函数式
2.响应式

image.png

过程式

自顶向下

image.png

结构化编程

结构化编程是一种以结构为中心的编程范式,它主要关注程序的可读性、可维护性和可扩展性,通过一系列的结构化的控制流程来组织程序的逻辑。

image.png

JS中的面向过程

image.png

面向过程的问题

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

面向对象

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

封装

  • 将数据和行为封装在一个对象中,通过访问控制来保护对象的数据和行为,防止外部对象直接访问和修改
  • 封装的目的是隐藏对象的实现细节,提供一个统一的接口来访问对象的数据和行为,增加对象的安全性和可靠性,同时也提高了程序的可维护性和可扩展性

继承

无需重写的情况下进行功能扩充,这个写法在React中是经常使用的

image.png

多态

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

  • 基于上面的Person类和Student类,创建了一个printInfo函数,用于打印对象的信息。这个函数接受一个Person或Student对象作为参数,根据对象的类型,打印不同的信息
  • 我们定义了一个printInfo函数,用于打印对象的信息。这个函数接受一个Person或Student对象作为参数,根据对象的类型,打印不同的信息。在函数中,我们使用了instanceof关键字,判断对象的类型,实现了多态

image.png

依赖注入

去除代码耦合

  • 依赖注入(Dependency Injection,简称DI)是一种设计模式,它的主要目的是为了解耦合,使得代码更加灵活、可扩展和可维护。在一个应用程序中,各个组件之间通常会存在一些依赖关系,例如一个类需要使用另一个类的对象或者数据。在传统的代码实现中,通常是在类内部创建和管理依赖的对象,这样会导致代码的耦合性很高,一旦依赖的对象发生变化,就需要修改大量的代码,导致代码的可维护性很差。
  • 而依赖注入则是通过将依赖的对象从类内部移动到类的外部,在类的构造函数或者方法中注入依赖的对象。这样做的好处是,使得类与依赖的对象解耦合,使得代码更加灵活、可扩展和可维护。同时,依赖注入也使得代码的测试更加方便,因为测试代码可以注入不同的依赖对象,测试不同的场景和情况。

image.png

面向对象编程_五大原则

  • 单一职责原则SRP(Single Responsibility Principle)
  • 开放封闭原则OCP(Open-Close Principle)
  • 里式替换原则LSP(the Liskov Substitution Principle LSP)
  • 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
  • 接口分离原则ISP(the Interface Segregation Principle ISP)

面向对象编程有什么缺点?为什么我们推荐函数式编程

image.png

函数式编程

函数的特点

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

image.png

优势

  1. 可缓存
  2. 可移植
  3. 可测试
  4. 可推理
  5. 可并行

image.png

组合函数

组合(Compose)函数是在JavaScript开发过程中一种对函数的使用技巧、模式:

  • 比如我们现在需要对某一个数据进行函数的调用,执行两个函数fn1和fn2,这两个函数是依次执行的;
  • 那么如果每次我们都需要进行两个函数的调用,操作上就会显得重复
  • 那么是否可以将这两个函数组合起来,自动依次调用呢?
  • 这个过程就是对函数的组合,我们称之为 组合函数(Compose Function);

容器式编程

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

响应式编程

通俗来说,响应式编程就是一种处理数据流的编程方式。我们可以把数据流看成一条河流,数据就像是水流一样从上游流向下游。在响应式编程中,我们可以方便地定义这条河流,并在河流中处理数据的变化,就像是在河流中处理水流一样。这样,我们就可以很方便地处理数据的变化,而不需要手动追踪和处理每一个数据变化的位置。

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

    • 数据流

    • 操作符

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

响应式编程的"compose"

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

总结

image.png

什么是领域特定语言

领域特定语言(Domain-Specific Language,简称DSL)是一种专门用于解决特定领域问题的编程语言。与通用编程语言相比,DSL更加关注于特定领域的问题,使得针对该领域的编程变得更加高效、简单和直观。

image.png

词法解析

  • 语言运行

image.png

SQL Token分类

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

lexer

image.png

语法分析

Parser_语法规则

上下文无关语法规则

image.png

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

Parser_LL

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

image.png

对应的自顶向下的流程图:

image.png

Parser_LR

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

LL(K) > LR(1) > LL(1),括号里的内容构建语法树需要向下看的数量

工具生成

利用工具让我们只需要关注语法方面的问题,语法分析则交给工具来做

解释和编译

  • 运行parser.parse后生成如下语法树

image.png

课程总结

image.png