程式寫完后,還要加工成為可執(zhí)行的套裝軟件(Package),一般說來,即使是可以執(zhí)行的程式,一點(diǎn)錯(cuò)誤都沒有,離套裝軟件的程度,卻還有一段距離。
當(dāng)然,程式偵錯(cuò)也是必經(jīng)過程之一,有時(shí)偵錯(cuò)與程式寫作可以同時(shí)進(jìn)行。但有經(jīng)驗(yàn)的程式師,對全面有了充份的認(rèn)識,往往會等到程式聯(lián)接后再行偵錯(cuò)。
程式完成后的全面?zhèn)慑e(cuò),不要依靠寫程式的人。因?yàn)槌淌綆熃?jīng)常不是使用者,他們僅在自己設(shè)計(jì)的條件下,依其理念進(jìn)行偵錯(cuò)。當(dāng)然這種錯(cuò)誤必須更正,但最容易發(fā)生的錯(cuò)誤,卻是使用者不小心在輸入時(shí),或運(yùn)用指令時(shí),違背了程式師的理念。這種錯(cuò)誤的發(fā)生,是不能原諒的,程式本來就是為使用者設(shè)計(jì)的,如果令使用者不便,程式就失去了應(yīng)有的價(jià)值。
程式的品管,就在于檢測程式是否符合使用者的需求。一般說來,應(yīng)有專人負(fù)責(zé),也有讓寫作手冊的人,兼做品管的工作。這樣可以同時(shí)對照手冊所描述的功能及操作方法,檢查兩者之間是否一致。
還有一種常見的品管方式,是在產(chǎn)品完成時(shí),交給完全沒有參與程式設(shè)計(jì)的第三者,在客觀的立場,作全面的試用,并提出測試報(bào)告或建議書。
品管合格了,才是包裝、手冊等最后的工作。這并不是說包裝和手冊要最后才做,相反的,尤其是使用手冊,經(jīng)常要在程式設(shè)計(jì)的同時(shí),準(zhǔn)備妥當(dāng),如此程式師才不會任意所之,脫離主題。
第一節(jié) 測試偵錯(cuò)
不論使用什么工具,偵錯(cuò)時(shí)一定要有清晰的頭腦,根據(jù)所設(shè)定的方式,一步一步地查看流程及指令。
每個(gè)人都會有獨(dú)特的習(xí)慣性錯(cuò)誤,每次將自己發(fā)生的錯(cuò)誤記下來,不僅錯(cuò)誤會漸漸減少,且在錯(cuò)誤發(fā)生時(shí),很容易就能找到。
測試偵錯(cuò)是非常重要的手段,有人認(rèn)為第一流的程式師不應(yīng)該犯錯(cuò),即使犯錯(cuò),也錯(cuò)得很少。我的看法不一樣,并非因?yàn)槲医?jīng)常犯錯(cuò),而且錯(cuò)得離譜。真正的理由是為了適時(shí)掌握正確的思考方向,在編程時(shí),有意無意地忽略一些細(xì)節(jié),這樣反而能一氣呵成,不致于再而竭三而衰。
這就像畫圖一樣,有人喜歡先作草圖,有人則習(xí)慣由細(xì)部畫起。不論個(gè)人的風(fēng)格如何,重要的是最后的成果。
我在寫程式之前,首先考慮全體的結(jié)構(gòu),再把各處的支架備妥,然后考慮有共同特性之處,便一口氣寫完。而且寫時(shí)力求快速,以免失去當(dāng)時(shí)的感覺。等到結(jié)構(gòu)大體完成了,最后才去填補(bǔ)一些不太重要的細(xì)節(jié)。至于正確與否,則全靠測試偵錯(cuò)來修正、彌補(bǔ)。
這種寫法要有很強(qiáng)的整體觀念,且對每段程式的性質(zhì)及功能皆瞭解從何下手。
我由系統(tǒng)程式到應(yīng)用工具,大大小小的程式寫了不少,對這種寫作方法有很深的體會。的缺點(diǎn)是,程式如果太大,超過20KB,我的記憶力就難以負(fù)擔(dān)。(年輕人或許不致如此)但其優(yōu)點(diǎn)則是結(jié)構(gòu)精簡,制作時(shí)間極短。以我們的中文系統(tǒng)程式而言,8KB 的程式,連偵錯(cuò)在內(nèi),只花了兩個(gè)月的功夫。
然而,在訓(xùn)練程式師的過程中,我發(fā)現(xiàn)到還是循序漸進(jìn)較好。每次寫完了一段程式,立刻偵錯(cuò),此段程式正確了,再寫下一段。除非有絕對的把握,自信沒有問題,否則千萬不要等全部程式都寫完了,再來調(diào)試。到那時(shí),如果發(fā)現(xiàn)問題,在各段錯(cuò)綜復(fù)雜的程式中,要找到錯(cuò)誤所在,那是大海撈針了。
程式發(fā)生「當(dāng)機(jī)」的情況,常常是 PUSH 及 POP不平衡所致,也有在做回路時(shí),計(jì)數(shù)器為負(fù)值,以致鎖在其中。如果程式分「段」太多,則要特別注意各「段」改變的情況。
諸如這些細(xì)節(jié),隨時(shí)把編程時(shí)的假想值記錄下來,不要太過相信自己的記憶力,時(shí)間一長,程式一大,就什么都忘記了。
還有一點(diǎn),在偵錯(cuò)時(shí)千萬要養(yǎng)成習(xí)慣,記錄追蹤的過程。因?yàn)閭慑e(cuò)是一種很瑣碎的工作,很難一次就發(fā)現(xiàn)問題所在,第一次應(yīng)該是第二次改進(jìn)的經(jīng)驗(yàn)。如果不詳加記錄,每次都要從頭做起,將是一種極為痛苦的事。
不妨把偵錯(cuò)視為猜謎,一種智力的挑戰(zhàn),在遵守一定的規(guī)則下,應(yīng)該是一種有趣的享受。
第二節(jié) 研究改進(jìn)
想要把程式寫好,一定要不斷地研究、改進(jìn),由錯(cuò)誤中學(xué)習(xí),由改進(jìn)中得到經(jīng)驗(yàn),培養(yǎng)出敏銳的觀察能力和良好的寫作習(xí)慣。
在開始時(shí),這種過程需要付出不少時(shí)間,但對一位程式師來說,寫程式是終身職業(yè),能不精益求精嗎?
以下舉兩個(gè)實(shí)例,以說明如何研究改進(jìn)已完成的程式。
1,指令的運(yùn)用:
以下面這段通訊處理程式而論,不僅語法及指令完全正確,執(zhí)行時(shí)也毫無錯(cuò)誤,是不是還可以加以改進(jìn)呢?
1-1 按照前面規(guī)定,說明項(xiàng)中已用簡化的字串:
SND-傳送 RCV-接收 LET-左
RGT-右 VER-直 HOR-橫
1-2 程式師代號為'C'。
1-3 段名省略。
1: CSND0:
2: MOV DX,03FDH ; 輸出埠
3: MOV AL,80H
4: OUT DX,AL ; 輸出指令
5: MOV DX,03F8H ; LSB 速度控制
6: MOV AL,06H ; 速度=19200/秒
7: OUT DX,AL
8: MOV DX,03F9H ; MSB 速度控制
9: MOV AL,0 ; 速度=19200/秒
10: OUT DX,AL
11: MOV DX,03FBH ; 行控制暫存器
12: MOV AL,03H ; NO PARITY,1
; S,8
13: OUT DX,AL
14: MOV DX,03FCH ; 通訊控制
15: OUT DX,AL
16: MOV DX,03F9H ; 中斷有效
17: MOV AL,0
18: OUT DX,AL
19: CSND1:
20: MOV DX,03FDH ; 狀態(tài)暫存器
21: IN AL,DX
22: TEST AL,10H ; 是否可接收?
23: JNZ CRCV0 ; 可
24: TEST AL,20H ; 通道已清否?
25: JZ CSND1 ; 8250未清
26: MOV AH,1 ; 鍵盤有輸入?
27: INT 16H
28: CMP AL,07H ; ='CTRL+G'
29: JE CEND ; 是,完畢
30: MOV DX,03F8H
31: OUT DX,AL ; 送輸入字符
32: JMP CSND1
33: CRCV0: ; 接收
34: MOV DX,03FCH ; 通訊控制
35: MOV AL,08H ; 暫停中斷
36: OUT DX,AL
37: MOV DX,3F8H
38: IN AL,DX ; 收字符
39: MOV AH,0EH
40: INT 10H ; 螢屏顯示
41: MOV DX,03FCH
42: MOV AL,0BH
43: OUT DX,AL ; 繼續(xù)接受
44: JMP CSND1 ; 循環(huán)工作
45: CEND:
46: RET ; 完成
當(dāng)然,程式偵錯(cuò)也是必經(jīng)過程之一,有時(shí)偵錯(cuò)與程式寫作可以同時(shí)進(jìn)行。但有經(jīng)驗(yàn)的程式師,對全面有了充份的認(rèn)識,往往會等到程式聯(lián)接后再行偵錯(cuò)。
程式完成后的全面?zhèn)慑e(cuò),不要依靠寫程式的人。因?yàn)槌淌綆熃?jīng)常不是使用者,他們僅在自己設(shè)計(jì)的條件下,依其理念進(jìn)行偵錯(cuò)。當(dāng)然這種錯(cuò)誤必須更正,但最容易發(fā)生的錯(cuò)誤,卻是使用者不小心在輸入時(shí),或運(yùn)用指令時(shí),違背了程式師的理念。這種錯(cuò)誤的發(fā)生,是不能原諒的,程式本來就是為使用者設(shè)計(jì)的,如果令使用者不便,程式就失去了應(yīng)有的價(jià)值。
程式的品管,就在于檢測程式是否符合使用者的需求。一般說來,應(yīng)有專人負(fù)責(zé),也有讓寫作手冊的人,兼做品管的工作。這樣可以同時(shí)對照手冊所描述的功能及操作方法,檢查兩者之間是否一致。
還有一種常見的品管方式,是在產(chǎn)品完成時(shí),交給完全沒有參與程式設(shè)計(jì)的第三者,在客觀的立場,作全面的試用,并提出測試報(bào)告或建議書。
品管合格了,才是包裝、手冊等最后的工作。這并不是說包裝和手冊要最后才做,相反的,尤其是使用手冊,經(jīng)常要在程式設(shè)計(jì)的同時(shí),準(zhǔn)備妥當(dāng),如此程式師才不會任意所之,脫離主題。
第一節(jié) 測試偵錯(cuò)
不論使用什么工具,偵錯(cuò)時(shí)一定要有清晰的頭腦,根據(jù)所設(shè)定的方式,一步一步地查看流程及指令。
每個(gè)人都會有獨(dú)特的習(xí)慣性錯(cuò)誤,每次將自己發(fā)生的錯(cuò)誤記下來,不僅錯(cuò)誤會漸漸減少,且在錯(cuò)誤發(fā)生時(shí),很容易就能找到。
測試偵錯(cuò)是非常重要的手段,有人認(rèn)為第一流的程式師不應(yīng)該犯錯(cuò),即使犯錯(cuò),也錯(cuò)得很少。我的看法不一樣,并非因?yàn)槲医?jīng)常犯錯(cuò),而且錯(cuò)得離譜。真正的理由是為了適時(shí)掌握正確的思考方向,在編程時(shí),有意無意地忽略一些細(xì)節(jié),這樣反而能一氣呵成,不致于再而竭三而衰。
這就像畫圖一樣,有人喜歡先作草圖,有人則習(xí)慣由細(xì)部畫起。不論個(gè)人的風(fēng)格如何,重要的是最后的成果。
我在寫程式之前,首先考慮全體的結(jié)構(gòu),再把各處的支架備妥,然后考慮有共同特性之處,便一口氣寫完。而且寫時(shí)力求快速,以免失去當(dāng)時(shí)的感覺。等到結(jié)構(gòu)大體完成了,最后才去填補(bǔ)一些不太重要的細(xì)節(jié)。至于正確與否,則全靠測試偵錯(cuò)來修正、彌補(bǔ)。
這種寫法要有很強(qiáng)的整體觀念,且對每段程式的性質(zhì)及功能皆瞭解從何下手。
我由系統(tǒng)程式到應(yīng)用工具,大大小小的程式寫了不少,對這種寫作方法有很深的體會。的缺點(diǎn)是,程式如果太大,超過20KB,我的記憶力就難以負(fù)擔(dān)。(年輕人或許不致如此)但其優(yōu)點(diǎn)則是結(jié)構(gòu)精簡,制作時(shí)間極短。以我們的中文系統(tǒng)程式而言,8KB 的程式,連偵錯(cuò)在內(nèi),只花了兩個(gè)月的功夫。
然而,在訓(xùn)練程式師的過程中,我發(fā)現(xiàn)到還是循序漸進(jìn)較好。每次寫完了一段程式,立刻偵錯(cuò),此段程式正確了,再寫下一段。除非有絕對的把握,自信沒有問題,否則千萬不要等全部程式都寫完了,再來調(diào)試。到那時(shí),如果發(fā)現(xiàn)問題,在各段錯(cuò)綜復(fù)雜的程式中,要找到錯(cuò)誤所在,那是大海撈針了。
程式發(fā)生「當(dāng)機(jī)」的情況,常常是 PUSH 及 POP不平衡所致,也有在做回路時(shí),計(jì)數(shù)器為負(fù)值,以致鎖在其中。如果程式分「段」太多,則要特別注意各「段」改變的情況。
諸如這些細(xì)節(jié),隨時(shí)把編程時(shí)的假想值記錄下來,不要太過相信自己的記憶力,時(shí)間一長,程式一大,就什么都忘記了。
還有一點(diǎn),在偵錯(cuò)時(shí)千萬要養(yǎng)成習(xí)慣,記錄追蹤的過程。因?yàn)閭慑e(cuò)是一種很瑣碎的工作,很難一次就發(fā)現(xiàn)問題所在,第一次應(yīng)該是第二次改進(jìn)的經(jīng)驗(yàn)。如果不詳加記錄,每次都要從頭做起,將是一種極為痛苦的事。
不妨把偵錯(cuò)視為猜謎,一種智力的挑戰(zhàn),在遵守一定的規(guī)則下,應(yīng)該是一種有趣的享受。
第二節(jié) 研究改進(jìn)
想要把程式寫好,一定要不斷地研究、改進(jìn),由錯(cuò)誤中學(xué)習(xí),由改進(jìn)中得到經(jīng)驗(yàn),培養(yǎng)出敏銳的觀察能力和良好的寫作習(xí)慣。
在開始時(shí),這種過程需要付出不少時(shí)間,但對一位程式師來說,寫程式是終身職業(yè),能不精益求精嗎?
以下舉兩個(gè)實(shí)例,以說明如何研究改進(jìn)已完成的程式。
1,指令的運(yùn)用:
以下面這段通訊處理程式而論,不僅語法及指令完全正確,執(zhí)行時(shí)也毫無錯(cuò)誤,是不是還可以加以改進(jìn)呢?
1-1 按照前面規(guī)定,說明項(xiàng)中已用簡化的字串:
SND-傳送 RCV-接收 LET-左
RGT-右 VER-直 HOR-橫
1-2 程式師代號為'C'。
1-3 段名省略。
1: CSND0:
2: MOV DX,03FDH ; 輸出埠
3: MOV AL,80H
4: OUT DX,AL ; 輸出指令
5: MOV DX,03F8H ; LSB 速度控制
6: MOV AL,06H ; 速度=19200/秒
7: OUT DX,AL
8: MOV DX,03F9H ; MSB 速度控制
9: MOV AL,0 ; 速度=19200/秒
10: OUT DX,AL
11: MOV DX,03FBH ; 行控制暫存器
12: MOV AL,03H ; NO PARITY,1
; S,8
13: OUT DX,AL
14: MOV DX,03FCH ; 通訊控制
15: OUT DX,AL
16: MOV DX,03F9H ; 中斷有效
17: MOV AL,0
18: OUT DX,AL
19: CSND1:
20: MOV DX,03FDH ; 狀態(tài)暫存器
21: IN AL,DX
22: TEST AL,10H ; 是否可接收?
23: JNZ CRCV0 ; 可
24: TEST AL,20H ; 通道已清否?
25: JZ CSND1 ; 8250未清
26: MOV AH,1 ; 鍵盤有輸入?
27: INT 16H
28: CMP AL,07H ; ='CTRL+G'
29: JE CEND ; 是,完畢
30: MOV DX,03F8H
31: OUT DX,AL ; 送輸入字符
32: JMP CSND1
33: CRCV0: ; 接收
34: MOV DX,03FCH ; 通訊控制
35: MOV AL,08H ; 暫停中斷
36: OUT DX,AL
37: MOV DX,3F8H
38: IN AL,DX ; 收字符
39: MOV AH,0EH
40: INT 10H ; 螢屏顯示
41: MOV DX,03FCH
42: MOV AL,0BH
43: OUT DX,AL ; 繼續(xù)接受
44: JMP CSND1 ; 循環(huán)工作
45: CEND:
46: RET ; 完成