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

    关于“汉语编程”的几点想法

    日前对汉语编程概念思考了几个问题,不太成熟,略记如下。

    1.数字读入

    所谓汉编,最直观明显的特点是汉字与汉语习惯(事实上前者易,后者难)。那么,是否也可以用汉字来表示数字呢。考虑“1234;”与“一千二百三十四;”可不管其繁简性,因为在以后的编程 IDE 开发环境中,手输代码的数量会越来越少,于是“读”比“写”更重要。我曾考虑的问题是,当计算机逐字符读入这两个字符串后如何转化为整数。

    对“一千二百三十四”,人读很方便,机读也很方便,因为计算机可作这样的计算:1*1000 + 2*100 + 30*10 + 4*1(= 1234),因为它可判别“千”“百”等关键字标识了前一数字的位。但对“1234”,人读仍然很直观,但机读可能开始要迷惑了,它并不明白前面的“1”“ 2”到底是在哪个数位上,要把全部数字读进后才能确定每个数的数位——这样是否就可认定,计算机读入分析“一千二百三十四”比“1234”更快更高效能。

    其实这是以人的直观思维低估了计算机的精密算法了,虽然计算机从高位往低位读数并不知道每个数的位(其实它也不需知道),但它能做如下的计算:(((1*10)+2)*10+3)*10+4(= 1234)。这即是“秦九韶算法”,也相当于计算机的移位,因而是很高效的——奇怪的是,秦九韶那么早发现如此计算多项式的算法,却为何没有发现类似阿拉伯数字表示数的表示法呢。

    那么,是否可以让计算机直接忽略“千”“百”这样的表位的关键字呢,把“一千二百三十四”读为“一 二 三 四”,也用秦九韶分解法计算,而达到同样的分析效率?不行!假设有这样一个数,“一万零三十”,若把“万”与“十”忽略,那就要解析错误了。这其中的关键,是中国人习惯把“零”省略——记得“一万零三十”这样的表示法还是小学数学老师教我的,在古代为了简便,可能就直接写成“一万三十”了(不知然否),后来在中间跳位处只添一个“零”也许也是参考了阿拉伯数所做的一个折衷吧——除非把所有“零”补齐,变成“一零零一零”,就是阿拉伯数的表示法了(10010),然而这不过邯郸学步,不再像汉语习惯了,不足取。也由此可见,零(0)的发现,在数学史真是里程碑的意义。

    我原以为“一千二百三十四”由于有表位的关键字,会提供更多的信息而使计算机的解析效率更高。但现在看来,这表位的信息是冗余的,也是重复的。对“1234”,当人为在“一”字后加“千”时,他必需从该数的低位向高位数一遍,才能确定写下“千”字,当他写“百”字时,又要从低向高数一遍……这样机械重复的数位操作应该由计算机完成,而不该由人完成,计算机利用合理的算法,可以从高位往低位读,也可以从低位往高位读,但不需要给每位命名。

    特别是对于大数时,这样问题更严重。当然,对于工程计算,相当大的数可以采用科学计数法,只取有限精度。不过对于像数论这样专门研究整数的学科(大素数在密码中有应用),就必需长串地记下每位数,这样,对每个数位命名就几乎不可能了——本来我向来看好汉字的简洁,但在数字表达上,却竟然如此不简。

    以上是按十制讨论的,按计算机二进制,结论是相似的。所以,对于汉语编程,不可走极端,“汉化”阿拉伯数字——不过这也许常识了,可能也只有我才会如此杞人忧天吧。

    然而,汉字数字也并非完全不可用,比如小整数,比如人民币金额——相对于数论的研究兴趣,百亿万富翁之数亦为小整数——而且在某些场合,还往往有取整的习惯,比如“一万(元)”,可能就要比“10000(元)”简洁直观了。而且对于这样“富零”的奇异数,按降幂分解也不比秦九韶分解低效多少,何况效率也不是编程的唯一目标。这可能也是汉字数字表示法在几千来的存在合理性。

    所以,如果要汉语编程,宜沿用阿拉伯数字,但也不妨兼容汉字数字。

    2.数学运算式

    数字不会是孤立的,所以再讨论下简单的数学表达式。

    记得我的小学数学老师教我们把“1+2”读为“一加二之和”——我不知道中国古代数学家用算筹是如何表达的,也不知道现在的小学生是不是还有这样读的习惯——不过我觉得这样的表达法在计算机应用中倒还有点特点:它符合后缀表达式的规范。

    考虑 1+2*3 这样的式子,用汉字可以写作(或我们可以这样读):“一加二乘三之积之和”——你一定不会读作“一加二之和乘三之积”吧,当然也许会偷简读为“一加二乘三”,不过这与符号 1+2*3 已无本质区别,并无多少汉语特点——这句话,它表明了数学运算的优先级,先做乘积,再作加和。为了让“人”能看得更清楚,或许可以加个括号:“一加(二乘三之积)之和”,但这不是必须的,计算机能分析前者。

    而假如只是纯粹的符号式 1+2*3 ,它不能天然地表达其中的运算优先级(这与前面的数字“1234”不同,它能天然地表达其自身的位数概念),所以计算机并不知道该先算加法还是先算乘法,必须提供优先级列表,而即使提供了优先级,它也不能立即运算。据我所知,它要利用堆栈,先把普通的数学表达中(中缀表达式)转化为后缀表达式,然后才能顺序计算。

    仍如 1+2*3 ,可分解为 1, +, 2, *, 3 ,告诉计算机 * 的优先级高于 +,就能把原式转化为后缀表达式的符号串为 1, 2, 3, *, + 。可以看到,若抽出“一加二乘三之积之和”的有义符“一,二,三,积,和”,就与 1, 2, 3, *, + 的本质完全一样了。至于被略去的“加”“乘”,其意义何在?对于人的阅读来说,“加”与“和”,“乘”与“积”各自配对呼应,就像左括号与右括号一样。对于计算机的解读来说,如“加”字可以分隔数字,并表明计算“和”的运算要求两个操作数。有的运算符只要求一个操作数,比如正弦(sin)、余弦(cos),比如可直接读“三十度之正弦”,并不需要前面再有关键字分隔匹配。另外,后缀表达式不再需要小括号明确优先级,比如 (1+2)*3 ,用汉语习惯可读作“一加二之和乘三之积”,转化为后缀表达式就是 1, 2, +, 3, *

    究其原因,是用汉语读来已经表达其中的运算顺序,这提供了额外的信息,就使运算优先级的问题迎刃而解,可省去转化后缀表达式的步骤。这与上述汉字数字读法有些不同,数字的可能有无穷多位,但运算种类却有限,常用的也就那么几种,尽管数学家可以定义出很多运算符来,但数学上都可以化为四则运算来表达。

    不过汉语表达式的这种特征的意义也不可无限夸大,毕竟我们也已经习惯了1+2*3的符号表达。像 1, 2, 3, *, + 这样的后缀表达式极不直观,几乎非普通人能理解,而“一加二之和乘三之积”恰好通过意义明确的字眼把它串联成通顺的、符号汉语构词语法习惯的短语。当数学表达式较简短时,可以这样表达,若表达式比较复杂时,虽然也可以“翻译”成汉字,但那也肯定不便理解了,就像过长的句子,即使它也完全符合汉语语法,也只怕一时难理解,排错也更困难。当然,在一般的应用程序编程中其实很少遇上复杂数学表达式的情况,往往在循环体中只需作四则运算——尽管在简短数学表达式中,后缀表达式的效率优势并不明显,但也至少表明了汉语表达数学式的合理性。喜欢标榜“爱国”的可以用这种语法尝试一试。

    3.汉字关键字

    一般编程高级语言都规定了部分关键字以表示特定含义,并且要求变量名不能与关键字重名。选用汉字关键字并不困难,但如果同时要求符合汉语语法习惯就有些麻烦了。

    汉字与拼音文字如英语有一个不同点,英语的单词都由字母的顺序排列组成,所以单词之间必须要有空格分隔,才能形成有意义的语句。而汉字是由笔画构成的有机整体,字与字之间理论上与习惯上都不须加空格或其他来分字。不过曾有人提出用空格来分词,因为现代汉语多音节词已为多数,空格分词可减少歧义,不过我想基本难以通过。假如像下面一句话采用英文分词的方式来读写:

    中国 是 一个 地大物博 的 国家——不!现在 应该 说 是 人口 众多、资源 短缺 的 国家 了。

    相信有不止少数人与我同感,觉得这句话超级别扭,一顿一挫的,失去了汉语的音韵美——何况,刚才我写上面那句话时,还一直在斟酌“地大物博”之间应不应该也加个空格分词?

    正因为英文有分词习惯,所以在编程中写下像“int i;”的语句是极自然的。但是汉语编程,如果说要尽量符合汉语语法习惯,就应该去掉其中的空格。可惜,目前出现尝试的汉语编程方案,也可能由于技术原因,都没意识到这点。只是把英语关键字翻译过来,当然也就保留了其中的空格,也许就要写出像“整数 甲;”之类的语句。

    汉语编程不应只是简单的汉化,还应该体现汉语语法习惯,使编程朝自然语言方向发展,才算有编程思想的进步。现在考虑,把关键字后面的空格去掉的难点在哪?我不懂编译原理,不能确切探究其中原理,但我想,去掉分词空格的最大问题是可能引发汉字歧义,使编译困难,容易出错。

    我曾思考过用繁体汉字来表示汉语编程的关键字。繁体字是祖先给我们留下的一笔宝贵的财富,可惜现在只怕只有在银行柜台上有实用价值了。所以,如果采用繁体字来作汉语编程的关键字,不但能继承更多的繁体字,真正实现宏扬中国传统文化的口号,而且能很好地解决汉字编程的歧义问题,一举两得。

    编程的关键字要求意义明确,不容歧义。然而在汉语中,一字多义是很普遍的——又不能像英文那样缩写可用“int”表示整型。虽然汉字不宜再“简写”,但可以再“繁”写。用繁体字表示关键字,赋于它明确的单义性,而用通用简体字表示变量名,这样并行不悖,绝不有差。比如可以写出“整數 甲;”,最好是如“定義整数甲、整数乙爲整數;”之类的语句。

    符合(现代)汉语语法习惯,不但体现在文字,也应该体现在标点符号上。我觉得中文的标点符号比英文多,意义也丰富得多,可惜很多人写中文都不能很恰当地用标点(包括我自己也常为标点所困惑),只知道一逗到底。所以汉语编程,既然使用了汉字关键字与汉字变量名,也可把所有标点改为全角标点,那就更和谐了。相信当我们看到函数体最后的返回语句后加一句号(。),或在循环体末尾加一省略号(……),将会感到一种亲切。

    至于繁体字的输入问题,我想在汉语编程设计中根本不用揪心于汉字输入问题。键盘上本无“一”字,既然能输入“一”字,也一定能输入“壹”字,也能做到使“一”与“壹”的输入速率相同或相近。提高英文的输入速度,唯有一途,那就是提高击键速度,而提高汉字输入速度的技术与技巧,那可就太多了。

    我不是以计算机编程为业,所以也无力开发一种汉编语言,以上所述,纯属外行幻想,因而对其中诸多细节,不再展开赘述。但是我想作为一种描述性的高级语言,汉语编程其终极目标应该是,在精确与简洁的权衡下,最大限度地符合汉语语法,使计算机与中国人都能方便看懂程序,实现人机共读,人机对话。

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