C編程語言(程式語言)

出自KMU Wiki

跳轉到: 導航, 搜索

C 通用, 塊被構造, 程式, 1972 年 必要的 電腦編程語言被開發由 丹尼斯・Ritchie 在 響鈴電話實驗室 至於使用以 Unix 作業系統。[ 2 ] 它有從傳播對許多其它平臺。雖然C 被設計了作為 系統實現語言,[ 3 ][ 4 ] 它廣泛也被應用為 應用。C 很大地並且影響了許多其它普遍的語言,[ 5 ] 特別是 C++, 最初被設計作為一個引伸對C 。


目錄

[編輯] 哲學

C 是 必要的 (程式) 系統實現語言。它的設計目標是使它被編寫使用一個相對地直接的 編譯器, 提供對記憶的低級通入, 提供高效率地映射對機器指令的語言構造, 並且要求最小的 執行時間的支持。C 是因此有用的為以前被編碼了用彙編語言 的許多應用。

儘管它的低級能力, 語言被設計鼓勵 與機器無關 編程。一個符合標準和 portably 書面C 程式可能被編寫為電腦平臺和作業系統非常廣品種以對它的原始代碼的最小的變動。語言變得可利用在非常大範圍平臺, 從嵌入微型控制器對巨型電腦。


[編輯] 特徵

像多數必要的語言在 ALGOL 傳統, C 有設施為 結構化編程 和允許 詞彙易變的範圍 和 遞歸, 當靜態 型系統 防止許多不願意的操作。用C, 所有可執行的代碼包含在 作用之內。作用 參量 價值總通過。通過由參考由明確地通過達到用C 尖 價值。異種聚集資料類型(struct) 允許相關資料元素被結合和被操作作為單位。C 程式源文本是自由格式, 使用分號作為聲明終止者(不是符號) 。


C 並且陳列以下更加具體的特徵:

非nestable 作用定義, 雖然可變物也許掩藏在被築巢的塊
部份地 弱類型化; 例如, 字符可能被使用作為整數
對電腦存儲器的 低級通入 由轉換機器地址成被鍵入的 尖
作用尖考慮到關閉和執行時間的多形性的 一個 基本 形式
排列 分度法作為一個次要概念, 被定義根據尖算術
一臺 前處理器 為 宏定義、 原代碼文件包括, 和條件編輯
複雜功能譬如 I/O、 串 操作, 和數學函數一致地委派了對 庫例行程式
大約30 個後備的 主題詞
句法分歧從 ALGOL, 經常以下主角C 的前輩 B, 例如使用
{ ... } 而不是 ALGOL' s begin ... end
相等標誌為任務(複製), 很像 FORTRAN
二個連貫相等標誌測試對於平等(與用 .EQ. FORTRAN 或 相等標誌比較用 BASIC)
&& 並且 || 在 ALGOL' s 位置 and 和 or,
是語法上分明從 bit-wise 操作員 & 和 | (由B 使用 為兩個意思)
從未評估正確的操作數如果結果可能是堅定的從左邊單獨(短路求值)
很大數量的複合操作員, 譬如 += ++, 等。


[編輯] 歷史

[編輯] 早期的發展
C 的最初的發展發生了在 AT&T 響鈴實驗室 在1969 年和1973 年之間; 根據Ritchie, 1972 年最創造性的期間發生了。這被命名了"C" 因為許多它的特點從一種更加早期的語言被獲得了叫做"B", 根據 肯湯普森 是被剝離在BCPL 編程語言下的 版本。


C 的起源被栓嚴密對Unix 作業系統的 發展, 最初被實施用彙編語言在 PDP-7 由Ritchie 和湯普森, 合併幾個想法從同事。他們最終決定端起作業系統對 PDP-11。B 的缺乏功能利用一些PDP-11's 特點, 著名地 位元組 可尋址能力, 導致了C 編程語言的一個早期的版本的發展。

Unix 系統的原始的PDP-11 版本被開發了用彙編語言。在1973 年以前, 增加 struct 型, 大多數Unix 仁被重寫用C 的 C 語言 變得足夠強有力。這是第一作業系統仁的當中一個被實施在語言除彙編之外。(更加早期的事例包括 Multics 系統(被寫在 PL/I), 1961 年和MCP (主要控制程式) 為 Burroughs B5000 被寫 用ALGOL 。)


[編輯] K&R C
1978 年, 布賴恩・Kernighan 和 丹尼斯・Ritchie 出版了C 編程語言的 初版。這本書, 對C 程式員已知作為"K&R", 服務許多年作為語言的 一個 不拘形式的規格。它描述C 的版本共同地指"K&R C" 。書套的再版最新C89 ANSI C 標準。

K&R 介紹了幾語言特色:

標準I/O 圖書館
long int 資料類型
unsigned int 資料類型
複合任務操作員 =操作 被改變到 操作= 取消語義二義性由修建創造 i=-10, 被解釋了依照 i =- 10 代替可能意欲 i = -10
在1989 的出版物C 標準, 為了許多歲月K&R C 以後仍然被認為"低公分母" 對哪位C 程式員制約了自己當最大輕便渴望了, 因為許多更舊的編譯器在使用中仍然是, 並且因為仔細地書面K&R C 代碼可能是法律標準C 。

在C 的早期的版本, 唯一退回非整數價值的作用需要被宣稱如果使用在作用定義之前; 作用被使用沒有任一個早先聲明被承擔退回整數, 如果它的價值被使用了。

例如:

長的內部SomeFunction(); / * 內部OtherFunction(); *// * 內部*/CallingFunction() {長的內部test1; 記數器/* 內部*/test2; test1 = SomeFunction(); 如果(test1 > 0) test2 = 0; test2 = OtherFunction(); 回歸test2; }

所有以上被評論的 int 聲明能被省去在K&R C 。

因為K&R 作用聲明沒有包括關於作用論據的任何資訊, 作用參量 類型檢查 未執行, 雖然一些編譯器會發布一個報警資訊如果一個地方作用叫以論據的錯誤號碼, 或如果倍數電話對一個外在作用使用了不同的數字或類型論據。分開的工具譬如Unix 的 的棉絨公共事業被發展了(尤其) 能檢查作用用途一貫性橫跨多個源文件。

在歲月跟隨K&R C 的出版物, 幾個非官方的特點增加了來語言, 由編譯器支持從AT&T 和其它販賣者。這些有了:

void 作用
作用返回 struct 或 union 類型(而不是尖)
任務 為 struct 資料類型
被列舉的型
很大數量的引伸和缺乏關於一個標準 圖書館的協議, 與語言大眾化和事實一起不Unix 編譯器精確地實施了K&R 規格, 導致標準化必要。


[編輯] ANSI C 和ISO C
在70 年代晚期期間和, C 的版本80 年代被實施了為各種各樣的 主機, 微型電腦, 和 微型電腦, 包括 IBM 個人電腦, 因為它的大眾化開始極大增加。

1983 年, 美國國家標準局 (ANSI) 組成委員會, X3J11, 建立C 的一個標準規格。1989 年, 標準被批准了作為ANSI X3.159-1989 "編程的C 語言。" 這個語言的版本經常指 ANSI C、標準C, 或有時C89 。

1990 年, ANSI C 標準(以幾較小修改) 由國際標準化組織 採取了 (ISO) 作為ISO/IEC 9899:1990 。這個版本有時稱C90 。所以, 期限"C89" 和"C90" 根本上提到同樣語言。

C 標準化過程的當中一個目標將導致K&R C 超集, 合併許多非官方的特點隨後被介紹。但是, 標準委員會並且包括幾個新特點, 譬如 作用原型 (從C++ 被借用), void 尖、支持對於國際 字符集 和 地點, 和前處理器改進。句法為參量聲明並且被增添包括C++ 樣式:

內部main(int argc, 炭灰** argv) {...}

雖然K&R 接口

內部main(argc, argv) 內部argc; 炭灰** argv; {...}

繼續被允許, 為兼容性以現有的原始代碼。

C89 由當前的C 編譯器支持, 並且多數C 代碼現今被寫根據它。任一個節目被寫只用標準C 和沒有任何硬體依賴假定正確地將運行在任一個 平臺 以一致的C 實施, 在它的資源極限內。沒有這樣防備措施, 節目也許編寫只在某一平臺或與一個特殊編譯器, 適當, 例如, 對對非標準圖書館的用途, 譬如 GUI 圖書館, 或對信賴在編譯器或platform-specific 屬性譬如資料類型和位元組endianness 的確切的大小 。

在代碼必須是compilable 由或標準一致或K&R 基於C 的編譯器處, __STDC__ 宏指令可能使用分裂代碼成標準和K&R 部分利用特點可利用只用標準C 。

  1. ifdef __ STDC __ 外面內部getopt(int 、炭灰* const *, const 炭灰*); # 外面內部getopt(); # endif

在上述例子, 定義了的編譯器 __STDC__ 宏指令(依照由C 標準託管) 只解釋線跟隨 ifdef 命令。在其他, 不定義宏指令的非標準編譯器, 只有線跟隨 else 命令被解釋。


[編輯] C99
注: C99 並且是一個C 編譯器的名字為 德洲儀器TI-99/4.A 家庭電腦。除是之外C 編譯器, 它是否則無關的。
在ANSI 標準化過程以後, C 語言規格依然是有一段時間了相對地靜態, 但是 C++ 繼續演變, 主要在它自己的標準化努力期間。1995 年基準校正1 創造了一個新標準為C 語言, 但只改正C89 的一些細節標準和增加更加廣泛的支持對於國際字符集。但是, 標準進行了進一步修正在90 年代晚期, 在1999 年導致ISO/IEC 9899:1999 的出版物。這個標準共同地指"C99 。" 它被採取了作為一個ANSI 標準在2000 年5月。國際C 標準由 工作團體ISO/IEC JTC1/SC22 維護/WG14 。


[編輯] 新特點
C99 介紹了幾個新特點, 許多已經被實施作為引伸在幾個編譯器:

軸向作用
易變的 聲明不再被制約歸檔範圍或一個複合聲明的開始
幾種新 資料類型, 包括 long long int, 任意延長的整數類型、一種明確 布爾 資料類型, 和 complex 型代表 複雜形勢
variable-length 列陣
支持對於一線評論起點與 //, 和在 BCPL 或C++
新圖書館職能, 譬如 snprintf
新 主文件, 譬如 stdbool.h 和 inttypes.h
類型普通算術作用(tgmath.h)
改善的支持對於 IEEE 浮點
選定的initializers
複合印刷錯誤
支持對於 variadic 宏指令 (易變的arity 宏指令 )
restrict 資格允許更加進取的代碼 優化

[編輯] 向上兼容性與C90
C99 是很大程度上upward-compatible 與C90, 但是更加嚴密的在一些方面; 特別是, 缺乏型指定成分的聲明含蓄地 int 不再假設。C 標準委員會決定, 它有價值使編譯器診斷型指定成分的疏忽遺漏比沈默地處理依靠含蓄的遺產代碼 int。實踐上, 編譯器可能診斷遺漏而且承擔 int 和持續翻譯節目。


[編輯] 支持由主要編譯器
GCC 和其它C 編譯器現在支持許多C99 新特點。但是, 有是主要集中於 C++ 的較少 支持 從販賣者譬如微軟和Borland, 因為C++ 提供相似的功能改善。

GCC, 儘管它廣泛的C99 支持, 仍然不是完全地服從的實施; 幾個主要特點是缺掉或正確地不運作。[ 6 ]

根據 Sun Microsystems, 自由地 是下載的) 的太陽演播室(現在支持充分的C99 標準。[ 7 ]


[編輯] 版本偵查
一個標準宏指令 __STDC_VERSION__ 被定義以價值 199901L 表明, C99 支持是可利用的。和以 __STDC__ 宏指令為C90, __STDC_VERSION__ 能被使用寫不同地將編寫為C90 和C99 編譯器的代碼, 和在保證那是可利用的 inline 無論如何的這個例子。

  1. 如果__ STDC_VERSION __ > = 199901L/* "線型" 是主題詞*/# # 定義線型/* □什麼*/# endif


[編輯] 未來標準方向
從1999 的批准C 標準, 標準工作團體準備了技術報告指定改善的支持為嵌入處理, 另外的字符資料類型(Unicode 支持), 和圖書館職能以改善的 區域檢查。工作繼續在技術報告演講小數 浮點、另外的數學 特別作用, 和另外的 動態記憶體分配 作用。C 和C++ 標準委員會合作在穿線的 編程的 規格。

2007 年自, 工作開始了預期C 標準的其它修正, 不拘形式地叫做"C1x" 。C 標準委員會採取了應該限制新特點收養由現有的實施未測試的指南。

它是可能的, 標準 gets 作用, 正式地被貶抑以回應一個瑕疵報告關於它不安全的接口設計, 不會被指定在C 標準的下個修正。


[編輯] 用途

C 的主要用途是為"系統編程", 包括實施 作業系統 和 嵌入 系統應用, 由於中意的特徵的組合譬如代碼輕便和效率、能力訪問具體硬體地址, 能力 "雙關語" 類型對比賽外在地強加的資料存取要求, 和低 執行時間的 需求在系統資源。


C 廣泛並且被應用實施 終端用戶 應用, 雖然如同應用變得大那發展被轉移到其他, 更高級語言。

C 的寬採納和效率的一後果是, 其它更高級語言編譯器、圖書館, 和口譯員經常被實施用C 。

C 被使用作為一個 中間語言 由更高級語言的一些實施, 翻譯輸入語言對C 原始代碼, 或許與其它對象表示法一起。C 原始代碼由C 編譯器編寫導致目標代碼。這種方法也許使用獲取輕便(C 編譯器為幾乎所有平臺存在) 或為便利(它避免必須發展有關個別機器的編碼發生器) 。使用C 這個方式的一些編程語言是 Eiffel、 Esterel、 開局、 格拉斯哥Haskell 編譯器, Lisp 方言、 醉漢、 Sather, 吱吱聲, 和 Vala。

不幸地, C 被設計了作為一個編程語言, 不是作為編譯器目標語, 和是因而比理想至於使用作為一個中間語言。這導致了基於C 的中間語言的發展譬如 C --。



[編輯] 句法

不同於語言譬如 FORTRAN 77, C 原始代碼是 允許對whitespace 的任意用途格式化代碼的自由形式, 而不是基於專欄的或基於文本線的制約。評論也許出現或者在符號之間 /* 和 */, 或(在C99) 隨後而來 // 直到線的末端。


各個源文件包含聲明和作用定義。作用定義, 反之, 包含聲明和聲明。聲明或定義新型使用主題詞譬如 struct union, 和 enum, 或分配型對和或許預留新可變物的存貯, 通常由寫型被易變的名字跟隨。主題詞譬如 char 和 int 指定固定型。代碼的部分被附寄在 括號 ({ 和 }) 限制範圍聲明和作為一個唯一聲明為控制結構。

作為一種必要的語言, C 使用 聲明 指定行動。最共同的聲明是 表示聲明, 包括表示被分號評估, 跟隨; 作為評估的一個副作用, 作用也許 叫 並且可變物也許 被賦予 新價值。修改聲明的正常順序執行, C 提供幾控制流動聲明由後備的主題詞辨認。 結構化編程 由( if-)else有條件施行支持和 do-while while, 和 for 重申施行(使成環) 。 for 聲明有分開的初始化, 測試, 和再預裝表示, 任何或可能被省去。 break 並且 continue 可能使用留下最內在的附寄的圈聲明或跳對它的再預裝。有並且分支 goto 直接地對選定的標籤在作用之內的一個non-structured 聲明。 switch 選擇a case 被執行根據了整數表示的價值。

表示使用各種各樣的固定操作員(參見下面) 並且也許包含作用電話。操作數對多數操作員, 並且論據對作用, 被評估的命令是非特指的; 評估也許甚而被插頁。但是, 所有副作用(包括存貯對可變物) 將發生在下"序列點之前"; 序列點包括各個表示聲明和詞條的末端對和從各個作用電話返回。這比需要的為其它編程語言允許高度目標代碼優化由編譯器, 但要求C 程式員施加更多關心獲得可靠的結果。


資料引用:[1]