選單

程式設計師為什麼要知道編譯系統是如何工作的

• 最佳化程式效能。現代編譯器都是成熟的工具,通常可以生成很好的程式碼。作為程式設計師,我 們無需為了寫出高效程式碼而去了解編譯器的內部工作。但是,為了在 C 程式中做出好的編 碼選擇,我們確實需要了解一些機器程式碼以及編譯器將不同的 C 語句轉化為機器程式碼的方 式。例如,一個 switch 語句是否總是比一系列的 if-then-else 語句高效得多?一個 函式呼叫的開銷有多大? while 迴圈比 for 迴圈更有效嗎?指標引用比陣列索引更有效 嗎?為什麼將迴圈求和的結果放到一個本地變數中,與將其放到一個透過引用傳遞過來的 引數中相比,執行速度要快很多呢?為什麼我們只是簡單地重新排列一下一個算術表示式 中的括號就能讓一個函式執行得更快?

• 理解連結時出現的錯誤。根據我們的經驗,一些最令人困擾的程式錯誤往往都與連結器操 作有關,尤其是當你試圖構建大型的軟體系統時。例如,連結器報告它無法解析一個引 用,這是什麼意思?靜態變數和全域性變數的區別是什麼?如果你在不同的 C 檔案中定義了 名字相同的兩個全域性變數會發生什麼?靜態庫和動態庫的區別是什麼?我們在命令列上排 列庫的順序有什麼影響?最嚴重的是,為什麼有些連結錯誤直到執行時才會出現?

• 避免安全漏洞。多年來,緩衝區溢位錯誤是造成大多數網路和 Internet 伺服器上安全漏洞 的主要原因。存在這些錯誤是因為很少有人能理解限制他們從不受信任的站點接收資料 的數量和格式的重要性。學習安全程式設計的第一步就是理解資料和控制資訊儲存在程式棧 上的方式會引起的後果。