组合语言之艺术
第四章 程序设计

  学习任何一种艺术,只能从了解观念及熟练地运用工具、技巧上下功夫。至于个人
的成就及表现,有待于不断地自我要求和探索,不是仅仅通过学习就可以轻易获得的。
    组合程序的写作亦然,虽说尚有时、空效率的客观标准,但是一个功能复杂、应用
广泛的程序,其价值的全面评估却非如此单纯。要言之,目前这种组合程序艺术仅在启
蒙阶段,尚无成规可循,必须到大众都认识到其价值时,才会有定论。
    因此,我只能在此举一个例子,说明程序写作的观念,希望读者能够举一反三,灵
活应用。
 第一节 主题认识
一、任务
    兹假定有一任务,是要设计一些应用符号,其过程由编码到将符号绘制完成为止。
这是一个实际且实用的例子,我利用仓颉码定义符号码,并以程序处理之,既精简,又
快速。事实上,字形产生器就是利用类似原理设计的,在此特为参考。
    这些应用符号,是用来画表格,要与文字混用,故将各种表格符号,分解成为文字
字符,并予以定码。
    首先考虑编码,在此,「编码」就是前面所说的「数据设计」。一种考虑周全的编
码,在程序处理上,可以节省大量的时间和空间; 对使用的人而言,循着一种规则,也
可达到易记易用效果。
    要达到上述目的,必须先了解一些相关的因素,只要把这些因素纳入考虑范围,且
其结果能表现在所编的「码」中,上述的任务就达成了。
    这些相关的因素是:
  1,编码的限制:
 仓颉码取一至五码,限用 24 个字母,此类符号也不能例外。要能与中文字同时输入,
而且不能混淆,故不能 与已存在的中文字码有重码的情况发生。
  2,功能的需求:
 假定要设计四种不同粗细的格子,且每种皆能相互配合。如:
    ┌ ┬  ┬ ┬  ┬ ┐   ┌  ┬  ┬  ┬  ┬  ┐
    ├ ┼  ┼ ┼  ┼ ┤   ├         ┤
    ├ ┼  ┼ ┼  ┼ ┤   ├         ┤
    ├ ┼  ┼ ┼  ┼ ┤   ├         ┤
    ├ ┼  ┼ ┼  ┼ ┤   ├         ┤
    └ ┴  ┴ ┴  ┴ ┘   └  ┴  ┴  ┴  ┴  ┘
   图  一
    ┌ ┬  ┬ ┬  ┬ ┐   ┌  ┬  ┬  ┬  ┬  ┐
    ├        ┤   ├         ┤
    ├        ┤   ├         ┤
    ├        ┤   ├         ┤
    ├        ┤   ├         ┤
    └ ┴  ┴ ┴  ┴ ┘   └  ┴  ┴  ┴  ┴  ┘
      │  │  │  │      ─  ─  ─  ─
     图 二
二、分析
    以上符号共有 104种形状(后来我发现不敷应用,又加入一些图形)可以细分为四
类,分别为:
    横向,左右延伸,上下等距。
    纵向,左右等距,上下延伸。
    横向,或左或右,上下等距。
    纵向,或上或下,左右等距。
    由此可知,我们已经能够定出其规律:
    1,只有纵向横向,皆连接于格子的中央点。
    2,只有四个位置,即上、下、左、右。
    这种归纳方法相当有用,因为我们发现了二进制的影子,正该加以利用。
    先以四个位置来考虑,上下形即为纵向,左右形为横向,是个标准的二进制结构,
如果以对角线来看,左、上,右、下又可以组成另一维二进制,可以各用一个位来表示。
我选用了四种粗细,以凑成四个位。以一字符示意(x 表与该性质无关的位)如下:
    凡属细点者:   xxxxxxx0
    凡属粗点者:   xxxxxxx1
    凡前述点不加粗:  xxxxx0xx
    凡前述点粗细加倍:xxxxx1xx
    凡属于横向者:  xxxxxx0x
    凡属于纵向者:  xxxxxx1x
    凡属于左上者:  xxxx0xxx
    凡属于右下者:  xxxx1xxx
    以上各值用了四个位,共有16种组合,若以码代表之,其组合数当视取码数而定。
再参考图一,每种因素取一码,横、直、位置共有四种,结论是最多应取四码。
    取四码虽然理想,但仓颉码的设计原本是为了全部六、七万个中文字,而文字的产
生为约定俗成,不可能恰好有一连续空余的四码区段,可以安排表格码。
    我在输入码的组合中,好不容易找到一区,即YYX 码后,没有已存在的中文字,故
此决定把表格码安排在此区。
    仓颉码最多取五码,YYX 已用去三码,仅余两码可用。
    再看前面的分析,只有16种组合,而符号有24个之多。这种搭配很不理想,需要再
加考虑。
    需要取三、四码的,都是要贯穿格子中心的形状,如果再设几个贯穿格子的形状,
也当作基本图形,则每个图形仅取两码即可。
    到底我们要多少贯穿形呢?八个!(见图二)八加十六,恰恰好廿四个,完全符合
我们前面所强调的精简法则。
    这几种定义,实际上仅需将第五个位设为一即可:
    凡属半角者:   xxx0xxxx
    凡属贯穿形者:   xxx1xxxx
    最后,这24个码再加 41H就可以得到与文字相等的码值,读者如有兴趣,不妨试着
将这些码的值求出,今后应用时就可循着这种思路得出其输入码,而不必死记。
    不过,编码还没有完成,因为在计算机中,一字一代码是相当重要的原则,精确、
效率都建立在这个原则上。假如有一代码所代表的形状,与其他代码所代表者相同,就
相当于有「重码」字,这种情况应设法避免。此外,为了便于使用,取码也应依一定规
则,配合字母顺序,且以符合程序的处理为宜。
    例如 YYXAK与 YYXKA所得形状完全相同,要避免困扰,应规定依字母顺序,只有 Y
YXAK为有效码。
    又如 YYXAI所得之形,为左侧细横加右侧细横,相当于一条贯穿的细横。而这种横
与 YYXU 一码完全雷同。必要时,可以仅以 YYXU 为正确码,将YYXAI, YYXBJ, YYXCK,
 YYXDL, YYXEM, YYXFN, YYXGO, YYXHP等码建表拦掉。
    注:关于这一点,由于我当年的疏忽,编错了几个,若现在改过来,就会造成过去
所建数据不能再用的痛苦,所以从事规划者,千万慎始!
三、改进
    上述的编码方式,是否很理想呢?绝对不是,不仅由于当年的经验不足,考虑的不
够周全,已经有了一些错误的编码,而且观念上也有疏忽处。希望读者能进一步的研究
出更好的方法,至少,应该能把我个人所发生的缺点加以改进。关于这一点,不妨当作
考试题目,在参考本章第五节程序写作时,留心一点,就会发现其中大有文章。
    编码确定以后,就可以写程序了。由于编码时已经把程序的「位数据」一并考虑,
所以立刻分支,利用绘图的程序,轻松愉快地,用几条指令,就完成了任务。

上一页    下一页