第三节 模组观念
当宇宙中还没有人类文明时,是一个整体,循着一定的规律,无休无止地运行。人类的出现,因为意识到自我与非我的分别,就产生了是、非,有、无,善、恶,好、坏的认知。世事的复杂性,即源自于这种分辨心,而忽略了本体的完整及规律性。
人类对知识的追求,是利用概念作为工具,有系统地对宇宙各种现象分门别类的分析。而分析的结果,可以视为各种模组,人则藉着各式模组,来认知宇宙这个大环境。
因此模组并不局限于具体的、客观的事物,任何可以经由分析、归纳而认知者,均具有模组结构。而且每每在一些模组的结构上,又有另一层次的模组展开。
电脑软件的模组,则是一些功能或性质独立的「目标档」(OBJ Files )。此类目标档与介面模组相互联接后,即可执行。为了追求工作效率,将此类模组有系统的予以分类整理,公开上市,不仅可以避免程式的重复制作,且可便利程式师的组合应用。
「集装货柜」增进了航运的效率,其原因就在于将货物「模组」化,有的以运送目的地、有的以货物性质而定。此外,如「预铸房屋」,甚至于流水线式的生产等,都具有相同的观念。这和程式制作时,为了效率所作的模组分割,有异曲同工之妙。
软件模组化的要求由来已久,此与工业生产的经验有关,但是迄今很少有具体的成功先例。因为软件的变化无穷,很难建立一种「工业标准」,既没有标准,就难以统一规划。
因为标准是人制订的,在初,不论如何深思熟虑,不周之处在所难免。但只要有了先例,而且能提供大家参考、应用,集合众人之智慧,总会有完善的一天。
问题在于,当今有经验的程式师们太忙了,有的忙于自我创造,有的忙于模仿抄袭,有的则忙于享受、玩乐。学校里所教的,全是与现实脱节的理论,而一出校门,由于软体程式师供不应求,炙手可热,立刻就投入了市场的洪流,推波逐澜,还有谁管什么模组!
一、模组定义
1,空间小、结构完整,能独立调用的程式。
模组不能太大,否则无法灵活应用,程式的结构又必须独立且完整,以便于分解、组合,供二次开发的程式自由调用。
有些模组需要与公用模组配合使用,由于公用模组为全部模组设计的基础,故仍可视为独立调用。
2,效率高、弹性大,便于其他程式调用者。
二次开发的程式系建立在模组结构上,如果模组的效率不佳,必然会影响其操作。同时,各种应用程式都有特殊的需求和条件,而模组则要考虑通用性,否则很难符合各种条件。所以,在设计模组时,要考虑应用的弹性,使之既能适应各种需求,又能达成特殊的任务。
3,功能明确,其变化以参数设定实现。
功能不明确,将会令应用者困惑,也就达不到预期的目的。功能明确与否,除了程式本身外,手册及说明也占了极大的比重。
所谓功能明确,并非指明确的单一功能,而是指功能的分类。在分类时,需要有一种容易分辨的方式,而最简单的,便是设置参数,凭参数作分支的条件。
4,程式之间必须利用暂存器传送资料者。
基于程式、模组之间相互独立,各自应用的缓冲器无法统筹运用。故在执行时,必须利用暂存器以传资料或参数,完成彼此的沟通。
二、模组种类
将模组分类,为的是便于说明,以下的分类法,并非一成不变。原则上,模组可分为:
1,功能模组:以所执行的功能加以分割者。
此类模组要考虑应用上的方便及功能的完整。然而,所谓功能的完整,祇限于独立、单一的目标,绝不可将多个不同的功能,设计在一个难以分割的模组中。
2,公共模组:没有明确的功能,但具有共用的效益,或其他某种特殊的目的,也可以设计成为模组。
这种模组经常附属于其他模组中,设计时应注意其调用的灵活性,并应专设一目录,详细记载其用途,以便随时查寻。
3,介面模组:介于两「面」之间,以解决两者问题之模组。一般在程式中,凡属资料与资料间、程式与程式间、硬体与硬体间者,皆为介面关系,处理这种关系的模组即为介面模组。
4,应用模组:应用者为人,工作者为程式,故提供给应用者操作的模组,概称应用模组。
此种模组在实质上,仍属一种介面,但因为其实用价值关系到一个程式的成败,必须独立考虑。
这种模组变化最大,随时有必要根据使用者的需求修改增减,故设计时要特别留意。
三、模组分割的基本原理
中国文化之博大精深,可以由古人的思想略窥一二,许多人自以为学了一点西方科学技术的皮毛,就像夜郎一样了不得了。其实,除了知识在不断累积外,从古至今,人的智慧并没有丝毫增长。
模组是一种极有价值的观念,任何事物的形体、结构、步骤,甚至于概念、认知等,都可在以某个目标为前提之下,分析成为若干模组。有了模组,范围就会缩小、问题也就变得单纯,比较容易掌握。如果能有效地利用模组,以之作为解决问题的手段,将是无往而不利。
庄子早见于此,曾经以寓言的方式,在其内篇《养生主》中,就曾对模组的分割,作了透彻的剖析介绍。时到今日,科学昌明之际,读来仍有「振聋起聩」,一新耳目之慨。
为此,特将原文抄录于下,再作浅释。
养生主第三
吾生也有涯,而知也无涯。以有涯随无涯,殆已。已而为知者,殆而已矣。为善??近名,为恶??近刑。缘督以为经。可以保身,可以全生,可以养亲,可以尽年。
庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦。砉然向然,奏刀騞然,莫不中音,合于桑林之舞,乃中经首之会。
文惠君曰:『嘻,善哉,技盖至此乎?』
庖丁释刀对曰:『臣之所好者道也,进乎技矣。始臣之解牛之时,所见??非牛者。三年之后,未尝见全牛也。方今之时,臣以神遇,而不以目视。官知止而神欲行,依乎天理。批大却,导大窾,因其固然。技经肯綮之未尝,而况大軱乎?良庖岁更刀,割也;族庖月更刀,折也。今臣之刀十九年矣,所解数千牛矣,而刀刃若新发于硎。彼节者有闲,而刀刃者??厚;以??厚入有闲,恢恢乎其游刃必有余地矣,是以十九年而刀刃若新发于硎。虽然,每至于族,吾见其难为,怵然为戒。视为止,行为迟。动刀甚微,謋然已解,如土委地。提刀而立,为之四顾,为之踌躇满志,善刀而藏之。』
文惠君曰:『善哉!吾闻庖丁之言,得养生焉。』
1,前文释义
人的生命有限,而知识无尽,以有限之生命追求无尽的知识,是自陷于绝地。既已自陷,还妄想藉助于知识,以求自救,当然更是匪夷所思了。
其实,只要瞭解事物的道理,以及各种问题的症结。不要执着于表象,不要迷惑于现状,顺理而行。如是,不仅可以安身立命,且能功成名就。
梁惠王有一厨师,宰牛时,姿态潇洒,动作俐落,颇有艺术家的风采。梁惠王见了,赞不绝口:
『真了不起!你的刀法神奇到这个地步!』
厨师听了,忙把刀放下,向梁惠王禀告说:
『臣子我一向重视观念,并不在意小技巧。最初,臣宰牛时,只看到牛的全身。又过了三年,每宰牛时,所看到的只是牛的结构。现在,臣已能心领神会,按照自然的原则,不论是剖肉、卸骨,刀尖只要顺着关键的间隙轻轻一挑,其组织立即迎刃而解。
好的厨师每年换刀,这是因为切割过多,难免有所损耗;技术较差的,经常用力砍,刀锋易折,每月都需要换一次。而臣所用之刀,已经有十九年了,宰牛不下千头,而刀刃锋利如昔。
其实,道理很简单,牛体是由很多不同的组织组成,其间必然有衔接的空间。因为刀锋很薄,在组织间隙中移动,轻轻松松,甚至还有多余的地方。
当然,也有碰到棘手时。臣就会全神贯注,先找到问题所在,小心谨慎地处理。一旦刀锋稍动,剎时之间,组织分离,大功告成。
那种成就之后欣慰的感受,简直难以比拟。最后,为了下次的工作,把刀擦拭干净,好好保护收存。』
梁惠王听了,道:『好极了,听你一席话,领悟到不少人生的大道理。』
2,主旨精要
人生是有限的,为了有效的利用精力,以解决一切问题,应该学习掌握事物的原理。原理之一,即为事物皆具有模组的结构,模组是事物组成之基础。有能力的人,一定善于分析事理,瞭解事物的结构基础,得以从容不迫,在面对问题时,找到有问题的模组,在其症结上下刀,问题便会迎刃而解。
四、模组分割
既然称为模组,本不存在分割与否的问题。如果一个程式师一开始就具备模组的观念,彻底瞭解其性质,当然知道如何设计,自然就没有分割的必要。即令如此,在程式的制作过程中,经常是信马游缰,想到哪,写到哪。所以,养成模组分割的观念,对实际工作上,自有其必然的功效。
模组分割的原因不定,大约可分下列数种:
1,为了制作的方便,把程式分成模组,易于维护。
2,为了工作效率,或需要速度、或为节省空间的程式,分别用不同的技巧制作。
3,因程式师的工作能力,或工作条件而进行分割。
4,因程式的功能分类,分开制作,以便于灵活应用。
不论原因为何,分割模组前,一定要先确定目标,全面认知程式的格局,再加以整理、归类,才能根据类别来分割。
分类确定后,再以分类来命名,以便于记忆及应用。这时格式的统一定义便是关键所在。因为模组一多,相互间的调用极为频繁,如果格式不能统一,程式间常常需要因应调整,反而增加了使用上的难度,得不偿失。
其次,各模组必须建立一个总表,而且要经常维护,务必与实际上所使用者一一对应,切勿偷懒。每次调用时,还需修正记录,如使用次数,调用的程式等。
如果程式制作的规模大,参与人数多,最理想是由专人负责模组管理。从事这种工作的人,必须头脑清楚,反应敏锐,而且要能任劳任怨,勤于更新。
在做模组分割前,应先备妥 .ref 及 .lst 档,设有一程式 abcd.asm ,其做法为:
C:>M ABCD,,,;
m 为汇编程式,即 masm.exe 之简化名,请参见第二章第二节。其后之“,,,;”表示需要 .obj,.lst和 .crf三个档,而且不必显示在萤幕上。
汇编完成后,再用 cref.exe 生成 abcd.ref 如下:
C:>CREF ABCD;
这时,将 abcd.lst 及 abcd.ref 印出,相互对照,先将程式精简、整理,再行分割。
1,在 abcd.ref 档中,每个「标题」都来自 abcd.lst 档,标题之后,有若干组数字,其中带#者,表示标题出处,余者为调用之处。若仅有来处,而无调用处,则此标题可删除。再如标题前之指令为 jmp 或 ret ,则此标题所代表的程式毫无用处,亦应删除之。
2,如 abcd.lst 档中有 nop指令,除非是有意安排者,否则亦应删除。如在 jmp xxxx 之后,可将之改为 jmp short xxxx 。
若 XXXX 之前无连接的程式,亦可将之合并。此外,凡指令 CALL 所调用的子程式,如仅调用一次,最好将此段子程式合并在程式内,或附属于其后,以便于分辨。
3,程式精简及合并后,再行检查各段程式,凡功能独立者,应先分割。分割后,再检查其中是否调用其他子程式,如有,应先记录下来,此段程式即可视为「功能模组」。
4,凡前述功能模组中调用的子程式,如仅供该模组调用,则可附在该模组后,否则应置于「共用模组」中。
5,但凡程式之「主流程」,大多属「应用模组」。此类应用模组极难分割,也无分割的必要。
6,分割完毕后,应详细注记,以便备用。
五、模组特性
所谓模组特性,是指各个模组在设计或分割之初所考虑的因素。特性包括了功能,效率的特别要求以及使用时应行注意的重点等有关模组的细节。
不论模组设计的目标为何,既然有了模组,就应该高度发挥其应有的效率。各个模组之分割,皆有其必然因素,不论是为了功能,或是为了制作方便,目的都在追求效率。而每个模组皆有其特性,要达到效率要求,应先瞭解模组的特性。
下面以前节所举的中文系统为例,将其中各个模组的特性一一详细分析如下:
【模组一】:中文处理的系统模组-功能模组
1,键盘中断:因为人输入的速度远逊于电脑处理速度,所以,本中断程式应该以节省空间为主。此外,键盘的应用,以灵活达变为重点,宜多采用「建表」法,便于修改、变更。
2,显示中断:显示速度非常重要,本模组应牺牲空间以争取时效。此外,显示的弹性要大,凡字符的大小、位置、属性等,都应该一次考虑清楚。
目前显示器的规格很多,彼此互不相容,一般多在程式载入前,先作安排。在本模组中,尤其应该注意不同的显示程式,如何兼顾速度的运行。
3,列印中断:列印也面临不同的机种介面问题,但因不涉及速度,其技巧完全属于设定及载入方面。
4,通讯中断:通讯所需考虑的,是如何保证在资料传输过程中的安全、正确及保密。
【模组二】:中文内码模组-辅助模组
因为仓颉码可以组出既有的,以及排列组合上可能产生的中文字,照理应该不受内码的限制。但是仓颉输入码之长度不定,为了电脑的处理效率,我们采用了四字元内码,每一字元的最高位元设置为1 ,以与英文字符有别。
内码的转换也应考虑速度,而且要能双向转换,程式制作不难,但处理的技巧也不低。
【模组三】:中文字形结构模组-介面模组
贮存中文基本字形结构,根据输入的仓颉码,得到文字结构的基本讯息,以之组成字形。
中文字数极多,字形结构的规划是成败的关键,只要每个字形多加几个字元,空间就会恶性膨胀。
本模组采用多层结构的技巧,其中子模组甚多,空间及速度兼顾,才能在极小的空间中,完成大量字形输输出,而且变化灵活,完全拜模组分割之助。
【模组四】:字形分析模组-辅助模组
举凡字形大小、种类、笔形的变化及位置等,皆在本模组中完成。
字形分析以变化多为目的,故本模组主要功能在处理变数,应该妥善安排各缓冲器,以达到效率要求。
【模组五】:英文字形模组-功能模组
英文字形与中文有异,所以另成一模组。其字数较中文为少,但却不具备任意组合的功能。
【模组六】:绘图模组-功能模组
这段程式是字形产生器的核心,当得到模组四、五的资料以后,要以高速将字形绘出。
绘图程式的关键在计算,计算虽然是电脑的原始功能,如果不另外加上「辅助计算器」,电脑的运算效率就大为降低。
一般说来,仅在萤幕上绘图,或做字形绘制时,其范围有限,且可以预知,故可采用「对照表」或快速运算法,换取显示效率。在列印输出时,则可采高精度运算方式。
【模组七】:各种介面-应用模组
介面即为介于两个模组,或两个独立的系统间的机构,在大型模组工程中,介面之良窳,是使用效率的关键所在。
介面是各个模组得以顺利配合的重要程式,只要瞭解介面的结构,便可以轻易地与原程式沟通。
第二种方法,则是提供模组的目标码 (.obj ),由应用程式师自行联接成执行档。这种做法,每个程式相互独立,兼容性不高,通用性也不强,如果同时想应用多个程式,则需要极大的系统空间。
小型且专用性极强的应用程式,适用这种方法。但模组一旦与应用程式联接后,就很难再灵活应用。
文档说明:
相关文档
返回首页 | 关于本站 | | 友情链接 | 广告服务 | 意见建议 | 访客留言 | 本站论坛
Copyright© 2001-2006 ProgramBBS.com All Rights Reserved 版权所有©编程论坛
Email: 吉ICP备05009985号
感谢长春订餐网友情支持