程序设计语言其实是一种人类用来和计算机进行沟通的语言,也是用来指挥计算机进行运算或执行任务的指令集合。许多不懂计算机的人可能会把程序想象成十分深奥难懂的技术文件,其实程序只是由一系列合乎程序设计语言语法规则的指令所组成的,程序设计就是编写程序指令或程序代码来指挥计算机辅助我们人类完成各项工作。
随着程序设计语言不断地发展和演进,成就了今日计算机上各种各样软件的蓬勃发展。我们可以把程序设计语言分为主要的三大类:机器语言(Machine Language)、汇编语言(Assembly Language)和高级语言(High-Level Language)。每一代的程序设计语言都有其特色,并且朝着易于使用、调试与维护功能更强的目标不断发展和提升。另外,每一种语言都有其专有的语法、特性、优点以及相关的应用领域。就以机器语言为例,它是最低级的程序设计语言,是以0与1二进制数的方式直接将指令(机器代码)输入计算机,因此在指令级的数据处理上非常高效,但是编程效率最低。
汇编语言则是把以二进制数表示的数字指令用有意义的英文字母、字符表示的指令集来替代,方便人类的记忆与使用。不过,汇编语言编写的程序必须通过汇编器(Assembler)将汇编语言的指令转换成计算机可以识别的机器语言。汇编语言和机器语言相对于高级语言,统称为低级语言(Low-Level Language)。
由于汇编语言与机器语言不易于阅读,因此又产生了一些以英语单词为关键字的程序设计语言,它们被称为高级语言,例如BASIC、FORTRAN、COBOL、PASCAL、Java、C、C++等。高级语言比较符合人类自然语言的形式,也更加容易理解,并提供了程序的控制结构、输入输出指令。当使用高级语言编写完程序之后,在执行前必须先用编译器(Compiler,或称为编译程序)或解释器(Interpreter,或称为解释程序)把高级语言程序转换成汇编语言或机器语言。因此,相对于汇编语言,高级语言在执行效率上要低一些。不过,高级语言的可移植性比汇编语言高,可以在不同架构或硬件平台的计算机上执行。程序设计语言按照“翻译”方式可分为两种,分别说明如下:
·编译型语言
所谓编译型语言,就是使用编译器(Compiler)将程序代码翻译为目标程序。编译器可将源程序分成几个阶段转换为机器可读的可执行文件(目标程序),不过编译器必须先把源程序读入主存储器后才可以开始编译。每当源程序被修改一次,就必须重新经过编译器的编译过程,才能保持其可执行文件为最新的。经过编译后所产生的可执行文件,在执行中不必再“翻译”,因此执行效率较高。例如C、C++、PASCAL、FORTRAN等语言都是编译型语言。如图1-10所示为编译型语言编译与执行过程的示意图。
图1-10
·解释型语言
所谓解释型语言,是指使用解释器对高级语言的源代码逐行进行“翻译”(解释),每解释完一行程序语句后,才会解释下一行程序语句,如图1-11所示。如果在解释的过程中发现了错误,解释动作就会立刻停止。由于使用解释器解释的程序每次执行时都必须再解释一次,因此执行速度较慢。BASIC、LISP、PROLOG等高级语言都是解释型语言。
图1-11
有些人往往认为程序设计的主要目的就是通过“运行”得出结果,而忽略了程序运行的效率与程序日后维护的成本。学习程序开发的最终目的是学会如何组织众多程序设计人员共同参与来设计一套大型且符合用户需求的复杂系统。一个程序的产生过程可分为五大设计步骤,如表1-2所示。
表1-2
至于在程序设计中要使用何种程序设计语言,通常可根据主客观环境的需要进行选择,并无特别的规定。一般从4个方面来评判程序设计语言的优劣。
·可读性(Readability)高:阅读与理解都相当容易。
·平均成本低:成本考虑不局限于编码的成本,还包括执行、编译、维护、学习、调试与日后更新等的成本。
·可靠性高:所编写出来的程序代码稳定性高,不容易产生副作用(Side Effect)。
·可编写性高:针对需求所编写的程序相对容易。
以下是我们在编写程序时应该注意的三项基本原则:
1.适当的缩排
缩排用来区分程序的层级,使程序代码易于阅读,像是在主程序中包含子程序区块,或者子程序区块中又包含其他的子程序区块时,都可以通过缩排来区分程序代码的层级,如图1-12所示。
图1-12
2.明确的注释
对于程序设计人员而言,在适当的位置加入足够的注释往往可以作为评断程序设计优劣的重要依据之一。尤其当程序结构复杂而且程序语句较多时,适时在程序中加入注释不仅可提高程序的可读性,而且可以让其他程序设计人员能更清楚地理解这段程序代码的作用。如下这段程序就带有非常清楚的注释:
01 import java.util.*; 02 public class ch2_02 { 03 public static void main(String[] args) { 04 //声明变量 05 int intCreate=1000000;//产生随机数的次数 06 int intRand; //产生的随机数 07 int[][] intArray=new int[2][42];//存放随机数的数组 08 //将产生的随机数存放到数组中 09 while(intCreate-->0) { 10 intRand=(int)(Math.random()*42); 11 intArray[0][intRand]++; 12 intArray[1][intRand]++; 13 } 14 //对intArray[0]数组进行排序 15 Arrays.sort(intArray[0]); 16 //找出出现次数最多的前6个数 17 for(int i=41;i>(41-6);i--) { 18 //逐一检查次数相同者 19 for(int j=41;j>=0;j--) { 20 //当次数符合时打印输出 21 if(intArray[0][i]==intArray[1][j]) { 22 System.out.println("随机数号码"+(j+1)+"出现"+ intArray[0][i]+"次"); 23 intArray[1][j]=0; //将找到的数值对应的次数归零 24 break; //中断内循环,继续外循环 25 } 26 } 27 } 28 } 29 }
3.有意义的命名
除了使用明确的注释来辅助程序的阅读外,还要在程序中大量使用有意义的标识符(包括变量、常数、函数、结构等)命名原则。如果使用不恰当的名称,在程序编译时就可能会无法顺利地进行编译,或者造成程序在运行时出现错误。