1、高级语言
计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种,例如 C、C++、Java、Python 等。这些语言被称为高级语言,因为它们更接近人类的自然语言,而不是计算机能够直接理解的二进制数字。
C/C++ 中的指令:
a = 97;
高级语言中理想的属性
首先,高级语言更容易阅读和编写,因为命令更接近我们每天使用的自然语言。其次,高级语言需要更少的指令来执行与低级语言相同的任务,使程序更简洁、更容易理解。
a = b * 2 + 5;
在 C++ 中,您可以在一行中执行类似操作。在汇编语言中,这需要 5 或 6 条不同的指令。程序可以针对许多不同的系统进行编译(或解释),并且您不必更改程序以在不同的 CPU 上运行(您只需为该 CPU 重新编译)。
2、机器语言
计算机的 CPU 无法使用 C/C++。CPU 可以直接理解的有限指令集称为机器代码(或机器语言或指令集)。
这是机器语言指令示例,是与上面C/C++ 中相同的指令:
10110000 01100001
这些指令指令都由 1 和 0 的序列组成。每个单独的 0 或 1 称为一个二进制数字,简称位。组成单个命令的位数各不相同。例如,某些 CPU 处理的指令始终是 32 位长,而其他一些 CPU(例如您可能正在使用的 x86/x64 系列)的指令可以是一个可变长度。
小知识(char *占几个字节)
char * 是一个指针类型,它表示一个指向字符的地址。指针的大小取决于系统的地址空间也就是系统可以访问的内存的范围。
8位系统的地址空间是 2^8 = 256 个字节,所以指针的大小是 1 个字节。
32位系统的地址空间是 2^32 = 4 GB,所以指针的大小是 4 个字节。
64位系统的地址空间是 2^64 = 16 EB,所以指针的大小是 8 个字节。
不同操作系统的库无法通用的原因(32/64)
每组二进制数字都被 CPU 解释为执行非常具体的工作的命令,例如比较这两个数字,或者将此数字放入该内存位置。但是,由于不同的 CPU 具有不同的指令集,因此为一种 CPU 类型编写的指令无法在不共享相同指令集的 CPU 上使用。这意味着程序通常无法移植(无需重大返工即可使用)到不同类型的系统,并且必须重新编写。
3、汇编语言
由于机器语言对于人类来说很难阅读和理解,因此发明了汇编语言。在汇编语言中,每条指令都由一个简短的缩写(而不是一组位)来标识,并且可以使用名称和其他数字。
这是与上面相同的汇编语言指令:
mov al, 061h
然而,组装仍然有一些缺点。首先,汇编语言仍然需要大量指令来完成甚至简单的任务。虽然各个指令本身在某种程度上是人类可读的,但理解整个程序正在做什么可能具有挑战性(这有点像试图通过单独查看每个字母来理解句子)。其次,汇编语言的可移植性仍然不是很好——为一个 CPU 用汇编语言编写的程序可能无法在使用不同指令集的硬件上运行,并且必须重写或进行大量修改。
4、编译和解释
计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种,例如 C、C++、Java、Python 等。这些语言被称为高级语言,因为它们更接近人类的自然语言,而不是计算机能够直接理解的二进制数字。
计算机的核心部件是 CPU(中央处理器),它负责执行程序中的指令。CPU 只能理解一种称为机器语言的低级语言,它是由 0 和 1 组成的位序列。每种 CPU 类型都有自己的机器语言,也称为指令集。这意味着用一种机器语言编写的程序不能在另一种机器语言的 CPU 上运行。
为了让 CPU 能够执行高级语言编写的程序,需要将高级语言转换为机器语言。这可以通过两种主要方式实现:编译和解释。
编译
编译是一种将高级语言的源代码(程序员编写的代码)转换为可执行文件(机器语言的代码)的过程。这是通过使用一种称为编译器的程序来完成的。编译器可以根据不同的 CPU 类型生成不同的可执行文件。一旦生成了可执行文件,就不需要源代码或编译器来运行程序。
这是编译过程的简化表示:
由于 C++ 程序通常是编译的,因此我们很快就会更详细地探讨编译器。
解释
解释是一种在运行时将高级语言的源代码逐行转换为机器语言的过程。这是通过使用一种称为解释器的程序来完成的。解释器可以在不同的 CPU 类型上运行相同的源代码。每次运行程序时都需要源代码和解释器。解释器往往比编译器更灵活,但运行程序时效率较低,因为每次运行程序时都需要完成解释过程。这也意味着每次运行程序时都需要解释器。
这是解释过程的简化表示:
编译和解释优缺点
- 编译的优点是生成的可执行文件通常运行得更快,而且不需要分发源代码。
- 编译的缺点是需要为每种 CPU 类型生成不同的可执行文件,而且编译过程可能比较耗时。
- 解释的优点是源代码可以在不同的 CPU 类型上运行,而且不需要编译过程。
- 解释的缺点是运行程序时需要解释器,而且运行速度通常比编译的慢。