1.1 计算基础
考虑到你正在修一门编程课程,你可能已经对计算科学的基础知识有了一定的了解。但是,不是所有人都有同样的知识,或某些知识可能是不准确的。为此,在介绍Java语言之前,先介绍计算科学中的一些核心概念。在这个过程中,本章会定义一些关键术语。
1.1.1 计算机的硬件组成
由于计算机最终会运行编写的程序,因此了解计算机各部分运行的基本方式是有帮助的。任意一台计算机都由一系列的部件组成,它们协同运作,形成一个计算机整体。尽管计算机组成的部件随着时间推移不断演进,但是计算机仍有许多共同的关键特性。例如,一个台式计算机包含的基本元素在智能手机中也能找到。
为了有效工作,一台计算机至少包括要有以下组成部分:
中央处理器(CPU)
内存
输入/输出设备
下面逐一进行介绍。
CPU提供了计算机基本的计算能力。它通过执行组成程序的指令实现计算。所有的CPU都能识别某一种特定的指令集(instruction set)。指令集定义了CPU能够执行的操作种类。例如,许多CPU支持的指令有:基本算术运算、从内存中载入和存储数据、进行逻辑比较、改变程序流等。另外,为了访问内存,许多CPU包括有限数量的寄存器(register),为数据提供快速的短期存储。
CPU执行的指令称为机器指令(machine instruction)或机器码(machine code)。一个机器指令能执行的运算很少。例如,一个指令也许只能把一个寄存器的值移动到另一个寄存器上,或把一个值从寄存器移动到内存中,或对两个寄存器的值进行比较。一般情况下,一类CPU的指令集与其他类型的CPU的指令集并不相同。所以,为一类CPU设计的指令集通常不能用于另一类CPU上。有时存在一些CPU系列,它们保持后向兼容性,但无关的CPU的指令集通常不同。
机器指令通常不易于人类阅读。它们具有为方便计算机使用而编码的形式。但是,有可能用助记符来表示这些指令,使机器指令适于人类阅读。这种形式称为汇编语言(assembly language)。例如,将数据从一个地方移动到另一个地方的指令可以用助记符表示为MOV,比较两个值的指令可以记为CMP。将汇编语言转换为计算能执行的形式的程序称为汇编程序(assembler)。但是,像Java这样的语言通常是一种更好的选择,所以当今很少有人编写汇编语言。
计算机内存用于存储指令和数据,其中指令是用机器指令的形式存储的。内存主要用于在程序执行的过程中保存信息。它并不用于长期存储。计算机中的内存是可寻址的(addressable),即CPU可以通过给定地址来访问内存中的某一特定位置。内存常常又称为RAM,它是随机存储器(Random Access Memory)的缩写。
当CPU执行程序时,它先从内存中获得指令,然后执行指令指定的操作。接着,它在获得下一条指令,执行它,循环往复。在默认情况下,指令从内存中顺序读取。但是,有些指令能够改变执行流,跳转到一个不同的内存区域。
现在,人们使用着各种各样的输入/输出(I/O)设备,包括键盘、显示器、鼠标、触摸屏、语音输入和声音输出等。它们事实上有着同样的功能,它们使计算机能够收发信息。输入/输出设备常常用于使人们能同计算机交互。但是还有一些输入/输出设备是计算机用于与其他设备通信的,比如存储设备、网络适配器和像机器人似的控制接口。
除了以上描述的几种关键部件外,许多计算机还有存储设备,例如硬盘、DVD和闪存。许多计算机还能联网,连接到Internet或局域网。为了使计算机能够联网,计算机需要网络适配器。
1.1.2 位、字节和二进制
当今,几乎没有人没听说过位(bit)、字节(byte)和二进制(binary)。这些词汇已经成为人们的日常用语。由于它们是计算领域中非常基础的概念,因此正规地定义它们非常重要。
1)二进制计数系统
在最底层,计算机使用0和1工作,所以它需要基于0和1的计数系统。这个计数系统称为二进制计数系统。二进制计数系统就如我们通常使用的十进制计数系统一样工作,除了每个数位的权重不同。你也许已经知道,在十进制中,每从右往左移动一位,其表示的值的个数总比上一位表示的值的个数大十倍。于是,十进制数基于10的幂次:最右边的数位表示1的个数,其左边一位表示10的个数,然后是100的个数,等等。例如,数423表示四百二十三,因为其中有4个100,2个10和3个1。
二进制有着相同的工作原理,只是每从右往左移动一位,其表示的值的个数增加为上一位的2倍。于是,第一个二进制位(指最右边的位)表示1的个数,往左一位表示2的个数,然后是4的个数,8的个数,等等。这意味着,一个二进制的前8位表示以下数值:
128 64 32 16 8 4 2 1
例如,二进制数1010就是十进制数10。其原因是,二进制数1010有0个1,1个2,0个4,1个8。所以,0+2+0+8等于10。再来看一个例子:二进制数1101就是十进制数13,因为它有1个1,0个2,1个4和1个8,所以1+0+4+8等于13。正如你所见到的,如果要把二进制数转化为十进制数,只需要把1所在的数位表示的值相加即可。
2)位和字节
在计算机中,位可以用来表示一个二进制数位。一个位可以置位,也可以复位。置位的位是1,复位的位是0。位可以进行分组。一种最常见的形式是字节。通常认为一个字节含有8个位。这意味着字节可以表示0~255之间的数值。
另外,还有一种组织形式称为字(word)。通常认为,一个字的大小与特定的CPU架构兼容。例如,32位计算机上每个字有32位,即4个字节。
为了方便,二进制数常常每4个一组(有时每8个一组)进行分组,例如:1011 1001。这使得数字更加容易阅读和理解。但是,这样的分组对其表示的数值没有任何影响。
1.1.3 操作系统
计算机的硬件部件由操作系统(operating system)管理和访问。操作系统是一个控制计算机的主程序。操作系统是计算机科学的核心研究内容之一,在这里不可能详细介绍。幸运的是,只需要一点简单的概述知识就够我们使用了。
操作系统主要有两大功能。首先,它提供底层功能,使其他程序能够使用计算机的资源。例如,可以通过使用操作系统提供的服务,将信息保存在硬盘上。其次,操作系统能够控制其他程序的运行。例如,它为其他运行的程序提供内存空间、为其运行调度CPU时间,监控其资源使用状况。
有许多常见的操作系统,如:Windows、UNIX、Linux、Mac OS、iOS和Android。一般来说,程序在设计时必须运行于一个特定的操作系统。例如,以Windows为运行平台的程序不能在UNIX操作系统上运行,除非该程序经过特别的移植。