導讀 |
引言: 你知道 NASA 頂級程式設計師如何寫關鍵任務程式碼麼?為了確保代碼更清楚、更安全、且更容易理解,NASA 的噴射推進實驗室制定了 10 項編碼規則。 |
#NASA的開發者工作是程式設計界中最具挑戰性的之一。他們的主要關注是編寫程式碼和開發安全的關鍵任務應用程式。為此,遵守嚴格的編碼規則變得至關重要。這些規則涵蓋了軟體開發的多個方面,包括編碼風格、語言特性的使用等。儘管很難就一個合適的編碼標準達成共識,但NASA的噴射推進實驗室(JPL)遵循著一套名為《十的次方:開發安全的關鍵代碼的規則》的編碼規則。
這些規則主要是為了針對C語言所寫的程式而設立的,因為JPL長期以來一直使用C語言。然而,這些規則也可以輕鬆地應用於其他程式語言。這些編碼規則由JPL的首席科學家Gerard J. Holzmann制定,主要是為了確保安全性。
NASA 的 10 條寫關鍵任務程式碼的規則:
- 限制所有程式碼為極為簡單的控制流結構 — 不用 goto 語句、setjmp 或 longjmp 結構,且不用間接或直接的遞歸呼叫。
- 所有循環必須有一個固定的上限值。必須可以被某個偵測工具靜態證實,該迴圈不能達到預置的迭代上限值。如果該上限值不能被靜態證實,那麼可以認為違反該原則。
- 在初始化後不要使用動態記憶體分配。
- 如果一個語句一行、一個宣告一行的標準格式來參考,那麼函數的長度不應該比超過一張紙。通常這意味著每個函數的程式碼行不能超過 60。
- 程式碼中斷言的密度平均低至每個函數 2 個斷言。斷言被用來偵測那些在實際執行上不可能發生的情況。斷言必須沒有副作用,並且應該定義為布林測試。當一個斷言失敗時,應該執行一個明確的恢復動作,例如,把錯誤情況傳回給執行該斷言失敗的函數呼叫者。對於靜態工具來說,任何能被靜態工具證實其永遠不會失敗或永遠不能觸發的斷言違反了該規則(例如,通過增加無用的assert(true)語句是不可能滿足這個規則的)。
- 必須在最小的範圍內宣告資料物件。
- 非 void 函數的回傳值在每次函數呼叫時都必須檢查,且在每個函數內其參數的有效性必須進行檢查。
- 預處理器的使用僅限制於包含頭檔和簡單的巨集定義。符號拼接、可變參數清單(省略號)和遞歸巨集呼叫都是不允許的。所有的巨集必須能夠擴展為完整的語法單元。條件編譯指令的使用通常是晦澀的,但也不總是能夠避免。這意味著即使在一個大型的軟體開發中超過一兩個條件編譯指令也要有充足的理由,這超出了避免多次包含頭檔的標準做法。每次在程式碼中這樣做的時候必須有基於工具的檢查器進行標記,並有充足的理由。
- 應該限制指標的使用。特別是不應該有超過一級的解除指標引用。解除指標參考操作不可以隱含在巨集定義或型別聲明中。還有,不允許使用函數指標。
- 從開發的第一天起,必須在編譯器開啟最高等級警告選項的條件下對程式碼進行編譯。在此設定之下,程式碼必須零警告編譯通過。程式碼必須利用原始碼靜態分析工具每天至少檢查一次或更多次,且零警告通過。
關於這些規則,NASA 是這麼評價的:
這些規則就像汽車中的安全帶一樣,剛開始你可能感到有一點不適,但是一段時間後就會養成習慣,你會無法想像不使用它們的日子。
作者簡介:
Adarsh Verma 是 Fossbytes 的共同創辦人,他是一位令人尊敬的企業家,他一直對開源、技術突破和完全保持密切關注。可以透過郵件聯絡他 — [email protected]
以上是成為頂尖程式設計師的十項指南,幫助你寫類似NASA的程式碼!的詳細內容。更多資訊請關注PHP中文網其他相關文章!