编程语言介绍

编程语言介绍

如今的计算机速度极快,而且速度越来越快。然而,即便有如此快的速度,它依然存在一些重要的制约因素:计算机本身只能理解一组非常有限的命令,你必须准确地告诉它做什么,它才会做什么。

计算机程序(通常也被称为应用程序)是一组可以让计算机执行一些任务的指令。创建程序的过程称为编程。程序员通常通过书写源代码(通常缩写为代码)来创建程序,源代码是键入一个或多个文本文件内的命令列表。

组成计算机和执行程序的物理计算机部件的集合称为硬件。计算机程序被加载到内存中,硬件按顺序执行每个指令,这就称为运行或执行程序。

机器语言

计算机的CPU无法理解C++。CPU可以直接理解的有限指令集称为机器代码(或机器语言或指令集)。

这是一个机器语言指令的例子: 10110000 01100001

当计算机最初发明时,程序员必须直接用机器语言编写程序,这是一件非常困难和耗时的事情。

如何组织这些指令超出了本介绍的范围,但有两点需要注意。首先,每条指令由1和0的序列组成。每个单独的0或1称为二进制数字,或简称为。组成单个命令的位数会有所不同 – 例如,某些CPU只会处理32位长的指令,而某些其他CPU(例如x86系列)具有长度可变的指令。

其次,每组二进制数字由CPU解释为执行特定工作的命令,例如这两个数字的比较,或将此数字放在该内存位置。但是,由于不同的CPU具有不同的指令集,因此不能在不共享相同指令集的CPU上使用为一种CPU类型编写的指令。这意味着程序通常不可移植(如果没有进行大返工的前提下)用于不同类型的系统,并且必须重新编写。

汇编语言

因为机器语言对人类来说很难阅读和理解,所以发明了汇编语言。在汇编语言中,每个指令由短缩写(而不是一组位)标识,并且可以使用名称和其他数字。

这是一个与上述指令相同但用汇编语言描述的例子: mov al, 061h

这使得汇编比机器语言更容易读取和写入。但是,CPU无法直接理解汇编语言。相反,必须先将汇编程序翻译成机器语言,然后才能由计算机执行。这是通过使用称为汇编器(assembler)的程序完成的。用汇编语言编写的程序往往非常快,而如今,在速度至关重要的情况下,还是会有人使用汇编语言。

但是,汇编语言仍有一些缺点。首先,汇编语言仍需要大量指令来完成简单的任务。虽然单个指令本身在某种程度上是人类可读的,但了解整个程序正在做什么就比较难了(这有点像试图通过单独查看每个字母来理解句子)。其次,汇编语言的可移植性仍然不够 – 使用汇编语言为一种CPU类型编写的程序不能在其他使用不同指令集的硬件上运行。并且必须重写或进行大量修改。

高级语言

为了解决可读性和可移植性问题,一些新的编程语言,如C,C++,Pascal(以及后来的Java,Javascript和Perl等语言)出现了。这些语言被称为高级语言,因为它们旨在允许程序员编写程序而无需关心程序将运行在何种类型的计算机上。

这儿同样是与上述相同的指令但用高级语言描述的例子: a = 97;

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

编译器是一个程序,可以读取源代码,并生成一个独立的可执行程序。将代码转换为可执行文件后,您无需编译器即可运行该程序。最初,编译器不够强大,生成的都是缓慢且未经优化过的代码。然而,这么多年过来了,编译器已经非常擅长生成快速、经过优化的代码,并且在某些情况下可以比人类在汇编语言方面做得更好!

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

编译例子

由于C++程序通常是需要编译的,因此我们将在稍后详细介绍编译器。

解释器是直接执行在源代码中的指令,而不需要他们首先被编译成可执行的程序。解释器往往比编译器更灵活,但在运行程序时效率较低,因为每次运行程序时都需要完成解释过程。这意味着每次运行程序时都需要解释器。

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

解释例子

可以在此处查看对编译器与解释器的优缺点的详细比较(可选阅读)

大多数语言都可以被编译或解释,但是,传统语言如C,C++和Pascal是需要编译的,而像Perl和Javascript这样的“脚本”语言往往需要被解释。有些语言,比如Java,混合使用了两种方法。

高级语言有许多可取的特性

首先,高级语言更容易读写,因为命令更接近我们每天使用的自然语言。

其次,高级语言需要较少的指令来执行与低级语言相同的任务,使程序更简洁,更容易理解。在C++中,您可以a = b * 2 + 5;在一行中执行某些操作。在汇编语言中,这将需要5或6个不同的指令。

第三,高级语言写的程序可以在很多不同的平台被编译/解释,你不需要通过修改程序来让它运行在不同的PUC(你只需要为那个Cpu重新编译)。举个例子:

可移植性的例子

可移植性有两个常见的例外。首先,许多操作系统(如Microsoft Windows)提供很多平台特有代码(platform-specific functions)供你在代码中使用,这些平台特有代码可以使编写特定操作系统的程序变得更加容易,但代价是可移植性。在这些教程中,我们将避免使用任何平台特有代码

某些编译器还支持特定于编译器的扩展 - 如果您使用这些扩展,您的程序将无法由其他不支持相同扩展的编译器编译而无需修改。一旦安装了编译器,我们稍后会详细讨论这些内容。

有些编译器支持特定编译器拓展 – 如果你使用了它,你的程序就不能被其他编译器编译,除非其他编译器支持同样的编辑器拓展,我们会在之后教你安装编译器的时候再来讨论这一点。