0.2编程语言简介

现代计算机运算速度非常之快,并且越来越快,但随着速度的提升,计算机本身的机制却带来了很大的限制,电脑本身只能理解非常有限的指令集,我们必须明确地告诉计算机应该怎么做,而程序(也称应用或软件)就是这样一组指令。执行指令的是计算机硬件。

机器语言

计算机CPU是不能理解C++这样的高级语言的,它只能理解被称为机器代码(或者机器语言、指令集)的东西,这些指令时如何被组织的不在本教程讨论范围内,但有两点有趣的需要注意:一、每个指令都是由一组二进制数字组成的,每个数字只能是0或1,这些二进制数被称为比特(bit,binary digit的简写),例如,MIPS架构的指令集都是32位长的指令,其他架构的比如X86有可能是一个可变长度指令。下面的例子是一个x86架构机器语言指令:10110000 01100001。二、每一组二进制数字都由CPU转换成一个指令,指示计算机完成某种具体的任务,如比较两个数字,或把这个数字存放在内存中某个位置。不同类型的CPU通常会有不同的指令集,所以运行在Pentium 4计算机上的指令不一定能运行在Mac上。计算机发明之初,程序员必须直接用机器语言编写程序,这是一个非常困难且耗时的工作。

汇编语言

因为机器语言是如此难以编写,于是汇编语言应运而生。在汇编语言中,每个指令都由一个简短的名称(而不是一组二进制数)标识,变量可以通过名称来识别而不是单纯的数字,这使得它们变得更加容易读写。然而,CPU也不能直接理解汇编语言,它们必须被翻译成机器语言。汇编语言运行速度是非常快的,在速度至关重要的场合它至今仍然受到青睐。然而,汇编语言之所以这么快,是因为汇编语言是针对一个特定的处理器而设计的,为一个处理器编写的程序不能再另一个处理器上运行。此外,汇编语言仍然需要大量的指令来做非常简单的任务,并不是易于阅读的。这是一个简单的汇编指令:MOV AL,061h。

高级语言

为了解决汇编语言存在的问题,计算机科学家们又发明出了高级语言,C、C++、 Pascal、Java、JavaScript、Perl都是高级语言。高级语言使得程序员在编写程序时不必再考虑具体的机器,程序具有良好可移植性。但高级语言编写的程序在执行前必须通过一定的方式,转换为CPU可以理解的指令,通常有两种处理方式:编译和解释。

编译器是一个程序,它可以读取代码并生成一个独立的、CPU可直接理解并执行的程序。一旦代码变为可执行文件,就不需要编译器来运行程序。虽然乍一看,高级语言似乎没有汇编语言高效,但现代编译器可以快速完美地完成高级语言到可执行文件的转换,一定程度上弥补了高级语言的不足。以下是简化的编译过程展示:

解释器是一个可直接执行你代码的程序,而不必将其编译成机器代码。解释器往往更灵活,但运行程序时效率不高,因为每次程序运行时都需要重新解释,这意味着每次程序运行时都需要解释器。这是解释过程的一个简化表示:

任何语言都可以进行编译或解释,但是传统的语言如C,C++,Pascal,都是采用编译方式,而脚本语言如Perl和JavaScript则采用解释方式。有些语言,如java,则混合使用编译和解释。

高级语言有几个明显的优点。

  • 高级语言更容易读写。如C或C++:a = 97,这很容易理解。
  • 高级语言与汇编语言和机器语言相比,执行相同的任务需要较少的指令,例如在C++中你可以写a = b * 2 + 5;只有一行,而在汇编语言中,这将需要5或6个不同的指令。
  • 不必关注细节,比如变量将如何加载到CPU的寄存器中,编译器或解释器会替你完成所有这些工作。
  • 可移植到不同架构的机器,但有一个例外,我们待会儿会讲到。

这个例外是,许多平台例如微软的Windows,为其编写的程序中可能包含该平台特有的功能,这可以使为一个特定的平台编写程序变得更加容易,但也因此付出了损害程序可移植性的代价。本教程中,我们会明确指出所展示的程序适用的平台。