编程语言

首先,计算机最能直接理解的就是二进制信息;或者说计算机只能直接理解二进制信息。比如计算机接收到了这样的一串二进制信息:

10001011 01000101 11110000 00001111
10101111 01000101 11110100 10001001
11000010 10001011 01000101 11111000
00000001 11010000 10001001 01000101
11111100

那么计算机就能用一种已经定义好的规则来理解它。然后计算机就明白了它下一步要做什么,于是控制自己的行为——存储数据、运算数据、输入输出等等。

这密密麻麻的0和1就是编程语言的一种。编程语言(Programming Language)是指一种计算机能够理解的文本,它定义了计算机如何控制其行动。其中,像这样仅有二进制数据的编程语言叫做机器语言(Machine Language)。

显然机器语言看上去有些奇怪——因为人类没法很清楚方便地理解它。实际刚才那段二进制信息有些是控制计算机存储的,有些是控制计算机运算的,但是并不能一眼就看明白。因此人们设计了汇编语言(Assembly Language)。汇编语言是指,定义一些特别的单词来替代原先的二进制信息。举个例子,刚才的那段“代码”就可以用如下的汇编语言写出:

mov    -0x10(%rbp),%eax
imul   -0xc(%rbp),%eax
mov    %eax,%edx
mov    -0x8(%rbp),%eax
add    %edx,%eax
mov    %eax,-0x4(%rbp)

看上去是不是比原来好点了?因为这里至少出现了类似 mov add 之类的人类能理解的词(它们的含义是“移动”和“做加法”)。尽管我们仍然看不清楚它到底做了什么,但至少已经有一定雏形了。

这段汇编的实际含义如下:

  • 将数据 a (位于 -0x10)移入 EAX 寄存器
  • 将数据 b (位于 -0xc)与 EAX 寄存器相乘存入 EAX 中
  • 将 EAX 寄存器数据移入 EDX 寄存器
  • 将数据 c (位于 -0x8)移入 EAX 寄存器
  • 将 EDX 寄存器与 EAX 寄存器相加存入 EAX 中
  • 将 EAX 寄存器数据存至数据 d (位于 -0x4)

其中“寄存器”就是计算机的一种用于存储的空间。

人们称机器语言和汇编语言为“低级语言”。这是因为它们的抽象能力很低,人类理解起来有难度。但另外一方面,机器理解起来却很容易。计算机可以直接理解机器语言;而汇编语言只需经过一次简单的翻译将单词转换为二进制代码即可。

因此人们希望有语言既能够使计算机理解,也能使人类理解。这就促成了诸如 C 语言的一系列高级语言的诞生。在 C 语言中,刚才的一长串汇编语言可以直接写成:

d = a * b + c;

意思就是命令计算机做这样的计算:将 ab 乘起来,然后加上 c;最后让 d 等于这个值。对于人类来说这太容易理解了。但是计算机怎么办?在开头我也说到过计算机只能理解 0 啊 1 啊这些二进制信息。因此这需要一个复杂的过程叫做编译(Compile)。广义上讲,编译是将高级语言翻译为等价的机器语言的过程,使得电脑可以执行生成的机器语言。编译这件事情是由编译器(Compiler,又称编译程序)负责的。

那么编程语言的介绍到这里就结束了。我希望我能够讲清楚人们是怎么通过编程语言让计算机做人类想要它做的事情。

你如果想看关于 C++ 历史的介绍,参见这一页

最近更新:
代码未运行