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;

与汇编程序非常相似,用高级语言编写的程序必须翻译成计算机可以理解的格式,然后才能运行。有两种主要方式:编译和解释。

编译器是一个程序(或程序集合),它读取源代码(通常用高级语言编写)并将其翻译成其他语言(通常是低级语言,如汇编语言或机器语言等)。大多数情况下,这些低级语言文件被合并成一个可执行文件(包含机器语言指令),可以运行或分发给其他人。值得注意的是,运行可执行文件不需要安装编译器。

一开始,编译器是原始的,生成缓慢的、未优化的代码。然而,多年来,编译器已经变得非常擅长生成快速、优化的代码,在某些情况下,编译器在汇编语言方面可以比人类做得更好!

以下是编译过程的简化表示:

编译示例

由于 C++ 程序通常是编译的,因此我们稍后将更详细地探讨 C++ 编译器。

解释器是一种程序,它直接执行源代码中的指令,而不需要先将它们编译成可执行文件。解释器往往比编译器更灵活,但在运行程序时效率较低,因为每次运行程序时都需要完成解释过程。这也意味着在运行被解释程序的每台机器上都必须安装解释器。

以下是解释过程的简化表示:

口译示例

可选阅读

编译器与解释器的优势可以在这里找到一个很好的比较。

编译程序的另一个优点是分发编译程序不需要分发源代码。在非开源环境中,这对于知识产权保护非常重要。

大多数语言都可以被编译或解释。传统上,像 C,C++ 和 Pascal 这样的语言是编译的,而像 Perl 和 Javascript 这样的“脚本”语言往往是被解释的。某些语言(如 Java)混合使用两者。

高级语言具有许多理想的属性。

首先,高级语言更容易阅读和编写,因为这些命令更接近我们每天使用的自然语言。其次,与低级语言相比,高级语言需要更少的指令来执行相同的任务,使程序更简洁、更易于理解。在 C++ 中,你可以在一行中执行操作a = b * 2 + 5;。在汇编语言中,这需要 5 或 6 条不同的指令。

第三,程序可以针对许多不同的系统进行编译(或解释),并且你不必更改程序以在不同的 CPU 上运行(你只需针对该 CPU 重新编译即可)。举个例子:

可移植性示例

可移植性有两个一般例外。

首先,许多操作系统(如 Microsoft Windows)都包含可在代码中使用的特定于平台的功能。这些可以使为特定操作系统编写程序变得更加容易,但以牺牲可移植性为代价。在这些教程中,我们将避免使用任何特定于平台的代码。

其次,一些编译器还支持特定于编译器的扩展 — 如果你使用这些扩展,你的程序不经过修改将无法被其他不支持相同扩展的编译器编译。你安装了编译器后,我们将在稍后详细讨论这些内容。

规则、最佳做法和警告

在继续学习这些教程时,我们将重点介绍以下三个类别下的许多要点:

规则

规则是你必须按照语言的要求执行的指令。不遵守规则通常会导致你的程序无法运行。

最佳实践

最佳实践是你应该做的事情,因为这种做事方式要么是传统的(惯用的),要么是推荐的。也就是说,要么每个人都这样做(如果你不这样做,你就会做一些人们意想不到的事情),要么它优于替代方案。

警告

警告是你不应该做的事情,因为它们通常会导致意想不到的结果。