0.2--编程语言简介[译]
现代计算机的运行速度快得令人难以置信,而且速度一直在变得越来越快。然而,计算机也有一些重大的限制:它们本身只能理解一组有限的命令,并且必须被准确告知要做什么。
计算机程序(通常也称为应用程序)是计算机可以执行的一组指令,以执行某些任务。创建程序的过程称为编程。程序员通常通过编写源代码(通常简称为代码)来创建程序,源代码是存在于一个或多个文本文件的命令列表。
组成计算机并执行程序的物理计算机部件的集合称为硬件。当计算机程序被加载到内存中并且硬件顺序执行每条指令时,这称为运行或执行程序。
机器语言
计算机的 CPU 不认识 C++。 CPU 可以直接理解的有限指令集称为机器代码(或机器语言或指令集)。
以下是机器语言指令示例: 10110000 01100001
在计算机刚发明的时候,程序员必须直接用机器语言编写程序,这是一件非常困难且耗时的事情。
这些指令的组织方式超出了本节介绍的范围,但有两件有趣的事值得注意。首先,每条指令都由 1 和 0 的序列组成。每个单独的 0 或 1 称为一个二进制数字,简称为位。组成单个命令的位数各不相同 - 例如,某些 CPU 处理的指令始终是 32 位长,而其他一些 CPU(例如您可能正在使用的 x86/x64 系列)的指令可以是一个可变长度。
其次,每组二进制数字都被 CPU 解释为执行非常具体的工作的命令,例如比较这两个数字,或者将此数字放入该内存位置。但是,由于不同的 CPU 具有不同的指令集,因此为一种 CPU 类型编写的指令无法在不共享相同指令集的 CPU 上使用。这意味着程序通常无法移植(无需重大返工即可使用)到不同类型的系统,并且必须重新编写。
汇编语言
由于机器语言对于人类来说很难阅读和理解,因此发明了汇编语言。在汇编语言中,每条指令都由一个简短的缩写(而不是一组位)来标识,并且可以使用名称和其他数字。
以下是与上面相同的汇编语言指令: mov al, 061h
这使得汇编比机器语言更容易阅读和编写。然而,CPU不能直接理解汇编语言。相反,汇编程序必须先翻译成机器语言,然后才能由计算机执行。这是通过使用称为汇编编译器的程序来完成的。用汇编语言编写的程序往往速度非常快,并且在考虑运行速度的情况下仍然会使用汇编语言。
然而,汇编仍然有一些缺点。首先,汇编语言仍然需要大量指令来完成甚至简单的任务。虽然各个指令本身在某种程度上是人类可读的,但理解整个程序正在做什么可能具有挑战性(这有点像试图通过单独查看每个字母来理解句子)。其次,汇编语言的可移植性仍然不是很好——为一个 CPU 用汇编语言编写的程序可能无法在使用不同指令集的硬件上运行,并且必须重写或进行大量修改。
高级语言
为了解决可读性和可移植性问题,新的编程语言,例如 C、C++、Pascal(以及后来的 Java、Javascript 和 Perl 等语言)被开发了出来。这些语言被称为高级语言,因为它们旨在允许程序员编写程序而不必关心程序将在哪种计算机上运行。
以下是与上面的指令相同的 C/C++ 中的指令: a = 97;
与汇编程序非常相似,用高级语言编写的程序必须先翻译成计算机可以理解的格式,然后才能运行。有两种主要方法可以完成此操作:编译和解释。
编译器(compiler)是一个程序(或程序集合),它读取源代码(通常用高级语言编写)并将其翻译成其他语言(通常是低级语言,例如汇编语言或机器语言等......) 。最常见的是,这些低级语言文件随后被组合成可以运行或分发给其他人的可执行文件(包含机器语言指令)。值得注意的是,运行可执行文件不需要安装编译器。
一开始,编译器很原始,生成的代码速度缓慢且未经优化。然而,多年来,编译器已经变得非常擅长生成快速、优化的代码,并且在某些情况下可以比人类在汇编语言中做得更好!
这是编译过程的简化表示:

由于 C++ 程序通常是编译的,因此我们很快将更详细地探讨 C++ 编译器。
解释器(interpreter)是一种直接执行源代码中的指令而不需要先将它们编译成可执行文件的程序。解释器往往比编译器更灵活,但运行程序时效率较低,因为每次运行程序时都需要完成解释过程。这也意味着解释器必须安装在将运行解释程序的每台机器上。
这是解释过程的简化表示:

选择性阅读
可以在此处找到编译器与解释器的优点的详细比较。
编译程序的另一个优点是分发编译程序不需要分发源代码。在非开源环境中,这对于 IP 保护目的非常重要。
大多数语言都可以编译或解释。传统上,C、C++ 和 Pascal 等语言是编译的,而 Perl 和 Javascript 等“脚本”语言往往是解释的。有些语言(例如 Java)混合使用了这两种语言。
高级语言有许多理想的属性。
首先,高级语言更容易阅读和编写,因为命令更接近我们每天使用的自然语言。其次,高级语言需要更少的指令来执行与低级语言相同的任务,使程序更简洁、更容易理解。在 C++ 中,您可以在一行中执行类似 a = b * 2 + 5; 的操作。在汇编语言中,这需要 5 或 6 条不同的指令。
第三,程序可以针对许多不同的系统进行编译(或解释),并且您不必更改程序以在不同的 CPU 上运行(您只需为该 CPU 重新编译)。举个例子:

可移植性有两个例外。
首先,许多操作系统(例如 Microsoft Windows)包含可以在代码中使用的特定于平台的功能。这些可以使为特定操作系统编写程序变得更加容易,但代价是可移植性。在这些教程中,我们将避免任何特定于平台的代码。
第二个是一些编译器还支持特定于编译器的扩展 - 如果您使用这些扩展,您的程序将无法由不支持相同扩展的其他编译器在未经修改的情况下进行编译。安装编译器后,我们稍后会详细讨论这些内容。
规则、最佳实践和警告
当我们继续学习这些教程时,我们将强调以下三个类别下的许多重要点:
规则
规则是您必须按照语言要求执行的指令。不遵守规则通常会导致您的程序无法运行。
最佳实践
最佳实践是您应该做的事情,因为这种做事方式要么是传统的(惯用的),要么是推荐的。也就是说,要么每个人都这样做(如果你不这样做,你就会做人们意想不到的事情),要么它优于其他选择。
警告
警告是您不应该做的事情,因为它们通常会导致意外结果。
浙公网安备 33010602011771号