四、模組分割
既然稱為模組,本不存在分割與否的問題。如果一個程式師一開始就具備模組的觀念,徹底瞭解其性質,當然知道如何設計,自然就沒有分割的必要。即令如此,在程式的制作過程中,經常是信馬游缰,想到哪,寫到哪。所以,養成模組分割的觀念,對實際工作上,自有其必然的功效。
模組分割的原因不定,大約可分下列數種:
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 ,以與英文字符有別。
內碼的轉換也應考慮速度,而且要能雙向轉換,程式制作不難,但處理的技巧也不低。
【模組三】:中文字形結構模組-介面模組
貯存中文基本字形結構,根據輸入的倉颉碼,得到文字結構的基本訊息,以之組成字形。
中文字數極多,字形結構的規劃是成敗的關鍵,只要每個字形多加幾個字元,空間就會惡性膨脹。
本模組采用多層結構的技巧,其中子模組甚多,空間及速度兼顧,才能在極小的空間中,完成大量字形輸輸出,而且變化靈活,完全拜模組分割之助。
【模組四】:字形分析模組-輔助模組
舉凡字形大小、種類、筆形的變化及位置等,皆在本模組中完成。
字形分析以變化多為目的,故本模組主要功能在處理變數,應該妥善安排各緩沖器,以達到效率要求。
【模組五】:英文字形模組-功能模組
英文字形與中文有異,所以另成一模組。其字數較中文為少,但卻不具備任意組合的功能。
【模組六】:繪圖模組-功能模組
這段程式是字形產生器的核心,當得到模組四、五的資料以後,要以高速將字形繪出。
繪圖程式的關鍵在計算,計算雖然是電腦的原始功能,如果不另外加上「輔助計算器」,電腦的運算效率就大為降低。
一般說來,僅在螢幕上繪圖,或做字形繪制時,其范圍有限,且可以預知,故可采用「對照表」或快速運算法,換取顯示效率。在列印輸出時,則可采高精度運算方式。
【模組七】:各種介面-應用模組
介面即為介於兩個模組,或兩個獨立的系統間的機構,在大型模組工程中,介面之良窳,是使用效率的關鍵所在。
介面是各個模組得以順利配合的重要程式,只要瞭解介面的結構,便可以輕易地與原程式溝通。
六、模組調用
模組的先決條件是要能靈活調用,否則就失去了其設計的意義。而且模組的目的之一,是為了提供給其他程式師,作二次開發用。所以調用的方法,至關重要,必須面面俱到。
調用的方法很多,為了兼顧多方面的效應,我主張利用系統程式的中斷處理。這樣做的好處是,系統設計者不必考慮模組的設置,應用的程式師也無須擔心入口的位置,直接以參數調用即可。更有利的一點,則是可以在空間不足時,利用覆蓋的技術,靈活調用貯存在磁盤中的其他模組。
「中斷」是系統所提供的公用介面,其唯一的缺點是執行效率較差,但應用的程式師可以將中斷所提供的位址,移到自己的緩沖區內,代之以長距離的調用,即可改進之。
以下且以中文字形產生器應用介面為例,說明模組調用方法。本字形產生器提供見諸字典、文獻之有效漢字六萬余,倉颉輸入法所可能組合產生的「新字碼」約近六百萬字,在本字形產生器中皆有相應之字形。
除了字數外,字級由1*1 至 128*128,無級次變化。字體在目前僅提供明體、黑體、圓體及長、扁宋等,其橫直粗細比值由1至8點,上限為直粗的十二分之一。字形變化有空心、斜體及十種填花體、橫向粗細變化體等。
至於繁體、簡體字形或 ASCII字符,也可由使用者自選。
第二種方法,則是提供模組的目標碼 (.obj ),由應用程式師自行聯接成執行檔。這種做法,每個程式相互獨立,兼容性不高,通用性也不強,如果同時想應用多個程式,則需要極大的系統空間。
小型且專用性極強的應用程式,適用這種方法。但模組一旦與應用程式聯接後,就很難再靈活應用。