什么是计算机编程语言?在学习任何一门编程语言之前,我们应该要准确地理解这个问题,才能帮助我们抓住编程的本质,才能更高效准确地完成编程语言的学习和后续的程序开发工作。但这个问题程序初学者回答不上来,可能好多资深程序员也没能深刻地理解。我们先通过一个例子来说明。
当电话这种工具刚出现在人们生活中的时候,我们要给某个人打电话,是不是得先知道他们家电话号码是多少,对吗?比如“66××××88”,或者“139××××8888”。然后我们拿起电话机,在上面拨号或者按键,输入这一串数字,电话机和电话网络就会帮我们打通这个电话。我们键入这串数字的过程,就是给电话系统发出一个指令——打电话给谁。我们要打给不同的人,就要给电话机输入不同的一串数字,也就是给出不同的指令。最初没有手机通信录的时候,我们每个人都得准备一个电话本,把自己朋友和同事的电话都记在上面。电信部门也会为全社会各个单位整理一个电话簿,这就是电话黄页。这些电话簿和电话黄页,就可以理解为我们拨打电话的一个指令集。
要联系的人越来越多,我们不可能记得住每个人的电话号码——那一串长长的数字。一开始通过电话本查查还可以,但联系人越来越多,查起来也越来越麻烦。就算查出来,每次都要去输入一个个由数字组成的电话号码再呼出,也是挺麻烦的。后来我们的手机和部分座机都能够保存电话号码了,把联系人的名字和电话号码保存起来,下一次要打电话的时候,直接按对方的名字就可以呼出电话,不需要再输入一个个数字了。这就极大地简化了我们的操作,从输入一串数字向电话发出指令,变成了输入或者选择一个名字就可以发出指令。这种用名字来代替电话号码的方式,我们可以看成是一种帮助记忆的符号汇编。
虽然通过联系人的方式解决了电话号码的记忆和输入问题,但是拨打电话的整个过程还是需要多个动作:先打开手机上的通信录,找到联系人,再点击联系人的名字,再点击拨打电话的按钮,这其中的每一步都需要我们手动去操作。上面的联系人只是解决了电话号码这个指令的替换问题,但拨打过程中的其他步骤,都需要我们人工一步步地去亲自操作。要使整个过程更加方便,就需要更加高级的交互方式。现如今,我们手上先进的智能手机,都可以向手机发送语音指令,比如对着手机直接说话“给老张打电话……”,手机就可以自动将电话拨打出去,打开通信录、查找联系人、点击拨打按钮这些步骤,手机都帮我们自动完成了。
上面这个例子能形象地描述计算机编程语言的发展过程。笔者来帮大家梳理一下:首先,我们把电话机或者说电话系统当作计算机。要让电话系统工作,也就是拨出电话号码,它能够识别的就是这个电话号码,也就是我们所输入的那一串数字。计算机也一样,它作为机器只能识别电子电路的“开”和“关”这两种状态,换成数字就是只能识别“1”和“0”这两个数字。电话号码是发送给电话系统的指令,那么我们向计算机发送指令,也只能发送 0和 1这两个数字的组合指令。不同的电话号码数字代表不同的对象,要向计算机发送不同的指令,就要发送不同的0和1的数字组合。如果我们把电话号码当作电话系统的语言,那么这些0和1的不同组合,就是计算机自身的语言,我们把它叫作“机器语言”。机器语言,是计算机语言的基础和最初形态。
事实上,在计算机出现的初期,我们的程序员先驱们,主要的工作就是通过不停地拔插电路开关,来给当时庞大笨重的计算机下达指令。“开”就代表1,“关”就代表0,一个指令就是一串开关动作的组合。但这种原始的操作方式很快就被改进了,因为我们不想每一个指令都要去做一连串的开关动作,就像我们不想每次打电话都要去按一大串数字一样。而且就像电话联系人越来越多一样,随着计算机能够执行的指令越来越多,程序员不可能记住每一个指令所对应的0和1的数字组合,对于庞大的指令集,人工查询起来也越来越麻烦。所以我们想要对计算机输入一个单词就能代表一个指令,就像手机联系人一样,输入一个名字就能打出电话。比如“加法”这个指令,如果它的机器语言指令是“01001110……”这一串数字,我们直接用一个单词“add”来代替,就像我们用“老张”来代替“139××××8888”一样。这样我们向计算机输入“add”,它就自动执行“01001110……”这一串数字指令。以此类推,我们将所有需要的机器语言指令如“add”这种助记词汇编成一套程序语言,它就是计算机语言发展的第二阶段“汇编语言”。汇编语言使我们脱离了用机器语言跟计算机直接“对话”的原始方式,开启了计算机编程语言发展的广阔天地。
虽然有了汇编语言,我们不用再记忆和输入每一个计算机指令的 0和 1的数字组合了,但就像用手机联系人拨打电话一样,我们还是需要自己操作拨打电话的每一个步骤和动作,用汇编语言也要将计算机执行某项工作的每一个步骤每一个指令,逐一通过程序代码写出来。这样还是挺麻烦的。我们想要像高级智能手机打电话一样,只需告诉计算机要干什么,具体的步骤由计算机自己去完成,这就需要计算机高级程序设计语言来完成。高级语言是计算机语言发展的第三阶段,它通过编程语言的语法,将计算机执行任务的具体步骤整合起来。程序员只需重点关注编程的思路和算法,集中精力去思考如何实现任务和解决问题,而不用花过多时间去考虑计算机如何执行。即编程代码专注于实现任务的流程和输入输出的结果,而不用去关心计算机执行的每一个步骤或指令。
机器语言、汇编语言和高级语言,只是代表了计算机程序语言发展的不同阶段。机器语言不代表就很“低级”,高级语言有优势也有劣势。机器语言始终是计算机最终执行的代码,高级语言最终还是会转化成机器语言来执行。汇编语言在使用助记词的基础上保持了程序运行的超高效率,在单片机和硬件控制层面依然有广泛的应用。而高级语言赋予了程序员广阔的创新天地,使计算机的应用领域和普及性得到极大的发展,是如今计算机编程的主要方式。
所以,计算机编程语言的本质,是人和计算机之间交流的工具,也是人控制和指挥计算机执行任务的方式。它既不是机器的语言,也不是人的语言,而是人类逐步用自己熟悉的语言来操作计算机这种设备的控制符号及其格式。而计算机编程,就是我们通过编程语言这种工具,来控制和指挥计算机的途径:通过计算机编程,让机器按照我们设计的思路和步骤,执行我们规定的任务。
既然如此,那我们在选择一门计算机编程语言进行学习的时候,就要从计算机编程和编程语言的本质出发。我们学习编程语言,就是要学习控制和指挥计算机的方法。虽然名字叫“编程语言”,但它一定没有学习一门我们人类的语言那么复杂。它是一种工具,一种通过编写代码来实现自己想法的工具。这种工具能够指挥我们人类所发明创造的最智慧的机器,所以编程是一种创造性劳动,一种有极大回报的高级劳动。我想所谓计算机“高级”语言,本质上不是编程语言的高级,而是人类从事这种编程活动在行为上的高级。
既然计算机编程的本质是要控制计算机执行某项工作,那么选择计算机编程语言的种类,首要就应该从“我们要执行什么工作,或者做什么事情”出发。我们要通过计算机来做的这项工作,它用的是什么操作系统平台?运行在哪种模式和架构之下?这个平台和架构有哪些开发工具可供选择?有哪些编程语言适合这些开发工具?以结果为导向,是我们选择编程语言时最重要的因素,在大部分情况下,基本可以锁定需要使用的编程语言。而对于编程语言的流行程度、学习语言的难易程度、程序员所在单位的要求、程序执行的效率等,都是次要的考虑因素。