官术网_书友最值得收藏!

1.1 類型的作用

C語言解決了B語言[1]存在的一個嚴重的問題——類型問題。最初B語言是按字長取址,其運行機器也比較簡單,那時候語言的唯一數據類型稱為word或者cell。當時還沒有類型的概念,只是存儲數據的一個單位罷了。直到PDP-11計算機的出現暴露了B語言模型的不足之處。

首先,它不適合處理單字節。需要將字節打包到cell上,而且讀寫時涉及重組這些cell;其次,PDP-11計算機支持浮點運算,B語言為了支持浮點運算引入特殊的操作符,而這些操作符是硬件相關的;最后是B語言對指針處理有額外的開銷,指針作為數組的索引,需要運行時調整數組的下標才能被硬件所接受。從這些問題里可以看出類型系統的重要性,它可以讓編譯器生成正確指令以及對應數據的存儲方式。

后來類型系統的重要性更多體現在類型安全、類型檢查上。類型不僅能夠給數據賦予意義,還能充當接口,對行為進行約束。做一個讓大量的猴子編寫程序的思想實驗[2],每個猴子每次隨機敲下鍵盤的按鍵,然后編譯、運行。

如果這些猴子采用的是機器語言,那么每個字節的組合都可能被圖靈機[3]解釋并執行,只不過這樣的執行結果將毫無意義。而高級語言(例如C++語言)有自己的詞法、語法規則,輸入的字節組合能夠被編譯器檢查,那么憑借這樣的功能在運行前能攔住很多無意義的字節組合,最終可運行的程序或多或少都有意義[4]。例如定義了一個“人”的類型,那么其對象在運行過程中不會變成狗,也不會飛。

這里的類型檢查就能阻止很多無意義的程序[2]。與動態類型語言相比,在運行時所檢查出的因類型而引發的錯誤都能夠在編譯時發現,這能節省很多程序調試的時間。軟件開發過程中往往涉及重構,這些重構可以在保證功能不變的情況下,使得軟件的可維護性更好。靜態類型語言在重構后能及時發現類型錯誤,例如通過重構函數的形參類型,在編譯時便能找出所有調用者,從而避免了遺漏。有些觀點是在動態類型語言中通過添加大量測試來避免了因為類型問題而導致的錯誤,而測試本身往往是非確定性的,是個證偽的過程。當然僅通過類型系統是不可能完全保證程序的正確性的,但至少在一定程度上保證程序的正確性。

主站蜘蛛池模板: 基隆市| 临泉县| 定兴县| 青岛市| 吉林省| 全南县| 壶关县| 威宁| 定南县| 金秀| 松滋市| 文昌市| 临汾市| 鄂温| 柳州市| 庄浪县| 琼结县| 屏东县| 左云县| 天全县| 滦南县| 赤壁市| 平和县| 南靖县| 东兴市| 东乡族自治县| 房产| 蛟河市| 璧山县| 剑川县| 拜泉县| 尼勒克县| 石柱| 沐川县| 盐城市| 石景山区| 贵德县| 绍兴市| 丰都县| 滕州市| 沈丘县|