七阶子博客: 杂文 | 游戏 | 戏剧 | 白蛇 | 文艺 | 编程 | 近期
请输入标题关键字或 yyyymmdd 格式的日期

    字母编程、文字编程与汉语编程

    最近由于受网络渗透的影响,鄙人也忽然对“汉语编程”的概念倍感兴趣,故不惮也一抒己见。

    目前编程语言大致可划分为三代:机器语言、汇编语言与高级语言。尽管有人把可视化编程列为第四代,不过笔者认为,那主要是一种方便的编程工具,可以自动生成代码、减少手工输入的强度与错误。至于智能编程,那则是比较遥远的梦想了,暂不讨论。关于机器与汇编语言,宜其请教计算机专家,笔者只知其然而不知其所以然,也不敢多论。

    本文主要只讨论作为描述性的高级语言。高级语言的主要特征与优点,也正体现在“描述性”上,用人类容易阅读理解的符号表达计算机指令,从而降低程序开发的难度与枯燥度。笔者这里提出,高级语言也还可以现细分为三层:字母编程语言、文字编程语言与自然语言。一旦能用自然语言与计算机交流,那与“智能”也差无几了。现在成熟而广泛使用的都还是“字母语言”。而“汉语编程”,据其特征,应该是种“文字语言”。

    在讨论“字母语言”编程之前,先简单回顾一下“符号数学”,因为计算机与数学的关系是如此之密切。

    用符号(其中也包含了大量的英文字母与希腊字母等)来表过数学公式、定理等,这已是无可争议的事实了。符号被引入数学,其意义无法估量,总之促进了数学的长足发展。迄今为止,符号也是表示数学的唯一的最佳方式。然而,数学如此青睐符号,仅仅是因为它形式简单、书写方便吗?休说数学不便用汉字,连英文单词它也不屑采用哩。

    按说,汉字(以及其他各国文字),也是一种符号。不过这种符号记录的是人的自然语言,而数学语言是完全不同的另一种思维。简要地说,数学要表达的是事物的普遍关系,所以要求它使用的符号本身“无意义”。而汉字符号的语义太过丰富,它会干扰、局限数学普遍意义的表达与理解,影响数学的纯洁,不利于数学的传播与发展。正因为符号的“无意义”,才能反映数学的“大意义”,正如老子的哲学,无为而无所不为。数学能方便利用英文字母,也因为单个字母本身无意义,只有单词(特定的字母序列)才有意义,所以数学公式中也不会出现像“if”、“else”等单词。

    数学能用字母而不用汉字,岂是“简”与“繁”那般简单?

    计算机最先应用于数学计算,又是被英语系国家所发明,所以最初用字母作为编程语言也就是理所当然的事情了。而且英文字母标识符能方便地缩写与扩展,得以互相区别,因而用字母编程简直就是信手拈来,天经地义。然而程序与数学毕竟有着不同的目的与要求。数学是研究普遍关系的,程序是解决具体问题的。

    事实上,数学与程序的符号、字母也并非绝对的“无意义”,并非只需的形式逻辑。某些数学符号,在数学家眼中应该也是有习惯意义的,比如“f”表示函数,“x”表示自变量,“y”表示因变量……程序亦然,比如“i”、“j”一般表示整数,且常用于循环变量。一个具有良好编程习惯的程序员会自觉地把变量名取为有意义的英文单词,尽管这不是语法的必须。所以,数学符号与编程字母实际上是游离在“若有意还无意”之间,不过它们不同的本质,决定了它们有不同的要求或趋势。数学符号应该始终保持它无意义的纯粹性,而程序在解决具体问题时,应该走上意义明确的道路。

    特别是由于计算机的普及,计算机的应用范围无限扩展。尽管最先进的计算机仍然在做数学运算,但最广泛的计算机是基本不做数学运算的——千万不要说即使玩俄罗斯方块的累积计分也要用到数学呢,这既不是数学家也不是程序员所关注的问题。所以在不同的应用领域中,随着程序复杂度的增加,为了方便程序的阅读与交流,程序代码的可读性与意义明确性的要求越来越显得迫切。

    现在很多高级语言在介绍其特性时都这么一句不经意的话,“支持长变量名”。现在支持长变量名就意味着以前并不支持,意味着他们都意识到用长变量名容纳更多的完整单词的重要性。当用英文单词完全代替英文字母进行编程时,那就是“文字编程”了——只不过,用汉字文字编程比用英文文字编程更有优势罢了。  首先,汉字就是比英文简洁。请勿再说“if …… else”比“如果……那么”字节少,如果真要抬杠的话,我们还可用“若……则”呢,而且英文“if”后面还必须加一空格(单词之间若无空格分隔还能称之为单词么)。在编程中最有意义的并非内置的关键字,而是大量用户自定义的变量与对象。所以用汉字命名变量能更简洁而准确地表示其所指,用汉字命名函数也能更好地描述它实现的功能。微软的编程语言现在也支持中文变量名了,但这并非基于它认识到了汉字的优越性,而是瞄上了中国的巨大市场。不过,用英文关键字与中文变量名混编,相信中国人与英国人看了都会觉得别扭。所以,对于中国人来说,最好当然是“全盘汉化”了。

    其次,英文文字编程不易符合英文语法习惯。上文也说过,英文单词必须用空格相互分隔,然而看目前的编程语言,要使变量名支持空格,实在太难为情了。现在他们长变量名的推荐习惯是每个单词首字母大写,但是,不管每词首大写还是用短线下划线连接,都不如英文固有的空格分词来得直观。何况真正采用单词全称的也不多见,可能因为完整单词往往太长,更担心把单词拼写错误反为不美,而编程环境也无法像 Word 那样提供拼写检查,因为在程序代码中,基本没几个合法的单词!反观汉字,不会出现类似问题,凡是能在计算机输入的汉字,一定都是合法的汉字。“非法”的单词无疑会增加(特别是新手的)阅读难度,尽管程序员之间有一些缩写协定。

    英文还有另一个特点,就是喜欢定语后置(汉语在文言文时代就这么干过),习惯把中心语突出放在前面,这从中英二者的邮件地址就可以看出明显的差别。在处理包含、从属的关系时,英文是从小到大排列。但是看现在面向对象的编程思想,那对象取成员的点操作符(.),就是从大到小层进取值的排列。这与英文语法习惯相悖,反与汉语相容。

    其三,汉字输入比英文输入快。以中国计算机发展到目前的水平——尽管还很烂——如果还固执地认为英文输入比汉字快的话,那就显得无理了。提高英文输入速率,除了十指的击键速度外,别无他途。然而汉字,只要你有输入汉字的工作需求,总能找到一款适合你的输入法,并在实践中超过英文输入速率。这就是“哀兵必胜”的道理。当初按照英语习惯设计成标准键盘的同时,也设定了英文输入的瓶颈,几十年来基本没有突破之法。

    最后回到数学符号的支持性上。从字符集上说,“英语编程”仅需 ANSI 支持,而大多数编程语言也的确只允许 ANSI 编码,所以在表示“大于或等于”这样的数学涵义也只好用“>=”,这与数学教程使用的符号不具备“形似”特征。而“汉语编程”必须扩大到支持 Unicode 编码,这就能提供更多“形似”的数学符号,比如“≥”“∫”等(当然也不是全部,像上下标在纯文本的源代码文件中也无法支持)。在“英文编程”中引入这些符号理论上也可以,只是如果仅为此就把支持字符集从 ANSI 扩展到就未免有些不值了,而且习惯英文输入的用户要输入键盘以外的字符还真有点困难。但是习惯中文输入的,只要能输入“定积分”字样,也就能设法输入“∫”。显然,“∫”比“定积分”与“integral”都要直观。因而,使用 Unicode 编码后,不但可使程序的普通文字易读,也还能增加数学表达式的可读性。

    所以,就描述性的高级语言这层面来说,“汉语编程”的可行性与优点是显著的,尤其是对于国人来说意义更为重大。当然,在运行效率上可能不如“英语编程”,这也是程序“可读性”与效率的必然代价交换,从汇编到高级语言伊始就存在这个问题。然而,随着计算机硬件性能的提升,虽然程序的“相对效率”在不断下降,但其“绝对效率”却是在不断上升的。

    总之,程序的复杂性,对程序的可读性提出了更高的要求。不管什么编程思想,首先都要用语言表达出来,才能与计算机交流。自然语言虽有它模糊性的一面,却也必有它精确性的一面。计算机编程语言,大可利用自然语言可用的一面,尽量使计算机编程语法与文字语法求得一致。即便不能即时实现直接的“人机对话”,也可向“人机共读”迈进一步了。

    (原稿:2007-11-09; http://blog.sina.com.cn/s/blog_490c36be01000bx6.html