編譯和除錯的區別
編譯和除錯都是寫程式的重要環節。它們兩者有什麼區別呢?下面,小編跟大家分享一下。
1.
編譯是編譯器在你程式沒有執行的時候幫你檢查錯誤。
除錯是你用偵錯程式在程式執行以後,根據執行狀況來檢查錯誤。
這兩者的不可逆的,首先得編譯通過,你才能除錯啊,編譯正確後,會生成exe檔案,IDE中啟動程式,可以進行除錯。
編譯是把原始碼變成二進位制obj的過程***連結後成為可執行檔案***,當然會先幫你檢查有無簡單的語法問題,要不編譯器人家不認識,你自己說的有無邏輯就和編譯器無關了。
除錯首先需要生成二進位制程式碼,所以需要首先進行編譯和連結,然後到斷點後,偵錯程式會幫你加int 3中斷,就停住了。
編譯關注語法錯誤,除錯關注邏輯錯誤。也就是說編譯關注的是syntax***語法***方面的問題,調式關注的是semantics***語義***方面的問題。
2.編譯詞法分析
詞法分析的任務是對由字元組成的單詞進行處理,從左至右逐個字元地對源程式進行掃描,產生一個個的單詞符號,把作為字串的源程式改造成為單詞符號串的中間程式。執行詞法分析的程式稱為詞法分析程式或掃描器。
源程式中的單詞符號經掃描器分析,一般產生二元式:單詞種別;單詞自身的值。單詞種別通常用整數編碼,如果一個種別只含一個單詞符號,那麼對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那麼,對於它的每個單詞符號,除了給出種別編碼以外,還應給出自身的值。
詞法分析器一般來說有兩種方法構造:手工構造和自動生成。手工構造可使用狀態圖進行工作,自動生成使用確定的有限自動機來實現。
3.編譯語法分析
編譯程式的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表示式、賦值、迴圈等,最後看是否構成一個符合要求的程式,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程式是最終的一個語法單位。編譯程式的語法規則可用上下文無關文法來刻畫。
語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧裡,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
4.程式碼優化
程式碼優化是指對程式進行多種等價變換,使得從變換後的程式出發,能生成更有效的目的碼。所謂等價,是指不改變程式的執行結果。所謂有效,主要指目的碼執行時間較短,以及佔用的儲存空間較小。這種變換稱為優化。
有兩類優化:一類是對語法分析後的中間程式碼進行優化,它不依賴於具體的計算機;另一類是在生成目的碼時進行的,它在很大程度上依賴於具體的計算機。對於前一類優化,根據它所涉及的程式範圍可分為區域性優化、迴圈優化和全域性優化三個不同的級別。
4.編譯出錯處理
如果編譯過程中發現源程式有錯誤,編譯程式應報告錯誤的性質和錯誤的發生的地點,並且將錯誤所造成的影響限制在儘可能小的範圍內,使得源程式的其餘部分能繼續被編譯下去,有些編譯程式還能自動糾正錯誤,這些工作由錯誤處理程式完成。
需要注意的是,一般上編譯器只做語法檢查和最簡單的語義檢查,而不檢查程式的邏輯。邏輯錯誤要通過除錯。
小編總結:
看完了上面的比較,你現在還能區別編譯與除錯嗎?其實,只要記住這句話:“編譯關注語法錯誤,除錯關注邏輯錯誤,先有編譯,後有除錯”,就不會忘了兩者的區別了。