为什么需要编程语言
人们需要通过某种方式与电脑“交流”,让它明白人们想要让它达成的目标并完成。这种交流语言一般称为编程语言。
编程语言
1.机器语言(根据机器的不同而不同) 2.汇编语言 3.中级语言(C) 4.高级语言(C++,Java)
此时产生了编译器的概念,编译器会将高级语言转换成汇编语言,再通过汇编语言与计算机“交流”。
C语言
- 可对位,字节,地址直接操作
- 代码和数据分离倡导结构化编程
- 功能齐全:数据类型和控制逻辑多样化
- 可移植能力强
C++
面向对象语言代表
- C with Classes
- 继承
- 权限控制
- 虚函数
- 多态
Lisp
函数式语言代表
- 与机器无关
- 列表:代码即数据
- 闭包
JavaScript
基于原型和头等函数的多范式语言
- 过程式
- 面向对象
- 函数式
- 响应式
编程范式
首先根据程序的语言特性进行分类:是否允许副作用;操作的执行顺序;代码组织;状态管理;语法和词法。
由此,可以将程序范式分成两大类:命令式(程序员如何操作机器改变状态)和声明式(声明结果不管具体操作)。
命令式-面对过程
过程式编程两大特征:自顶向下,结构化编程
自顶向下:将程序分成各个模块,模块由变量和函数组成,变量代表了数据结构,而函数包含了函数和语句。
结构化编程:通过子程序,if结构,dowhile结构代替了原本的goto形式,避免了繁琐的结构
缺点
- 数据与算法关联性弱(过多函数,差错困难)
- 不利于修改和扩充(没有封装的概念,一个变量修改需要对无数条语句修改)
- 不利于代码重用(无组件化,组件中各个参量错综负载)
面向对象编程
- 封装
- 继承
- 多态
- 依赖注入
- 封装:将数据和算法封装到类里,保护它们。
- 继承:在无需重写原有函数功能的情况下,对函数进行功能扩充
- 多态:不同结构可以进行接口共享,从而达到函数复用
- 依赖注入:去除代码耦合
五大原则:
- 单一职责原则SRP
- 开放封闭原则OCP
- 里氏替换原则LSP
- 依赖倒置原则DIP
- 接口分离原则ISP
缺点 面向对象编程,它总是会附带着所有它需要的隐含环境,会得到很多与最终目标不相干的东西,过于繁琐
函数式编程
- 函数是第一
- 纯函数/无副作用
- 鼓励使用高阶函数或者闭包解决问题
优势 不依赖于外部环境,也不改变外部环境,参数不应该修改
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
Currying:将重复的参数存入闭包中
Composition: 通过函数自动组合对代码进行优化重写
Functor: 可以当作容器类型,类型支持对容器内元素进行操作
Monad: 可以去除嵌套容器的容器类型
Applicative:直接对两个容器进行操作
响应式编程
- 异步或离散的函数式编程
- 数据流
- 操作符
- 过滤
- 合并
- 转化
- 高阶
Observable:观察者模式,迭代器模式,Promise/EventTarget 超集
操作符:响应式编程的“compose”
- 合并
- 过滤
- 转化
- 异常处理
- 多播
Monad: 去除嵌套的Observable
领域特定语言
Domain-specific language(DSL):应用于特定领域的语言
- HTML
- SQL