编程范式 | 青训营笔记

116 阅读5分钟

📍编程语言

程序员可以看作语义指令(编程语言)和计算机之间的桥梁,类似翻译官的存在。(用户的奇思妙想……)

机器语言

机器语言,顾名思义就是机器能够直接识别的语言,处理速度快,但不直观,对于人类理解不太友好。二进制编码就属于这个范畴。

不同种类的计算机其机器语言是不相容的。

汇编语言

使用字母代替数字,提高了可编写性和可移植性。

中级语言

  • C 过程式语言

能够直接操作位、字节、地址(eg.指针);倡导代码和数据分离的结构化编程。

高级语言

进一步提高可移植性,更接近自然语言,需要通过编译器编译为汇编语言,再进一步转为机器语言。

  • C++ 面向对象语言

    在C的基础上增加了类、继承、多态、虚函数……

  • Lisp 函数式语言

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

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

📍编程范式

JavaScript是一门融合了多种编程范式的语言。

💬编程范式:范式可以理解为规则,编程范式就是计算机编程所使用的方法,是设计程序结构所采用的设计风格。

程序语言的特性:

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

编程范式可分为:

  • 命令式

    • 面向过程:将操作按照过程分组

      自顶向下、结构化的思想。(JS中的export模块化体现了其面向过程特性) image.png 结构化编程体现在顺序结构、选择结构、循环结构等中。

      面向过程存在的问题:

      • 数据与算法关联弱(当代码规模变大后,程序会变得难以理解,“大浪淘沙”)
      • 不利于修改和扩充
      • 不利于代码重用
    • 面向对象:根据操作和对应的状态进行分组

      面向对象的三大特性:封装(类)、继承、多态、(* 依赖注入)。不同的面向对象语言对这三种特性的实现可能会有区别,但底层逻辑是相同的。

      封装就像将数据和算法放在一个黑箱中,只有箱子内部(类成员、类实例)可以访问调用。

      继承提高了代码的复用性,能够在不重写父类功能的情况下进行功能扩充。

      多态可以简单理解为接口复用,对于同一个接口,不同的对象调用它会产生不同的效果。

      依赖注入:可以借助类库实现这一高级特性(eg.Nest.js)

      image.png

      面向对象编程的五大原则:

      • 单一职责原则SRP(Single Responsibility Principle):功能单一
      • 开放封闭原则OCP(Open-Close Principle):扩展性开放、更改性封闭
      • 里氏替换原则LSP(the Liskov Substitution Principle):子类可以替换父类,并可以出现在任何父类出现的地方
      • 依赖倒置原则DIP(the Dependency Inversion Principle):上层依赖下层
      • 接口分离原则ISP(the Interface Segregation Principle):应该依赖接口而不是具体的实现

      面向过程的缺点: 附带着所有隐含环境(可能不是我们需要的),下面这句话很好的说明了。

      image.png

  • 声明式

    • 函数式 (ramdajs库,辅助函数式编程)

      函数是“第一等公民”:函数可以像其他数据类型变量那样使用

      纯函数/无副作用:一般将涉及的数据放在函数内部,不影响外部环境,相互之间也互不影响。变量污染?(可缓存、可移植、可测试、可推理、可并行)

      高阶函数/闭包:柯里化(用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数。)

      function currying(fn, ...args) { 
          if (args.length >= fn.length) { 
              return fn(...args); 
          } else { 
              // 返回一个保存了之前参数的闭包 
              return (...args2) => currying(fn, ...args, ...args2); 
          } 
      }
      

      函数组合:数据从右到左流入,依次调用处理。

      Functor:可以当作容器的类型,支持对容器内元素进行操作。Array.map()Promise.then()

      Monad:去除嵌套容器的容器类型,打平操作。Array.flatMapPromise.then()

      Applicative:直接对两个容器直接操作。

    • 响应式

      异步/离散的函数式编程

      • 数据流
      • 操作符
        • 过滤
        • 合并
        • 转化
        • 高阶

      Observable

      • 观察者模式(需要和发布订阅模式做一些区分)
      • 迭代器模式
      • Promise/EventTarget超集

      image.png

      Monad:去除嵌套的Observable

image.png

📍构建领域特定语言

💬用于特定领域的语言,如:HTML、SQL

特定领域语言需要使用通用语言来实现。

语言运行:

词法解析(lexer) -> 语法解析器(parser、语法树) -> 遍历分析
                                                    └> 解释(interpret)
                                                    └> 转换为另一种语言
  • 词法解析(lexer)token

    • 注释
    • 关键字
    • 操作符
    • 空格
    • 字符串
    • 变量
  • 语法解析器(parser)

    • 语法规则:推导式、终结符(构成句子的实际内容)、非终结符(符号和变量的集合)
    • LL:从左到右检查,从左到右构建语法树
    • LR:从左到右检查,从右到左构建语法树
  • tools

  • visitor

总结

知识点密度很高的一节课,有很多知识点现在还不太理解,日后还需要多花时间深入了解。

当我跃进编程这片海,才发现自己的无知与渺小……