【4】编程范式 | 青训营笔记

100 阅读4分钟

编程语言

为什么需要编程语言?

  • 计算机是工具,无意识
  • 程序员通过指令指导计算机工作
  • 指令即为编程语言

机器语言

机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。机器语言使用绝对地址和绝对操作码。不同的计算机都有各自的机器语言,即指令系统。从使用的角度看,机器语言是最低级的语言。

  • 机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。
  • 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码
  • 基本格式:操作码字段+地址码字段;操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。 1.png

汇编语言

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植

  • 汇编语言,即第二代计算机语言,用一些容易理解和记忆的缩写单词来代替一些特定的指令。例如:用"ADD"代表加法操作指令,"SUB"代表减法操作指令,以及"INC"代表增加1,"DEC"代表减去1,"MOV"代表变量传递等等
  • 通过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能,对现有程序的bug修复以及运营维护都变得更加简单方便。但计算机的硬件不认识字母符号,这时候就需要一个专门的程序把这些字符变成计算机能够识别的二进制数或机器语言。
  • 汇编语言只是将机器语言做了简单编译,所以并没有根本上解决机器语言的特定性,所以汇编语言和机器自身的编程环境息息相关,推广和移植很难,但是还是保持了机器语言优秀的执行效率,因为他的可阅读性和简便性,汇编语言到现在依然是常用的编程语言之一。
  • 汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层硬件操作高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。 2.png

中级语言

面向过程代表——C

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

高级语言

面向对象代表——C++

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

函数式代表——lisp

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

多范式代表——JavaScript

  • 基于原型和头等函数的多范式语言
    • 过程式
    • 面向对象
    • 函数式
    • 响应式

3.png

编程范式

什么是编程范式

程序语言特性

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

常见编程范式

编程范式

  • 命令式
    • 面向对象
    • 面次过程
  • 声明式
    • 函数式
    • 响应式

过程式编程

自顶向下

1.png 2.png

结构化编程

3.png

JS中的面向过程

export var car = {
/*这是数据*/
    meter:100,
    speed:10,
};
export function advanceCar(meter){
/*这是算法*/
    while(car < meter){
        car.meter += car.speed;
    }
}
    
import{car,advanceCar}from './car';
function main(){
    console.log('before',car);
    advanceCar(1000);
    console.log('after',car);
}

面向过程

面向过程式编程有什么缺点?

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

面向对象编程特征

  1. 封装

关联数据与算法

class Car{
    meter = 100
    speed = 100
    advance(meter){
        while(this.meter<meter){
            this.meter+=this.speed;
        }
    }
getSpec(){
    return `meter:${this.meter};speed:${this.speed};`;
}
function main(){
    var car = new Car();
    car.advance(1000);
}
  1. 继承

无需重写的情况下进行功能扩充

class FlyCar extends Cars{
    //新数据
    height = 100
    fly(height){//新算法
        while(this.height<height){
            this.height+=this.speed
        }
    }
}
  1. 多态

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

class FlyCar extends Cars{
    height = 100
    fly(height){
        while(this.height<height){
            this.height+=this.speed
        }
    }
    getSpec(){//接口复用
    return `meter:${this.meter};speed:${this.speed};`;
}
  1. 依赖注入*

去除代码耦合

4.png

5.png

面向对象编程——五大原则

  • 单一职责原则SRP(single responsibility principle)

每一个类应该专注于做一件事情。

  • 开放封闭原则OCP(open_close principle)

面向扩展开放,面向修改关闭。

  • 里式替换原则LSP(the liskov substitution principle)

超类存在的地方,子类是可以替换的。

  • 依赖倒置原则DIP(the dependency inversion principle)

实现尽量依赖抽象,不依赖具体实现。

  • 接口分离原则ISP(the interface segregation principle)

应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。

领域特定语言

什么是领域特定语言?

Domain-special language(DSL):应用于特定领域的语言

  • HTNL
  • SQL

1.png

2.png

1.png

2.png

3.png

4.png

5.png

6.png