編譯和調(diào)試的區(qū)別
編譯和調(diào)試的區(qū)別
編譯和調(diào)試都是寫程序的重要環(huán)節(jié)。它們兩者有什么區(qū)別呢?下面,學(xué)習(xí)啦小編跟大家分享一下編譯和調(diào)試的區(qū)別。
1.編譯和調(diào)試的區(qū)別
編譯是編譯器在你程序沒有運(yùn)行的時候幫你檢查錯誤。
調(diào)試是你用調(diào)試器在程序運(yùn)行以后,根據(jù)運(yùn)行狀況來檢查錯誤。
這兩者的不可逆的,首先得編譯通過,你才能調(diào)試啊,編譯正確后,會生成exe文件,IDE中啟動程序,可以進(jìn)行調(diào)試。
編譯是把源代碼變成二進(jìn)制obj的過程(鏈接后成為可執(zhí)行文件),當(dāng)然會先幫你檢查有無簡單的語法問題,要不編譯器人家不認(rèn)識,你自己說的有無邏輯就和編譯器無關(guān)了。
調(diào)試首先需要生成二進(jìn)制代碼,所以需要首先進(jìn)行編譯和鏈接,然后到斷點(diǎn)后,調(diào)試器會幫你加int 3中斷,就停住了。
編譯關(guān)注語法錯誤,調(diào)試關(guān)注邏輯錯誤。也就是說編譯關(guān)注的是syntax(語法)方面的問題,調(diào)式關(guān)注的是semantics(語義)方面的問題。
2.編譯詞法分析
詞法分析的任務(wù)是對由字符組成的單詞進(jìn)行處理,從左至右逐個字符地對源程序進(jìn)行掃描,產(chǎn)生一個個的單詞符號,把作為字符串的源程序改造成為單詞符號串的中間程序。執(zhí)行詞法分析的程序稱為詞法分析程序或掃描器。
源程序中的單詞符號經(jīng)掃描器分析,一般產(chǎn)生二元式:單詞種別;單詞自身的值。單詞種別通常用整數(shù)編碼,如果一個種別只含一個單詞符號,那么對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那么,對于它的每個單詞符號,除了給出種別編碼以外,還應(yīng)給出自身的值。
詞法分析器一般來說有兩種方法構(gòu)造:手工構(gòu)造和自動生成。手工構(gòu)造可使用狀態(tài)圖進(jìn)行工作,自動生成使用確定的有限自動機(jī)來實(shí)現(xiàn)。
3.編譯語法分析
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規(guī)則的語法單位,如表達(dá)式、賦值、循環(huán)等,最后看是否構(gòu)成一個符合要求的程序,按該語言使用的語法規(guī)則分析檢查每條語句是否有正確的邏輯結(jié)構(gòu),程序是最終的一個語法單位。編譯程序的語法規(guī)則可用上下文無關(guān)文法來刻畫。
語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發(fā),向下推導(dǎo),推出句子。而自下而上分析法采用的是移進(jìn)歸約法,基本思想是:用一個寄存符號的先進(jìn)后出棧,把輸入符號一個一個地移進(jìn)棧里,當(dāng)棧頂形成某個產(chǎn)生式的一個候選式時,即把棧頂?shù)倪@一部分歸約成該產(chǎn)生式的左鄰符號。
4.代碼優(yōu)化
代碼優(yōu)化是指對程序進(jìn)行多種等價變換,使得從變換后的程序出發(fā),能生成更有效的目標(biāo)代碼。所謂等價,是指不改變程序的運(yùn)行結(jié)果。所謂有效,主要指目標(biāo)代碼運(yùn)行時間較短,以及占用的存儲空間較小。這種變換稱為優(yōu)化。
有兩類優(yōu)化:一類是對語法分析后的中間代碼進(jìn)行優(yōu)化,它不依賴于具體的計算機(jī);另一類是在生成目標(biāo)代碼時進(jìn)行的,它在很大程度上依賴于具體的計算機(jī)。對于前一類優(yōu)化,根據(jù)它所涉及的程序范圍可分為局部優(yōu)化、循環(huán)優(yōu)化和全局優(yōu)化三個不同的級別。
4.編譯出錯處理
如果編譯過程中發(fā)現(xiàn)源程序有錯誤,編譯程序應(yīng)報告錯誤的性質(zhì)和錯誤的發(fā)生的地點(diǎn),并且將錯誤所造成的影響限制在盡可能小的范圍內(nèi),使得源程序的其余部分能繼續(xù)被編譯下去,有些編譯程序還能自動糾正錯誤,這些工作由錯誤處理程序完成。
需要注意的是,一般上編譯器只做語法檢查和最簡單的語義檢查,而不檢查程序的邏輯。邏輯錯誤要通過調(diào)試。
小編總結(jié):
看完了上面的比較,你現(xiàn)在還能區(qū)別編譯與調(diào)試嗎?其實(shí),只要記住這句話:“編譯關(guān)注語法錯誤,調(diào)試關(guān)注邏輯錯誤,先有編譯,后有調(diào)試”,就不會忘了兩者的區(qū)別了。