什么是調(diào)試

2023-03-20 15:43 更新

編程是個(gè)復(fù)雜的過程,而且因?yàn)橛扇藖硗瓿桑噪y免出現(xiàn)錯(cuò)誤。由于一些特殊的原因,編程錯(cuò)誤稱為“bug”,而跟蹤和修正錯(cuò)誤的過程稱為“debugging”,中文叫做調(diào)試。

程序中會(huì)出現(xiàn)幾種不同類型的錯(cuò)誤,分清這幾類錯(cuò)誤有助于快速找出問題。

1.3.1 編譯時(shí)錯(cuò)誤

編譯器只能翻譯語法正確的程序,當(dāng)存在語法問題時(shí),編譯失敗,你也就無從運(yùn)行程序了。語法指程序的結(jié)構(gòu)和結(jié)構(gòu)的規(guī)則。

例如,英語中的句子必須以大寫字母開頭并以句號(hào)結(jié)尾。不以大寫字母開頭或者不以句號(hào)結(jié)尾的句子在語法上都是錯(cuò)誤的。

對(duì)大多數(shù)讀者而言,語法錯(cuò)誤不是個(gè)嚴(yán)重問題,我們讀e e cummings的詩(shī)歌時(shí)并不會(huì)感覺到很多語法錯(cuò)誤就是這個(gè)原因。

編譯器可沒這么寬容。程序中不管哪里出現(xiàn)了一個(gè)語法錯(cuò)誤,編譯器都會(huì)打印錯(cuò)誤信息并退出,結(jié)果就是沒辦法執(zhí)行程序。

更麻煩的是,C++中的語法規(guī)則比英語要多得多,而且編譯器給出的錯(cuò)誤提示信息不見得總有用。在我們剛學(xué)著編程的前幾周,你可能要花很多時(shí)間來查找語法錯(cuò)誤。隨著經(jīng)驗(yàn)的增長(zhǎng),你犯的錯(cuò)會(huì)越來越少,找出錯(cuò)誤也會(huì)更快。

1.3.2 運(yùn)行時(shí)錯(cuò)誤

第二類錯(cuò)誤是運(yùn)行時(shí)錯(cuò)誤,因?yàn)檫@類錯(cuò)誤在程序運(yùn)行時(shí)才會(huì)出現(xiàn)。

下面幾周我們編寫的都是很簡(jiǎn)單的程序,運(yùn)行時(shí)錯(cuò)誤非常少見,可能過一段時(shí)間才會(huì)遇到。

1.3.3 邏輯與語義錯(cuò)誤

第三類錯(cuò)誤是邏輯或語義錯(cuò)誤。如果程序中有邏輯錯(cuò)誤,程序仍會(huì)正確編譯并運(yùn)行,編譯器不會(huì)生成任何錯(cuò)誤消息,但是程序運(yùn)行得不到預(yù)期結(jié)果。程序執(zhí)行的不是你需要的功能。其實(shí),你讓程序做什么它就做什么,問題在于,你寫出的代碼和你本來要設(shè)計(jì)的功能并不一致。也就是說,程序的語義錯(cuò)了。識(shí)別邏輯錯(cuò)誤可能很復(fù)雜,因?yàn)檫@需要你根據(jù)程序的輸出和找出程序到底在做什么來倒推問題所在。

1.3.4 實(shí)驗(yàn)性調(diào)試

調(diào)試應(yīng)該是你能從本書中學(xué)到的最重要的一個(gè)技能。雖然調(diào)試過程中可能有挫敗感,但調(diào)試是編程中最具智慧、挑戰(zhàn)和樂趣的部分之一。

從某種角度看,調(diào)試就像偵探工作。你要根據(jù)線索來推理各種過程和事件,最終找到結(jié)果。

調(diào)試又像做實(shí)驗(yàn)。一旦意識(shí)到出了問題,你就要修改程序并重新嘗試。如果所做的假設(shè)正確,你就能預(yù)測(cè)對(duì)修改后的結(jié)果,這就離正確的程序又近了一步。如果假設(shè)錯(cuò)誤,你就要提出新的假設(shè)。就像夏洛克?福爾摩斯所說的,“排除了那些不可能的之后,無論剩下什么,即使再不可思議,也一定是真相”(出自柯南道爾的《四簽名》一書)。

對(duì)某些人而言,編程和調(diào)試是一回事。編程就是逐步調(diào)試程序直到它滿足要求為止。這其中的理念是,總是從一個(gè)實(shí)現(xiàn)部分功能、可以工作的程序開始,然后加以小的改進(jìn)并隨手調(diào)試通過,這樣保證總是有一個(gè)可用的程序。

比如Linux,它是個(gè)包含成千上萬行代碼的操作系統(tǒng),最開始卻是Linus Torvalds為探索Intel 80386芯片的功能而開發(fā)的一個(gè)簡(jiǎn)單程序。據(jù)Larry Greenfield所說,“Linus Torvalds早期有個(gè)項(xiàng)目,是交替打印AAAA和BBBB的程序,這個(gè)程序后來發(fā)展為了Linux”(出自The Linux Users' Guide Beta版1)。

后續(xù)章節(jié)會(huì)有更多有關(guān)調(diào)試和其他編程實(shí)踐的建議。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)