- 编程范式是一个较为系统的知识点,目前还缺乏足够多的知识和思想的积累,该节笔记仅仅作为一个知识面的入口
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
-
纯函数
-
不依赖于外部环境
-
不应该有副作用
-
不改变参数的值
-
优势
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
-
-
柯里化
- 将之前的参数存入闭包当中
- 参考:函数式编程--柯理化(Currying)
-
函数组合
-
Functor
- 可以当做容器类型,类型支持对容器内元素进行操作
-
Monad
- 可以去除嵌套容器的容器类型
-
Applicative
-
直接对两个容器直接操作
-
2.5响应式编程
-
简述
-
异步/离散的函数式编程
-
数据流
-
操作符
- 过滤
- 合并
- 转化
- 高阶
-
-
RxJS库
-
-
响应式编程(observable)
- 观察者模式:订阅获取数据改变
- 迭代器模式:数据会持续改变
-
操作符
- 操作符作为数据管道,留出的数据已经被处理过
- 合并,过滤,转化,异常处理,多播
-
monad
3.领域特定语言
3.1定义
-
DSL:应用于特定领域的语言,例如:html、sql
3.2语言运行
-
lexer:词法解析器
- 将字符串切分成有意义的短语
-
parser:语法分析
-
上下文无关语法规则
-
推导式:表示 非终结符 到 非终结符或终结符 的关系
-
终结符:构成句子的实际内容
-
非终结符:符号或变量的有限集合,表示在句子中不同类型的短语或子句
- LL:从左到右检查,从左到右构建语法树
- LR:从左到右检查,从右到左构建语法树
-
-
tools
-
visitors