编程语言:
机器语言
汇编语言
中级语言——面向过程代表——C
高级语言——面向对象代表——C++
——函数式代表——lisp
——多范式代表——javascript
面向过程的问题:
数据与算法关联弱;
不利于修改和补充;
不利于代码重用;
面向对象——依赖注入(代码反转)可以去除代码耦合度
依赖注入前:
依赖注入后:
当需要修改car这个类的内容时,直接调整声明实现的内容即可,无需对car这个类进行操作
可以使用Inversify.js 和Nest.js这两种库来达到依赖注入的特性
面向对象编程——五大原则
单一职责原则SRP(Single Responsibility Principle):一个类的功能要单一,不能包罗万象;
开放封闭原则OCP(Open-Close Principle):一个模块在扩展性方面应该是开放的,在更改性方面应该是封闭的;
里式替换原则LSP(the Liskov Substitution Principle LSP):子类应该可以替换父类,并出现在父类应该出现的任何地方;
依赖倒置原则DIP(the Dependency Inversion Principle DIP):具体依赖抽象,上层依赖下层;举例:假设B是较A低的一个模块,B需要使用A的某功能,此时B不应该直接使用A中具体的类,而是应该由B定义一个抽象接口,由A来实现这个抽象接口,B去依赖这个抽象接口,这样就达到了依赖倒置的目的,B解决了对A的依赖,这样想替换A的时候就可以随时替换,只要实现这个接口就可以,并不会影响B的功能;
接口分离原则ISP(the Interface Segregation Principle ISP):对依赖倒置原则抽象化的一个原则,即任何时候依赖要通过接口进行区分,不要依赖于具体类的实现。
函数式编程
函数是“第一等公民”
纯函数/无副作用:优势:可缓存、可移植、可测试、可推理、可并行
高阶函数/闭包:currying,将常用的参数闭包处理
Functor:可以当作容器的类型,类型支持对容器内元素进行操作。常见的functor:Array、Promise
Monad:可以去除嵌套容器的容器类型。常见Monad:Array、Promise
Applicative:直接对两个容器直接操作
响应式编程:异步/离散的函数式编程,包括数据流和操作符
Observable:观察者模式、迭代器模式、Promise/EventTarget超集(前端的类比模式,结合了观察者和迭代器模式)
操作符:合并、过滤、转化、异常处理、多播
Monad:去除嵌套的Observable
语法规则
- 推导式:表示非终结符到(非终结符或终结符)的关系。
- 终结符:构成句子的实际内容。可以简单理解为词法分析中的token。
- 非终结符:符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。
在具体的语法分析中,有两种方式:
一、LL:从左到右检查,从左到右构建语法树
二、LR:从左到右检查,从右到左构建语法树。特点是构建能力强、表达效率高
表达能力排序(k和1表示当我们构建语法节点时,需要往下看的token的数量)