C 和 C 是編寫大量程式碼的標誌性語言。他們經歷了什麼道路才成為一體?本文介紹了 C 的出現及其正式標準化的開始。此外,您還將了解 C with Classes 及其最終轉變為 C 。
1969。阿波羅 11 號訪問月球。 AT&T 貝爾實驗室開發了一種我們今天熟知的 C 語言。此時,Unix 作業系統正處於早期開發階段。
事實上,C 語言繼承了 B 語言的主要功能。以及它名字的由來。至於Unix,最初是用組合語言實現的,甚至沒有高階語言的編譯器。該專案的開發歸因於C語言創建的原因之一。
1971 年,C 語言的編譯器和一些實用程式被包含在 Unix 的第二個版本中。 1973 年,Unix 核心主要是用 C 寫的。
Dennis Ritchie 和 Brian Kernighan 於 1978 年 2 月 22 日出版了第一版《C 程式語言》。這本書是第一本廣泛使用的 C 語言材料。
圖N1 - 《C 程式語言》第一版的封面
從發佈到第一個官方語言認證,它已經成為 C 開發的標準。這個「標準」被稱為 K&R——以作者姓氏的第一個字母命名。
本書介紹了「Hello World」程式作為最小工作程序的範例。 1978 年之後,幾乎所有有關程式語言的書籍都離不開這個程式碼範例。如今,將“Hello World”作為您的第一個程式顯示已成為既定的傳統。
#include <stdio.h> main() { printf("Hello, World\n"); }
K&R 展示了多種語言特性。例如,結構體 - 一組多個變數分組在一個名稱下以便於引用,以及 long int 和 unsigned int 資料型別。
帶有賦值的加法/減法運算子在 K&R C 中也發生了變化。以前,要將數值加一,必須編寫 a = 1,但這類運算子會讓 C 編譯器感到困惑。此外,從人類的角度來看,a = 1(加一)和a = 1(賦值)之間的差異看起來相當脆弱。正是在K&R C,這些算子變成了我們熟悉的算子-a = 1.
書中的程式碼範例採用統一的風格設計,也以創建者姓氏的首字母命名。 K&R 風格以使用八個空格作為主要縮排而聞名(儘管更常用的是四個空格)。它也被稱為“核心風格”,因為 Unix 核心就是用這種風格編寫的。
#include <stdio.h> main() { printf("Hello, World\n"); }
1979 年 5 月,貝爾實驗室員工 Bjarne Stroustrup 開始開發一個系統,該系統將成為第一個 Unix 叢集。換句話說,他開始創建一個分散式運算系統,連接到由多台電腦組成的公共網路。
問題是缺乏合適的工具包。在現有的程式語言中,有兩種選擇可以幫助解決這個問題,但兩者都有細微差別。 BCPL 語言速度很快,但不適合大型項目,因為它非常接近低階語言。另一方面,物件導向的程式語言 Simula 適合這項任務,但速度相當慢。因此 Stroustrup 開始實現他自己的基於 C 的語言。
早在 1979 年 10 月,向 C 增加類別的 CPRE 預處理器就準備好了。這種語言稱為 C with Classes。人們可以編寫程式碼並將其傳遞給預處理器。然而,它仍然被認為是 C 的擴展。
除了類別之外,帶有類別的 C 的第一個版本還包括:
語言越來越受歡迎:
但即使有這樣的人氣,C也只有K&R的不言而喻的水準。編譯器的開發人員對該語言引入了許多非標準的變更。這就是程式碼可移植性問題開始升溫的時候。鑑於這一系列問題,第一個 C 標準開始出現。
1983年,美國國家標準協會(ANSI)成立了一個委員會來起草該規範。標準化程序直到 1989 年才結束,當時該語言的第一個標準被批准為「ANSI X3.159-1989:程式語言 C」。同年,《C 程式語言》一書的第二版出版,描述了標準中出現的語言。在一年的時間裡,該標準經過微小修改就獲得了國際標準化組織(ISO)的批准。
圖N2 - 《C 程式語言》第二版的封面
除了自 K&R 以來語言發生的一些變化之外,該標準還包括全新的功能,例如函數原型和更複雜的預處理器。該標準還包括對標準庫組成的描述。此外,一些之前沒有定義的手段被給出了更精確的定義。
1982 年,Bjarne Stroustrup 開始致力於改變 C with Classes 的狀態,其創作者稱之為「中等成功」。從那時起,開發編譯器花了一年的時間。 Cfront 於 1983 年問世。
它的主要功能是將帶有類別的 C 語言轉換為 C 程式碼。之後,轉換後的程式碼被傳遞給C編譯器。此功能使更多人能夠使用該編譯器,並在現有的 Unix 基礎設施上使用它。
隨著語言的發展,它的名稱發生了多次變化。它最初被稱為 C84,因為社區簡稱它為 C。然而,這個名稱也具有誤導性,因為它更像是一個新的 C 標準,而不是該語言的子集。而這其實並沒有幫助解決以前名字的問題。最終語言被稱為 C ,即 C 和增量運算子。
從有類別的 C 遷移到 C 時,語言中出現了其他新功能:
至今仍在使用的註釋風格在語言發展的這個階段紮根。該樣式也用於其他語言。
這就是C在沒有正式認證之前的生活。 Stroustrup 相當迅速地回應了程式設計師社群的請求。他正在出版代表該語言標準描述的作品。所以,該語言得以維持主要歸功於其創作者的努力。
1985 年 2 月,C 的第一個可發行版本發布。同年 10 月,語言創始人 Bjarne Stroustrup 發布了第一版《C 程式語言》一書。
圖N3 - 《C 程式語言》第一版的封面
它就像 Kernighan 和 Ritchey 的書《C 程式語言》一樣成為 C 語言的第一個預設標準。直到第一個官方標準。
在書中,Stroustrup 從 C 角度涵蓋了語言特性和設計問題,並用大量程式碼範例為每一點增添了趣味。
此後,這本書又重印了三次,每次都有語言更新。在撰寫本文時,最新的第 4 版包含 C 11 標準。
1989年7月,Cfront 2.0編譯器發布。它與之前的版本相比有了很大的修改,也為C語言帶來了新意。
此時,模板已成為熱門話題。沒有人懷疑它們會被實施,因為這是一個現實的目標。至於另一個潛在的突出特性——多重繼承——對程式設計社群的創建者來說是一個真正的挑戰。許多人說在 C 實現多重繼承是不可能的。例如,在 Simula 中,由於垃圾收集器不可避免的複雜性,類似的建議被拒絕。然而,多重繼承是非常需要的,因為它會大大簡化函式庫的開發,如果沒有多重繼承,函式庫的程式碼會變得相當麻煩。
所以,Cfront 2.0 終究還是加入了多重繼承。這種語言的加入引發了爭議。例如,有些人認為,物件導向程式設計的縮影 Smalltalk 語言不具有多重繼承。這就是為什麼C當然不應該採用它。語言的創造者認為這種反應是因為過度重視多重繼承而造成的。
上面的C版本也介紹了:
1990 年,Borland 發布了 Borland C 整合開發環境,用於開發 C 和 C 程式(真是一個轉折,哈?)。它最初是為了在 DOS 下開發,但後來也引入了 Windows 支援。
圖 N4 - Borland C 的螢幕截圖
從歷史上看,Borland C 是 Turbo C 的後代,但融合了 C 的特點——支援物件導向程式設計。
每個版本的環境都有自己的編譯器支援自己的標準。隨著時間的推移,Borland C 獲得了許多用於快速應用程式開發的專用程式庫。
Borland C IDE 的最後一個版本於 1997 年發布,之後被 Borland C Builder 系列所取代。 Borland C 的終結是在 2000 年,隨著帶有編譯器的 Borland C 5.5 的發布。
Borland C 是一個非常舒適的 DOS 編輯器。甚至還有某種語法著色。
PVS-Studio分析器C和C核心架構師Yuri Minaev
Borland 四年後,微軟發布了 Visual C 整合開發環境。
1986 年,Bjarne Stroustrup 寫了一篇文章《什麼是物件導向程式設計? 》其中他指出了 C 的三個缺陷:
多重繼承於 1989 年隨 C 2.0 引入,其餘缺陷於 1990 年透過新的語言功能修復。 Stroustrup 在《Annotated C Reference Manual》一書中對它們進行了描述。
模板和異常處理很快就相繼出現。模板於 7 月在西雅圖獲得批准,異常處理機制於 11 月在帕洛阿爾托獲得批准。它們的發布之所以接近,是因為這兩項創新都解決了類似的問題。根據語言創建者本人的說法,模板可讓您透過擴展靜態類型系統的功能來減少程式執行期間的錯誤數量。而異常允許您處理剩餘的錯誤。
參數化類型早在 C 的第一版就被考慮過。然而,由於缺乏時間對設計和實施問題進行充分研究,它們不得不推遲。出於同樣的原因,例外情況也被推遲。這並不是毫無意義的。他們的設計從1984年持續到1989年。
《帶註釋的 C 參考手冊》也介紹了命名空間以及運行時識別類型的能力。
通用程式設計從那時開始獲得動力。使用模板的 C 並不是先驅。在創建模板時,創建者從 ML、CLU 和 Ada 程式語言中汲取靈感。
但是,可以肯定地說,C 語言正在推廣這種範式。在許多情況下,模板使得無需巨集即可編寫程式碼成為可能,從而減少了搬起石頭砸自己腳的機會。美中不足的是,只有 C 20 才出現了簡化泛型程式設計工作的完整操作功能。但即便如此,當程式設計師了解到模板可以在編譯階段啟用計算時,他們並沒有停下來...
另一方面,C 的異常並不是那麼明確。不幸的是,與早期的方法相比,他們並沒有解決所有的錯誤處理問題。使用異常時,控制流變得非常重要。有很多方法會搬起石頭砸自己的腳,例如私有繼承異常、按值捕獲異常、或以錯誤的順序排列 catch 區塊等。因此,一些編碼標準禁止使用它們,例如 Google C 代碼風格。
Philipp Khandelyants,PVS-Studio C 和 C 開發團隊的團隊負責人
《帶註釋的 C 參考手冊》在某種程度上已成為官方 C 標準化的先驅。它描述了所有很快就會成為該語言標準的創新。
在這篇文章中,我們介紹了從 1969 年到 1990 年 C 和 C 的歷史事件。在下一篇文章中,我們將深入研究從 1991 年到現在的 C 歷史:
以上是C 和 C 的歷史。第一部分:C語言的產生與標準化。帶類的 C 變為 C的詳細內容。更多資訊請關注PHP中文網其他相關文章!