程序员入伙书——编程语言

下载Python一章里,我说过请大家忽略“编程语言”和“Python”这些词的意思,因为那时这些词并不重要。

现在大家已经看到了一些使用Python的实例,我想是时候让大家了解关于编程语言的一些知识了。如果你懒得听我长篇大论,可以直接跳到文章结尾看总结。如果觉得我的扯淡还有点意思,请继续往下读。

我们说过,计算机不会自主思考,它所有的动作都是人们事先告诉它的。告诉计算机”遇到什么情况时该干什么“,就是编写程序,简称编程。既然要给机器发指令,它就得明白这些指令。

计算机本身能明白的、以及能操作的东西,只是一系列高低电平的组合,就像我们人类的身体只有一系列的化学反应和生物电一样。一个刚生下来的人只会吃、哭、拉、睡,却不知道怎么喊妈。你让他喊他也不会喊,因为他听不懂。在计算机世界里,我们把这种基础的电平称为“机器语言”,机器语言是在制造计算机芯片时固化在那块半导体里面的。

使用机器语言能编程么?能!你拍打婴儿的脚底板,痛觉末梢产生一些生物电,传送到大脑,他就开始嚎哭。“拍脚”是指令,“嚎哭”就是动作。较真的同学会说我这个比喻不恰当,因为“拍打脚底板”是婴儿大脑里运行的那个小程序的输入,“哭声”是程序的输出,无论“拍脚”还是“哭声”都不是程序本身。我首先感谢这位同学,提出这个质疑,说明你认真地看了前头的章节。其次,我解释说:判断这些行为究竟是输入输出还是程序本身,得看你怎样定义这个系统的范围。假如我在计算机芯片的一些管脚设置成事先想好的高、低电平,之后,在芯片的另外一些管脚上观测到了一次乘法的计算结果(同样是高、低电平来表示),我们既可以把设置的那些电平称为程序,也可以把它们称为输入数据。

跑题了,拽回来。刚才说到,计算机只能听懂高低电平组合成的机器语言。为了显得专业些,我们把高电平称为1,把低电平称为0。计算机里只有两个数字:0和1。我们眼前的计算机有许多花里胡哨的行为,能显示种种色彩,发出种种声音,那都是它组合各种0和1的结果。举个例子,一个橙色的像点至少包含24个电平,顺序是111111111000000000000000。一个灰色的像点则可能是100111011001110110011101。字母“A”在计算机里是01000001,而“#”在计算机里是00100011。

又跑题了,咱们说的本来是机器语言——不过刚刚这次跑题,还挺有技术含量——机器语言首先就是难懂、不好记,记反了0和1,就是风马牛不相及的另一个动作,或者压根不是一个动作。其次,不同厂家生产的计算机芯片,能听懂的指令也不同!Intel的x86、Apple家的A5处理器、Motorola的MC68000、Sun的SPARC系列、曾经辉煌过的Digital公司的VAX/Alpha,用《地道战》的一句台词,是:“各村都有自己的高招。”最后,机器语言太“机器”了,不符合人类的思维习惯。例如一个M = N + 3的指令,计算机的步骤是:

  1. 把变量N的值搬动到累加器AX里去。
  2. 在累加器执行AX + 3的动作。
  3. 把累加器AX的值搬动到变量M所在的内存地址去。

如果是用机器语言编程,上面的这三句话都得你自己亲自列出步骤,并一一翻成0和1组成的代码序列,如果跑在别家的机器上,因为硬件的差异,还得完全改写一遍。

说人话!

为了让程序员能够平安地活到退休,人们(其实就是程序员自己)在机器语言和人类之间放了一个翻译,这个翻译对人而言,算是做到了“说人话”;而转过头来,它对计算机说的就是一连串的00111001……了。我们把这个翻译工作称为“编译”(Compile),把听、说人话的这一边称为“高级程序语言”。有了编译器,人们不再需要死记,该怎样敲打孩子的脚底板,才能让他除了哭之外,还会说“妈妈我爱你”,也不再需要考虑张家娃和李家娃的区别。

高级程序语言也被俗称为编程语言,严格来说,机器语言也是编程语言,但人们都这么叫开了,就不再纠正了。“高级”的意思,不是说这种语言有多么天外飞仙,而是说,相对于计算机底层的那套傻乎乎的指令系统来说,它更贴近人的思路。

一个生下来只会吃哭拉睡的孩子,过了两三年就会发展出语言系统,会喊爸妈、会说饿,也会看眼色。大人一说重话,倒头就撒泼打滚。其实,他使用的终极语言是什么呢?还是大脑里的那些生物电和化学反应。而外部环境的人类语言、声音轻重、缤纷色彩等等,通通只能纳入高级程序语言的范畴。说他一句重话,他的编译程序就启动了,翻译出产生大量肾上腺素的指令。而你搜遍整个大脑皮层,大脑皮层上没有任何一个地方写着“撒泼”,也找不到表达“撒泼”这个词的颜色、声音、气味、味道、手感、文字,一切都是化学产生的生物电——别往周其凤同学那首下流的《化学歌》上联想啊……

虽然有了编程语言了,人们还是很快发现,计算机的功能太多,一种编程语言招架不住,于是就产生了种种的编程语言,各自有自己的长项和短板。有些语言适合做数字运算,有些适合做文字分析,有些适合做系统硬件控制,不一而足。我在这份教材里用来做示例的Python,就是坐落在种种功能之间的、适中的、不走极端的编程语言。其他的常见的语言还有:C、C++、JAVA、Perl、PHP、JavaScript、ADA(骨灰级)、PASCAL(骨灰级的编程语言)、PROLOG(骨灰级)、BASIC(碳化级)、LISP(化石级)、COBOL(化石级)、FORTRAN(化石级)……有些操作系统的命令系统做得很强大,像UNIX的SHELL、VMS的DCL什么的,也把自己标榜为编程语言,也对也不对。只是对于使用者来说,确实可以忽略它们和真正的编程语言的区别。(这句话如果看不懂,不用往心里去。)

虽然分了这些编程语言,并不是说它们互相功能完全不覆盖,而只是说它们各自“更擅长”某些工作。基本功能——以那个九九乘法表的程序为例,当然远远不止打印乘法表的功能——用别的语言实现,完全没问题。把下面这段JavaScript语言写的代码拷贝粘贴到记事本里(别用Word!),存为文件multip.html,双击这个文件,你的默认浏览器会打开它。IE可能有“内容被阻止”的警告信息,点击警告条,并允许运行活动内容(代码无毒、但如果你的机器本身有病毒、俺不承担责任),你就会看到九九乘法表。

<script type="text/javascript">
for (i = 1; i <= 9; i++) {
	for (j = 1; j <= i; j++)
		document.write(' ' + i * j);
	document.write("<br />\n");
}
</script>

C语言版本的九九乘法表:

#include <stdio.h>

void    main()
{
    int i, j;

    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= i; j++)
            printf("%3d", i * j);
        printf("\n");
    }
}

就连标榜自己是编程语言、而我不觉得它是的UNIX SHELL,也可以用来写九九乘法表的程序如下:

#!/usr/bin/sh
i=1
while [ $i -le 9 ]; do
        j=1
        str=""
        while [ $j -le $i ]; do
                result=`expr $j \* $i`
                str="$str $result"
                j=`expr $j + 1`
        done
        echo $str
        i=`expr $i + 1`
done


总结一下:

  • 计算机只懂得机器语言。
  • 人类不喜欢机器语言。
  • 在机器语言之间和人类之间可以有一个翻译过程,叫做编译。
  • 通过编译,可以把一些接近人类思路的语言翻译成机器语言,从而操纵计算机的行为。
  • 这种接近人类思路的语言叫做高级程序语言,或称为编程语言。
  • 编程语言有很多种,各自擅长于不同的领域。
  • 通告关闭
  • 评论 (3)
    • mileslei
    • 2013年03月6日 9:46上午

    JavaScript不是Java。

    • Lingling Si
    • 2013年03月6日 12:13上午

    Java那段很简单啊!哈哈哈哈!

    • Lingling Si
    • 2013年03月6日 12:11上午

    会编程的觉得计算机很笨,只会跟着指示做;不会编程的人觉得计算机很聪明,怎么什么都能做,其实背后也是人在指挥呢。

评论关闭