跳转至

1 抽象

约 649 个字    14 行代码  预计阅读时间 2 分钟

1.1 什么是抽象

来看下面两个例子:
Python: a = 1234567890123456789012345678901234567890

C: int a = 1234567890123456789012345678901234567890;

Warning

integer constant is too large for its type

那么,同样是为a赋值,为什么Python不会报错而C会报错呢?
原因是,Python的抽象程度更高,更符合人的自然思维对"整数型"的理解,
而C更贴近计算机底层,其int范围上限为\({2^{31}-1}\)
因此,一门语言如果其逻辑越贴近人类的思维模式,那么这门语言就越抽象。

1.2 早期编程语言的发展

flowchart TD
    A[机器码 Machine Code] --> B[汇编语言 Assembly </br> 使用助记符 Mnemonics </br> 和 Labels] --> C[非结构化的 Non-structured 编程语言 </br> 早期 BASIC, Fortran 等] --> D[结构化的编程语言 </br> C, C++ 等]

1.2.1 汇编语言 Assembly

汇编中并不存在直接完成「分支」的语言结构,而是通过 比较跳转 的组合来完成相应的效果的。

1-abstraction-1.png

1.2.2 非结构化的 Non-structured 编程语言

早期的 BASIC 等编程语言中即使存在表示分支、循环等含义的关键字,但是由于不存在 代码块 之类的结构,因此分支、循环之类的控制流仍然需要通过 jmp 或者 goto 等含义类似的语句来完成:

10 let a = 6
20 let b = 7
30 if a < b goto 60
40 print(a)
50 goto 70
60 print(b)
70 end

可以看到,在早期BASIC语言中,虽然出现了if关键字,但仍然需要通过goto跳转到特定行来实现分支控制流。
这是因为,在这种语言中的代码是以 单条代码 为单位的,而不是像 C/C++ 中以 语句块 为单位的。

1.2.3 结构化的编程语言

下面是一段C代码:

a = 6;
b = 7;
if (a < b) { // 代码块 1
    print(b);
} else { // 代码块 2
    print(a);
}

C 和 C++ 等编程语言都是 结构化编程语言 (structured programming languages) ,因为它们有诸如分支、循环、语句块、函数之类的语言结构。

1.3 总结

计算机的行为是具体的、与机器和环境高度相关的
而人类思维是更加普遍的、远离细节的

从非结构化到结构化编程,编程语言从「更贴近计算机行为」向「更接近人类思维」的方向迈了一步。
这就是我们所说的 抽象 (abstraction) 。

「抽象」的好处就是能够提升程序或者编程语言的通用性、易读性、易写性、可移植性 坏处是可能会损失一些更加精细的控制,也 有可能 会影响到编译时或运行时的性能。

1-abstraction-2.png

可以看到,随着抽象程度的增加,程序的性能只可能更差 或不变 (or Equal),
而C++的目标就是抓住这里的 「or Equal」,即在不损失性能的同时增加语言的抽象程度,使其更易读与理解。

相关链接

探索 C++

评论