学习笔记:编程语言分类与翻译程序
未来的计算机科学家们,大家好!欢迎来到精彩纷呈的编程世界。在本章中,我们将学习人类(也就是我们!)是如何向计算机传达指令的,以及计算机又是如何理解这些指令的。你可以把这一章的学习看作是学习如何建造一个“通用翻译机”!理解这些概念至关重要,因为它揭示了你的代码最终为什么能够如此高效地运行。
1. 编程语言的分类
根据编程语言与计算机原生语言(即 1 和 0)的接近程度,或与人类语言的接近程度,编程语言主要分为两大类。
1.1 低级语言 (Low-Level Languages, LLLs)
低级语言非常接近硬件和中央处理器 (CPU)。对于人类来说,阅读、编写和调试(修复错误)通常比较困难。
低级语言的主要特点:
- 与硬件相关 (Hardware-specific):为某种特定 CPU 编写的代码通常无法在其他 CPU 上运行。
- 运行速度非常快:因为它们几乎不需要翻译,或者只需要极少的翻译。
低级语言主要有两种类型:
a) 机器码 (Machine Code)
这是 CPU 原生能够理解的唯一语言。它完全由二进制数字(1 和 0)组成。
- 示例:0010 1100 0001 0000(这可能代表“将两个数相加”)。
- 为什么很难:想象一下只用 1 和 0 来写一部小说。这对于人类来说几乎是不可能完成的任务!
b) 汇编语言 (Assembly Language)
汇编语言的出现是为了让低级语言对人类而言稍微容易一点。它不再使用 1 和 0,而是使用简短的助记符(Mnemonics)。
- 助记符:指令的简短、易记的缩写。
- 示例:与其写 0010,你可能会写 ADD(代表加法)或 MOV(代表移动数据)。
- 要求:尽管使用了文字,汇编语言仍然需要一个翻译程序(称为汇编器 Assembler)来将其转换为机器码。
快速回顾:低级语言运行速度快、依赖特定硬件,但对人类而言编写困难。它们包括机器码(二进制)和汇编语言(助记符)。
1.2 高级语言 (High-Level Languages, HLLs)
高级语言的设计初衷是为了让人们更容易阅读、编写和理解。它们使用的词汇和结构与人类语言和数学相似。
高级语言的主要特点:
- 可移植性 (Portable):在一种计算机上编写的代码,通常无需进行重大修改就能在多种不同类型的硬件(例如 Mac、PC、Linux)上运行。
- 抽象性 (Abstract):程序员无需了解 CPU 硬件的具体细节。
- 更容易调试和维护。
示例:Python、Java、C++ 和 JavaScript 等语言都属于高级语言。
如果你想让计算机将两个数相加,在高级语言中,你只需简单地写下:
total = num1 + num2
这比写几页的 1 和 0 要清晰得多!
类比专栏:
把编程语言想象成驾驶汽车:
低级语言:你必须手动调节每一个零件:火花塞的点火正时、燃油喷射量、活塞上的精确压力。
高级语言:你只需要踩下加速踏板(太简单了!),汽车会自动为你处理所有复杂的机械运作。
2. 翻译的必要性
记住这个黄金法则:CPU 只能执行用机器码(二进制)编写的指令。
由于高级语言(如 Python)是用类似于英语的单词编写的,因此在 CPU 运行它们之前,必须先将它们转换为机器码。这个转换过程被称为翻译 (Translation),而执行此转换的程序被称为翻译程序 (Translators)。
如果一开始觉得这有点复杂,别担心!翻译程序就像在国外的口译员一样——它们架起了沟通的桥梁。
3. 翻译程序的类型(语言之桥)
你需要掌握三种主要的软件翻译程序:汇编器、编译器和解释器。
3.1 编译器 (The Compiler)
编译器是专门为处理高级语言而设计的翻译程序。
编译器的工作原理:
编译器在程序运行之前,会将整个源代码一次性翻译成机器码。
- 编译器获取原始的高级代码(源代码 Source code)。
- 它会检查整个程序是否存在错误(语法错误)。
- 如果没有错误,它会将整个程序转换为一个新文件,称为目标代码 (Object code)(即机器码)。
- 该目标代码被保存为一个独立的可执行文件(例如 .exe 文件),用户无需再次使用编译器即可随时运行。
编译器的优缺点:
- 优点(速度):一旦编译完成,程序运行非常快,因为翻译工作已经提前完成了。
- 优点(发布):它创建了一个永久的可执行文件,可以在不共享原始源代码的情况下进行销售或分发。
- 缺点(开发):整个程序必须在测试或运行前确保没有任何错误。寻找错误需要重新编译整个代码,这可能会比较缓慢。
编译器就像把整本书从法语翻译成英语。起初需要花费较长的时间(编译),但一旦完成,这本英语书(可执行文件)就可以被任何人即刻阅读。
3.2 解释器 (The Interpreter)
解释器也是一种用于高级语言的翻译程序,但它的工作方式与编译器大不相同。
解释器的工作原理:
解释器在程序运行时,会逐行翻译并执行源代码。
- 解释器读取源代码的第一行。
- 它将该行翻译成机器码。
- 它立即执行该行。
- 然后转到下一行,重复上述过程。
解释器的优缺点:
- 优点(调试):如果发现错误,解释器会立即停止并告知程序员错误所在的具体行号。这使得测试和查找错误变得快得多。
- 优点(测试):即使只完成了代码的一小部分,程序也可以立即运行。
- 缺点(速度):程序的运行速度通常比编译后的代码慢,因为每次程序执行时,每一行代码都必须重新翻译。
- 缺点(无执行文件):它不会生成永久、独立的可执行文件。每次运行程序时,源代码和解释器都必须同时存在。
3.3 汇编器 (The Assembler)
汇编器是最简单的翻译程序类型。它的工作职责非常明确:将汇编语言(助记符)翻译成机器码(二进制)。
由于汇编语言本身已经非常接近机器码,这个翻译过程相当直接且通常速度极快。
- 编译器 (Compiler):翻译Complete(完整的)程序。结果是执行速度快。
- 解释器 (Interpreter):Interactively(交互式)逐行翻译。便于发现错误。
4. 编译器与解释器的对比
编译器与解释器之间的区别是一个非常重要的考试重点。你必须能够说明它们在方法、速度和输出方面的差异。
以下是总结关键区别的对比表:
翻译程序的关键差异
| 特征 | 编译器 (Compiler) | 解释器 (Interpreter) |
|---|---|---|
| 翻译方式 | 一次性翻译整个程序。 | 逐行翻译并执行。 |
| 输出文件 | 生成永久、独立的可执行文件(目标代码)。 | 不生成永久目标代码;翻译在每次程序运行时发生。 |
| 执行速度 | 快(因为翻译工作已经提前完成)。 | 较慢(因为翻译在执行过程中实时发生)。 |
| 错误处理(调试) | 检查完整个程序之后才会报告所有错误。 | 遇到第一个错误时立即停止,使调试更简单。 |
你知道吗?Python 是一种非常流行的高级语言,在开发阶段通常使用解释器,因为它能让调试变得非常迅速!然而,一些公司在需要最高执行速度时,也会为 Python 使用专门的编译器。
要避开的常见陷阱!
一个常见的错误是忘记了:尽管解释器运行最终程序的速度较慢,但在开发阶段,它们往往对程序员而言更快,因为它们能立即精确定位错误。在回答问题时,一定要明确指出为什么一种比另一种快(是执行速度快,还是调试速度快)。
本章重点总结
- 低级语言 (LLL) 包括机器码(1 和 0)和汇编语言(助记符)。它们速度快但依赖特定硬件。
- 高级语言 (HLL) 接近人类语言,易于调试且具备可移植性。
- 所有高级语言必须通过编译器或解释器翻译成机器码。
- 编译器翻译整个程序,生成一个运行速度快的可执行文件。
- 解释器逐行翻译,运行速度较慢,但更利于编码时的快速查错。