首頁 >後端開發 >C++ >C 和 C 的歷史。第一部分:C語言的產生與標準化。帶類的 C 變為 C

C 和 C 的歷史。第一部分:C語言的產生與標準化。帶類的 C 變為 C

Linda Hamilton
Linda Hamilton原創
2024-11-25 10:36:10201瀏覽

C 和 C 是編寫大量程式碼的標誌性語言。他們經歷了什麼道路才成為一體?本文介紹了 C 的出現及其正式標準化的開始。此外,您還將了解 C with Classes 及其最終轉變為 C 。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

1969 — 1973 C生於世

1969。阿波羅 11 號訪問月球。 AT&T 貝爾實驗室開發了一種我們今天熟知的 C 語言。此時,Unix 作業系統正處於早期開發階段。

事實上,C 語言繼承了 B 語言的主要功能。以及它名字的由來。至於Unix,最初是用組合語言實現的,甚至沒有高階語言的編譯器。該專案的開發歸因於C語言創建的原因之一。

1971 年,C 語言的編譯器和一些實用程式被包含在 Unix 的第二個版本中。 1973 年,Unix 核心主要是用 C 寫的。

1978. 這本書成為第一個規範

Dennis Ritchie 和 Brian Kernighan 於 1978 年 2 月 22 日出版了第一版《C 程式語言》。這本書是第一本廣泛使用的 C 語言材料。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

圖N1 - 《C 程式語言》第一版的封面

從發佈到第一個官方語言認證,它已經成為 C 開發的標準。這個「標準」被稱為 K&R——以作者姓氏的第一個字母命名。

本書介紹了「Hello World」程式作為最小工作程序的範例。 1978 年之後,幾乎所有有關程式語言的書籍都離不開這個程式碼範例。如今,將“Hello World”作為您的第一個程式顯示已成為既定的傳統。

#include <stdio.h>

main()
{
    printf("Hello, World\n");
}

K&R 展示了多種語言特性。例如,結構體 - 一組多個變數分組在一個名稱下以便於引用,以及 long intunsigned 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. C 與類

1979 年 5 月,貝爾實驗室員工 Bjarne Stroustrup 開始開發一個系統,該系統將成為第一個 Unix 叢集。換句話說,他開始創建一個分散式運算系統,連接到由多台電腦組成的公共網路。

問題是缺乏合適的工具包。在現有的程式語言中,有兩種​​選擇可以幫助解決這個問題,但兩者都有細微差別。 BCPL 語言速度很快,但不適合大型項目,因為它非常接近低階語言。另一方面,物件導向的程式語言 Simula 適合這項任務,但速度相當慢。因此 Stroustrup 開始實現他自己的基於 C 的語言。

早在 1979 年 10 月,向 C 增加類別的 CPRE 預處理器就準備好了。這種語言稱為 C with Classes。人們可以編寫程式碼並將其傳遞給預處理器。然而,它仍然被認為是 C 的擴展。

除了類別之外,帶有類別的 C 的第一個版本還包括:

  • 衍生類,但還沒有虛函數;
  • 存取控制;
  • 建構子與析構函式;
  • 朋友班;
  • 函數參數類型的控制和轉換。

1983.ANSI C

語言越來越受歡迎:

  • C 開始取代 Basic 成為微型電腦程式設計的主導語言;
  • 新的編譯器出現了。更重要的是,它們是由沒有直接參與語言開發的人編寫的。

但即使有這樣的人氣,C也只有K&R的不言而喻的水準。編譯器的開發人員對該語言引入了許多非標準的變更。這就是程式碼可移植性問題開始升溫的時候。鑑於這一系列問題,第一個 C 標準開始出現。

1983年,美國國家標準協會(ANSI)成立了一個委員會來起草該規範。標準化程序直到 1989 年才結束,當時該語言的第一個標準被批准為「ANSI X3.159-1989:程式語言 C」。同年,《C 程式語言》一書的第二版出版,描述了標準中出現的語言。在一年的時間裡,該標準經過微小修改就獲得了國際標準化組織(ISO)的批准。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

圖N2 - 《C 程式語言》第二版的封面

除了自 K&R 以來語言發生的一些變化之外,該標準還包括全新的功能,例如函數原型和更複雜的預處理器。該標準還包括對標準庫組成的描述。此外,一些之前沒有定義的手段被給出了更精確的定義。

1983.C 與課程C

1982 年,Bjarne Stroustrup 開始致力於改變 C with Classes 的狀態,其創作者稱之為「中等成功」。從那時起,開發編譯器花了一年的時間。 Cfront 於 1983 年問世。

它的主要功能是將帶有類別的 C 語言轉換為 C 程式碼。之後,轉換後的程式碼被傳遞給C編譯器。此功能使更多人能夠使用該編譯器,並在現有的 Unix 基礎設施上使用它。

隨著語言的發展,它的名稱發生了多次變化。它最初被稱為 C84,因為社區簡稱它為 C。然而,這個名稱也具有誤導性,因為它更像是一個新的 C 標準,而不是該語言的子集。而這其實並沒有幫助解決以前名字的問題。最終語言被稱為 C ,即 C 和增量運算子。

從有類別的 C 遷移到 C 時,語言中出現了其他新功能:

  • 虛函數;
  • 函數名稱和運算子重載;
  • 參考文獻;
  • 常數;
  • 改進的類型檢查;
  • 使用者控制的自由儲存記憶體控制。

至今仍在使用的註釋風格在語言發展的這個階段紮根。該樣式也用於其他語言。

這就是C在沒有正式認證之前的生活。 Stroustrup 相當迅速地回應了程式設計師社群的請求。他正在出版代表該語言標準描述的作品。所以,該語言得以維持主要歸功於其創作者的努力。

1985 年。 「C 程式語言」。

1985 年 2 月,C 的第一個可發行版本發布。同年 10 月,語言創始人 Bjarne Stroustrup 發布了第一版《C 程式語言》一書。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

圖N3 - 《C 程式語言》第一版的封面

它就像 Kernighan 和 Ritchey 的書《C 程式語言》一樣成為 C 語言的第一個預設標準。直到第一個官方標準。

在書中,Stroustrup 從 C 角度涵蓋了語言特性和設計問題,並用大量程式碼範例為每一點增添了趣味。

此後,這本書又重印了三次,每次都有語言更新。在撰寫本文時,最新的第 4 版包含 C 11 標準。

1989.C 2.0

1989年7月,Cfront 2.0編譯器發布。它與之前的版本相比有了很大的修改,也為C語言帶來了新意。

此時,模板已成為熱門話題。沒有人懷疑它們會被實施,因為這是一個現實的目標。至於另一個潛在的突出特性——多重繼承——對程式設計社群的創建者來說是一個真正的挑戰。許多人說在 C 實現多重繼承是不可能的。例如,在 Simula 中,由於垃圾收集器不可避免的複雜性,類似的建議被拒絕。然而,多重繼承是非常需要的,因為它會大大簡化函式庫的開發,如果沒有多重繼承,函式庫的程式碼會變得相當麻煩。

所以,Cfront 2.0 終究還是加入了多重繼承。這種語言的加入引發了爭議。例如,有些人認為,物件導向程式設計的縮影 Smalltalk 語言不具有多重繼承。這就是為什麼C當然不應該採用它。語言的創造者認為這種反應是因為過度重視多重繼承而造成的。

上面的C版本也介紹了:

  • 指向成員的指針,允許建立指向非靜態欄位和函數的指針;
  • 靜態和const成員函數;
  • 存取修飾符受保護;
  • 類型安全連結;
  • 抽象類別;
  • 新建刪除特定於類別;

1990. 博蘭C

1990 年,Borland 發布了 Borland C 整合開發環境,用於開發 C 和 C 程式(真是一個轉折,哈?)。它最初是為了在 DOS 下開發,但後來也引入了 Windows 支援。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

圖 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 整合開發環境。

1990. 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 歷史:

  • Bjarne Stroustrup 關於 C 語言如何創建的書;
  • C 98是第一個官方標準;
  • C99—C 繼續前進;
  • 技術報告1-紙上的新C特性;
  • Viva64 版本,稍後 — PVS-Studio;
  • C 記錄已取得的成就(C99、C11),C 獲得動力(C 11、C 17);
  • C 20 和 C 23。

以上是C 和 C 的歷史。第一部分:C語言的產生與標準化。帶類的 C 變為 C的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn