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.2.2 非结构化的 Non-structured 编程语言¶
早期的 BASIC 等编程语言中即使存在表示分支、循环等含义的关键字,但是由于不存在 代码块 之类的结构,因此分支、循环之类的控制流仍然需要通过 jmp
或者 goto
等含义类似的语句来完成:
可以看到,在早期BASIC语言中,虽然出现了if
关键字,但仍然需要通过goto
跳转到特定行来实现分支控制流。
这是因为,在这种语言中的代码是以 单条代码 为单位的,而不是像 C/C++ 中以 语句块 为单位的。
1.2.3 结构化的编程语言¶
下面是一段C代码:
C 和 C++ 等编程语言都是 结构化编程语言 (structured programming languages) ,因为它们有诸如分支、循环、语句块、函数之类的语言结构。
1.3 总结¶
计算机的行为是具体的、与机器和环境高度相关的
而人类思维是更加普遍的、远离细节的
从非结构化到结构化编程,编程语言从「更贴近计算机行为」向「更接近人类思维」的方向迈了一步。
这就是我们所说的 抽象 (abstraction) 。
「抽象」的好处就是能够提升程序或者编程语言的通用性、易读性、易写性、可移植性 坏处是可能会损失一些更加精细的控制,也 有可能 会影响到编译时或运行时的性能。
可以看到,随着抽象程度的增加,程序的性能只可能更差 或不变 (or Equal),
而C++的目标就是抓住这里的 「or Equal」,即在不损失性能的同时增加语言的抽象程度,使其更易读与理解。
相关链接