編譯器的效率包括兩個方面:執行效率(**的執行速度)和編譯效率(產生可執行**的速度),執行效率起決定性作用;
ken thompson在pdp-11上重新用組合語言實現了unix,dr創立了能夠同時解決多種資料型別和效率的「new b」語言(c),採用編譯模式而不是解釋模式,並引入型別系統,每個變數在使用前必須先宣告。
c語言增加型別系統的主要目的是幫助編譯器設計者區分新型pdp-11所擁有的不同資料型別(單精度、雙精度浮點數、字元等);
由於設計哲學,c語言排斥強型別(隱式轉換,陣列可以越界,幾乎沒有任何執行期的型別檢查,允許在不同型別的物件間賦值);
c語言有著許多為了方便編譯器設計者而建立的規則:
陣列下標從0開始而不是從1開始。——偏移量的概念在編譯器設計者心中根深蒂固。
基本資料型別直接與底層硬體相對應。——不存在內建的複數型別。
作為擺設的auto關鍵字。——這個關鍵字只對建立符號表入口的編譯器設計者有意義,變數的預設修飾符,表示其作用域為當前函式或**段,在進入該變數作用域的時候自動進行記憶體分配,對應於static。
陣列名等同於指標。
float被自動擴充套件為double。——只是在早期而已,現在的ansi c不再如此。其與pdp-11中浮點數的硬體表示方式有關。
不允許巢狀函式。——簡化了編譯器的設計。
register關鍵字。——簡化編譯器的設計,編譯器只需要將其修飾的變數存放到暫存器即可。
and so on。
c語言對直接由硬體支援的底層操作的強調,帶來了極高的效率和移植性,幫組unix獲得了巨大的成功。
c語言最初並沒有定義i/o,而是由庫函式提供,可移植的i/o最早出現在2023年左右,但實踐表明,其效能低於預期值,經過優化與剪裁,後來成為了標準的i/o函式庫。
c預處理器的3個主要功能:
字串替換。——通常用於為常量提供乙個符號名。
標頭檔案包含(bcpl中首創)。——一般性的宣告被分離到頭檔案,並可以被許多原始檔使用。
通用**模板的擴充套件。——巨集在連續幾個呼叫中所接收的引數的型別可以不同。
總之,對於巨集這樣的預處理器,只應該適量使用。最好只用於命名常量,並為一些適當的結構提供簡潔的記法。
2023年,pcc這個可移植的c編譯器,形成了整整一代c編譯器的基礎。同年,k&r c 誕生。
microsoft為ibm pc製作的c編譯器,引入了幾個新的關鍵字(far,near等)幫助指標處理x86晶元不規則的架構,但是其最終還是未被納入以unix為中心的相對謹慎的ansi c標準。標準認為不應該通過修改語言來處理某個特定平台所存在的限制。
2023年12月,c語言標準草案最終被ansi接納(c89),隨後,iso在刪除了「rationale」一節後也接納了ansi c標準。2023年,ansi重新採納了iso c,取代原先的版本。標準c應該是iso c。
ansi c標準的用於描述某種編譯器的特定幾個術語。
由編譯器定義的(implementation-defined)——在不同的編譯器中所採取的行為可能並不相同。
未確定的(unspecified)——在某些正確情況下的做法,標準並未明確規定應該怎樣做。
未定義的(undefined)——在某些不正確情況下的做法(資料溢位),標準並未規定應該怎樣做。
約束條件(a constraint)——乙個必須遵守的限制或要求。
嚴格遵循標準的(strictly-conforming)——只使用已確定的特性;不突破任何由編譯器實現的限制;不產生任何依賴由編譯器定義的或未確定的或未定義的特性的輸出。
遵循標準的(conforming)——可以依賴一些某種編譯器特有的不可移植的特性。
非常不同很重要的區別。——函式原型(prototype)。函式原型使得編譯器很容易根據函式的定義來檢查函式的用法。
增加了一些新的關鍵字。——ansi 增加的enum,const,volatile,signed,void。
「安靜的改變」。——原先的語言特性仍然合法,但其意思有了一些輕微的改變。
除去上面的所有區別。——三字母詞(trigraph)。
k&r c採用無符號保留(unsigned preserving)原則——當乙個無符號型別與int或更小的型別混合使用時,結果型別是無符號型別。
ansi c採用值保留(value preserving)原則——當幾個整型運算元混合使用時,結果型別取決於運算元的型別的相對大小。
ansi c標準引入了pragma指示符,這個指示符**於ada。
1.34中#pragma的彩蛋。
穿越時空 縱橫天下
帶著倉庫到大明 方醒穿了,帶著兩個倉庫穿了!別人穿越是帶著王霸之氣,方醒卻是只想種田!我只想在這個時代悠閒的活著!坐擁嬌妻美妾,順便教幾個 努力讓他們往上爬,好給自己當靠山!漢鄉我們接受了祖先的遺產,這讓中華輝煌了數千年,我們是如此的心安理得,從未想過要回歸那個在刀耕火種中苦苦尋找出路的時代。反哺我...
C高階篇(穿越時空的迷霧)
c的產生源於乙個失敗的專案,由通用電氣公司 麻省理工學院與貝爾實驗室聯合創立的乙個龐大的專案 multics工程。雖然開發小組最終勉強的讓mulitics動了起來,但是他們還是陷入了泥淖,心灰意冷的貝爾實驗室專家們撤離該工程後,去尋找其他任務。其中一位名叫ken thompson的研究人員對另乙個作...
Chapter01簡單工廠模式
一 uml類圖 物件導向程式設計時,在整理物件之間關係時,用uml類圖梳理,會更加清晰。簡單工廠模式,利用乙個工廠來生產不同型別的物件,達到服務層 根據需求更改時,客戶端 介面不用進行修改。客戶端可直接建立自己新增的需求物件並進行操作。由於比較簡單,見 很容易理解,故不做贅述。定義基礎操作類 ifn...