閱讀723 返回首頁    go 阿裏雲 go 技術社區[雲棲]


c語言 王者歸來

C語言發展簡史

 【起源】 語言最早的原型是 ALGOL 60 1963 年,劍橋大學將其發展成為 CPL(Combined Programing Language)。 1967 年,劍橋大學的 Matin Richards 對 CPL 語言進行了簡化,產生了 BCPL 語言。 1970 年,美國貝爾實驗室(Bell Labs)的 Ken Thompson 將 BCPL 進行了修改,並取名叫做 語言,意思是提取 CPL 的精華(Boiling CPL down to its basic good features)。並用 語言寫了第一個 UNIX 係統。 1973 年,AT&T 貝爾實驗室的 Dennis Ritchie(D.M.RITCHIE) 在 BCPL 和 語言的基礎上設計出了一種新的語言,取 BCPL 中的第二個字母為名,這就是大名鼎鼎的 語言。隨後不久,UNIX 的內核(Kernel) 和應用程序全部用 語言改寫,從此,語言成為 UNIX 環境下使用最廣泛的主流編程語言。 

K&R C】 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了《The C Programming Language》的第一版(按照慣例,經典著作一定有簡稱,該著作簡稱為 K&R),書末的參考指南 (Reference Manual) 一節給出了當時 語言的完整定義,成為那時 語言事實上的標準,人們稱之為 K&R C。從這一年以後,語言被移植到了各種機型上,並受到了廣泛的支持,使 語言在當時的軟件開發中幾乎一統天下。 

C89 (ANSI C)】 隨著 語言在多個領域的推廣、應用,一些新的特性不斷被各種編譯器實現並添加進來。於是,建立一個新的“無歧義、於具體平台無關的 語言定義” 成為越來越重要的事情。1983 年,ASC X3(ANSI 屬下專門負責信息技術標準化的機構,現已改名為 INCITS)成立了一個專門的技術委員會 J11(J11 是委員會編號,全稱是 X3J11),負責起草關於 語言的標準草案。1989 年,草案被 ANSI 正式通過成為美國國家標準,被稱為 C89 標準。 

C90 (ISO C)】 隨後,《The C Programming Language》第二版開始出版發行,書中內容根據 ANSI C(C89)進行了更新。1990 年,在 ISO/IEC JTC1/SC22/WG14 (ISO/IEC 聯合技術第 委員會第 22 分委員會第 14 工作組的努力下,ISO 批準了 ANSI C 成為國際標準。於是 ISO C(又稱為 C90) 誕生了。除了標準文檔在印刷編排上的某些細節不同外,ISO C(C90) 和 ANSI C(C89) 在技術上完全一樣。 

C95】 之後,ISO 在 19941996 年 分別出版了 C90 的技術勘誤文檔,更正了一些印刷錯誤,並在1995 年通過了一份 C90 的技術補充,對 C90 進行了微小的擴充,經過擴充後的 ISO C 被稱為 C95。 

C99】 1999 年,ANSI 和 ISO 又通過了最新版本的 語言標準和技術勘誤文檔,該標準被稱為 C99 。這基本上是目前關於 語言的最新、最權威的定義了。 

    現在,各種 編譯器都提供了 C89(C90) 的完整支持,對 C99 還隻提供了部分支持,還有一部分提供了對某些 K&R C 風格的支持。 

 

/////////////////////////////////////////////////////

C語言的發展史

Dennis M. RitchieTjy平坦軟件園

Bell Labs/Lucent TechnologiesTjy平坦軟件園

Murray Hill, NJ 07974 USATjy平坦軟件園

dmr@bell-labs.com 

概要

C語言作為最初的Unix操作係統的係統實現語言,在1970年早期誕生。它以無類型的B語言為基礎,形成了一個類型結構;它在小型機上被發明,作為一個工具,以改進貧乏的編程環境。在今天,它已經成為一種占統治地位的語言。本文研究它的發展。 Tjy平坦軟件園

簡介

版權提示:版權所有1993計算機協會公司。此電子版由作者授權發表。有關出版事宜,請聯係ACM或作者。本文被用於一九九三年四月,在馬薩諸塞州劍橋的第二次編程語言曆史會議上的演講。 Tjy平坦軟件園

之後被收錄進會議記錄:編程語言曆史,第二版。Thomas J. Bergin, Jr. and Richard G. Gibson, Jr. ACM Press (New York) and Addison-Wesley (Reading, Mass), 1996; ISBN 0-201-89502-1. 

本文是關於C程序設計語言的發展、它所受到的影響以及它誕生的條件。為簡潔起見,我略過了對C本身完整的描述、它的起源B[Johnson 73]及更上一代BCPL[Richards 79],相反集中關注每一種語言的典型特性,以及他們如何發展變化。 Tjy平坦軟件園

C1969——1973年間與Unix操作係統同時誕生;最富創造性的時期是1972年。另一次大的變化發生在19771979年間,當Unix係統的可移植性得到證明時。在後一段時期的中間,這個語言的第一個被廣為傳播的描述出現了:C程序設計語言,常常被稱為白皮書或K&R[Kernighan 78]。最後,在1980年代中期,它被ANSI X3J11委員會正式標準化,作了進一步修改。直到1980年代早期,盡管編譯器已在多種機器結構及操作係統上出現,這個語言幾乎與Unix特別密切關聯;更近一些,它的使用傳播得更廣,並且在今天它幾乎是計算機行業被使用最多的語言。 Tjy平坦軟件園

曆史:環境

貝爾電話實驗室的計算機係統研究在1960代年晚期是亂糟糟的[Ritchie 78] [Ritchie 84]。貝爾電話實驗室公司正從他和麻省理工學院、通用電氣公司的合作項目Multics[Organick 78]撤離。到1969年,貝爾實驗室管理層和研究人員認為,Multics項目不能按期完成並且代價高昂。在GE-645 Multics機器被撤走之前,Ken Thompson領導一個非正式小組,開始一些其它的研究。 Tjy平坦軟件園

Thompson希望按自己的設計,使用一切有效的方式,創造一個適當的計算環境。他的計劃,回想起來是清晰的。組合Multics中的許多創新特征,包括一個作為控製場所的進程的清晰概念、一個樹結構文件係統、一個作為用戶級程序的命令解釋器、文本文件的簡單表示和訪問設備的通用化。他們排除其餘特性,比如對內存和文件的統一訪問。開始,他與我們其餘人推遲了Multics中的另一個先鋒性(但非原創)特征,即隻使用高級語言來編寫。我對Multics實現所用的語言PL/I,並無興趣,但我們還使用其他語言,包括BCPL,我們對於不能利用匯編之上的高級語言進行編程的優點,比如容易編寫、易於理解,感到遺憾。當時我們並未特別注重可移植性;到後來才有了這方麵的興趣。 Tjy平坦軟件園

Thompson麵臨的是那個時代古怪和難纏的硬件:DEC PDP-7,他在1968年開始使用時,隻有8K容量的16位內存,並且沒有可用的軟件。當時他希望使用高級語言,但還是用PDP-7匯編編寫了最初的Unix係統。開始,他並未在PDP-7上編碼,相反使用一套GE-635機器上,用於GEMAP匯編器的宏。一個後期處理器生成PDP-7可讀的紙帶。 Tjy平坦軟件園

這些紙帶從GE機器傳送到PDP-7進行測試,直到一個原始的Unix內核、一個編輯器、一個匯編器、一個簡單的shell(命令解析器),和其它工具(像Unix rm, cat, cp命令)被完成。此後,這個操作係統可以自我支撐:可以編寫、測試程序勿需借助紙帶,並且程序開發可以在PDP-7上繼續進行。 Tjy平坦軟件園

ThompsonPDP-7匯編器在簡明性上甚至優於DEC的;它對表達式求值並得到對應的數據位。沒有庫、裝載器或鏈接器:程序的全部源文件被送給匯編器,輸出文件——有一個固定名字——產生後被直接執行(這個名字,a.out,解釋了一點Unix的淵源;它是匯編器的輸出。甚至在係統有了鏈接器和顯式指定另一個名字的方式之後,它仍被保留作為編譯的默認可執行文件)。 Tjy平坦軟件園

Unix首次在PDP-7運行後不久,Doug McIlroy1969年創造了新係統的第一個新語言:一個McClureTMG[McClure 65]實現。TMG是一種編寫編譯器(更普通來說,TransMoGrifiers)的語言,通過在一個混合過程元素,上下文無關的語法標記的自頂而下,遞歸降解的風格。McIlroyBob Morris使用TMGMultics編寫了早期的PL/I編譯器。 Tjy平坦軟件園

為了挑戰McIlroy重新生成TMG的技巧,Thmopson決定Unix——當時可能還沒有取這個名字——需要一種係統編程語言。在很快用Fortran嚐試一番後,相反,他創造了一種他自己的語言,他命名為BB可以認為是沒有類型的C。更準確,它是被擠進了8K字節內存,經過Thompson大腦過濾的BCPL。它的名字最有可能表示BCPL的縮寫,盡管另一種理論認為它繼承自Bon[Thompson 69],一個ThompsonMultics的那些日子創造的不相關的語言。Bon可能是以他妻子Bonnie的名字,或者(根據它的手冊中的一個encyclopedia引用)以一種具有咕隆咕隆發音的神奇儀式的宗教命名的。 Tjy平坦軟件園

起源:語言

BCPLMartin Richards1960年代中期在訪問麻省理工學院時設計,在1970年代早期被用在幾個有趣的項目中,其中包括牛津大學的OS6操作係統[Stoy 72],和施樂公司PARC研究中心創造性的Alto上的部分工作[Thacker 79]。因為Richards工作過的麻省理工學院的CTSS係統[Corbato 62]被用於Multics開發,我們也熟悉該語言。最初的BCPL編譯器被Rudd Canaday和貝爾實驗室的一些人們遷移到MulticsGE-635 GECOS係統[Canaday 69];在Multics的生命在貝爾實驗室的最後痛苦掙紮中,它很快成了那些以後參與Unix的人們選擇的語言。 Tjy平坦軟件園

BCPL, BC全都嚴格符合以FortranAlgol 60代表的傳統過程類型語言。它們都麵向係統編程、小、定義簡潔,以及可被簡單編譯器翻譯。它們接近機器,它們引入的抽象以傳統計算機提供的具體數據類型和操作為基礎,它們依賴於輸入輸出庫例程,與操作係統的其它交互。盡管並未成功,它們還使用庫程序指定其他有趣的控製結構,如協程和過程關閉。同時,它們的抽象層次足夠高,足夠用心的話,能達到機器間的可移植性。 Tjy平坦軟件園

BCPL, BC在語法上差異眾多,粗略地說,它們是相似的。程序由全局聲明和函數(過程)聲明組成。BCPL中的過程能夠嵌套,但不能引用包含過程中的非靜態對象。BC避免了這個限製,通過強加一個更嚴格限製:完全沒有嵌套過程。每一種語言(除了早期版本B)都認可分離編譯,以及提供了包含指定文件文本的方式。 Tjy平坦軟件園

BCPL中的幾個語法和詞法機製是優雅和常見的,甚於BC中的那些。例如,BCPL的過程和數據聲明有更一致的結構,並且它提供了一套更完整的循環構造。盡管BCPL程序在概念上是由未被間隔的字符流,聰明的規則允許語句後的行分界處的大多數分號被忽略。BC忽略了這種便利,並以分號來結束大多數語句。不管這些差異,BCPL的大多數語句和操作符直接對應BC中的相應語句和操作符。 Tjy平坦軟件園

BCPLB之間的一些結構化的差異源於介質存儲的限製。比如,BCPL聲明采用這樣的形式 Tjy平坦軟件園

    let P1 be command    and P2 be command    and P3 be command     ...此處的命令表示的程序文本包含完整過程。關聯的子聲明同時出現,所以名字P3guochengP1內可見。相似地,BCPL能在一個求得一個值的表達式裏包含一組聲明和語句,例如 Tjy平坦軟件園

    E1 := valof ( declarations ; commands ; resultis E2 ) + 1BCPL編譯器可以容易地處理此類構造,在產生輸出前,通過存儲和分析內存中一個完整程序解析過的表示。B編譯器的存儲限製要求一個一步技術,通過它盡可能快生成輸出,語法上的重新設計,令這種可能邁進了C。 Tjy平坦軟件園

BCPL中一些不令人滿意的地方歸因於它的技術問題,在B的設計中它們被有意識的避免了。例如,BCPL使用一個“全局向量”(global vector)機製以在分離編譯的程序間通信。在這種模式中,程序員使用一個全局向量的數值偏移量,顯式關聯每個外部可見過程和數據對象的名字。鏈接使用這些數值偏移量,在被編譯過的代碼上完成。B起初堅持,整個程序一次性全部傳遞給編譯器,來規避這個麻煩。B的後期實現,和C的全部實現,使用一個傳統的鏈接器,來解決出現在分離編譯文件中的外部名字,而不是把指定偏移量的負擔推給程序員。 Tjy平坦軟件園

BCPLB的轉換中引入的其它變化,大概是因為風格的緣故,一些仍是有爭議的,例如賦值使用單個字符=代替:=。類似地,B使用/**/來括起注釋,而B使用//注釋直至行末的文本。這顯然是從PL/I繼承來的。(C++重新啟用了BCPL的注釋慣例。) Fortran影響了聲明的語法:B的聲明以一個auto, static這樣的類型指定符開始,跟著一列名字,C不僅遵循這種風格,還把它的類型關鍵字,加入這種聲明的開始處。 Tjy平坦軟件園

Richards的書中文檔化的BCPLB之間的差別,並非都是經過深思熟慮的;我們是從一個BCPL[Richards 79]的早期版本開始工作的。例如,用於跳離switchon語句的endcase在我們1960年代開始學習該語言時,並沒有出現,所以BC中重複出現的,用於跳離switch語句的關鍵字break,乃是一種背離的發展,而不是清醒的改變。 Tjy平坦軟件園

對比B產生過程中發生的普遍的語法變化,BCPL的核心語義內容——類型結構和表達式求值——保持不變。它們兩種語言都是無類型的,或更恰當地說有一種單一的數據類型,“字”(word)或“單元”(cell),一個固定長度的位模式。這些語言中的內存由此類單元的線形數組組成,每一個單元的內容的含義與應用的運算相關。例如,求和運算符使用機器的整數加法指令,簡單相加其運算對象,其它算術運算同樣不清楚它們運算對象的含義。因為內存是一個線形數組,隻可能解析單元的值為該數組的索引,並且BCPL為這個目的提供一個運算符。在最初的語言中,它被拚寫為rv,後來為!,但是B使用一元*。因此,如果p是單元,包含另一個單元的索引(其地址,或指向的指針),*p引用被指向單元的內容,作為表達式的值或賦值對象。 Tjy平坦軟件園

因為指針在BCPLB中隻不過是整型內存數組的索引,對它們進行算術運算是有意義的:如果p是一個單元的地址,那麼p+1是下一個單元的地址。這種約定是兩種語言中數組語義的基礎。在BCPL中,一個人這樣寫 Tjy平坦軟件園

    let V = vec 10或在B中, Tjy平坦軟件園

    auto V[10];效果是一樣的:分配了一個名字為V的單元,然後保留另一組10個連續單元,它們中第一個的內村索引,被存放在V中。按照一般的規則,在B中的表達式 Tjy平坦軟件園

    *(V+i)Vi相加,並指向V後第i個位置。BCPLB都增加了特別的符號,使這種對數組的訪問更簡潔;在B中的等價表達式是 Tjy平坦軟件園

    V[i]BCPL中是 Tjy平坦軟件園

    V!i這種引用數組的方法甚至在當時仍是不常見的;C後來同化它為一種更不常規的方式。 Tjy平坦軟件園

BCPLBC都沒有強烈支持字符數據;每一個都把字符串當作整型數組,並通過一些慣例提供了一些一般規則。字符串字麵值在BCPLB中表示一個使用串內字符初始化的靜態區的地址,被包裝成單元。在BCPL中,第一個被包裝的單元包含串所擁有的字符個數;在B中,沒有此計數,字符串以一個特別的字符終結,在B中杯拚寫為“*e”。這個改變部分是為了避免把計數值放在一個8位或9位槽(slot)產生的串長度限製,部分是因為維護這個計數,從我們的經驗看來,不如使用一個終結符方便。 Tjy平坦軟件園

BCPL,串中每個字符的使用,是通過被展開為另一個數組,一個字符對應一個單元,然後進行再次包裝;B提供了對應的例程,但人們更多地使用,另外的訪問或替換一個串內字符的庫函數。 Tjy平坦軟件園

更多曆史

TMG版本B工作後,Thompson利用B重寫了B(編譯器)(一個bootstrapping步驟)。在開發中,他不斷與內存限製作鬥爭:每次語言版本使編譯器膨脹令內存幾乎不夠使用,但每次重寫利用語言特征的優點,減少了它的尺寸。例如,B引入通用賦值運算符,使用x=+y來把y加入x。這個符號經過McIlroy引自Algol 68[Wijngaarden 75],他將它合並到他實現的一個TMG版本。(在B和早期C,該運算符被拚作=+而不是+=;這個由B的詞法分析的第一種形式的迷惑捷徑導致的錯誤,在1967年被修複。) Tjy平坦軟件園

Thompson通過發明自增++和自減--運算符,走出了更深遠的一步;它們的前綴或後綴位置決定變更是發生在計算運算對象值之前或之後。它們沒有出現在B的最早版本中,而是隨後才出現的。人們經常猜測,它們被創造是為了使用,CUnix在其上首次流行的DEC PDP-11提供的自增和自減地址模式。這在曆史上來說是不可能的,因為B被發明的時候還沒有PDP-11PDP-7有一些“自增”內存單元,使用這種特性,一個間接內存引用通過它們來自增單元。這些特征可能提示Thompson創造了那些自增運算符;他把前綴和後綴一般化。甚至,自增單元沒有被直接用於實現這些運算符,並且這種創新一個更強烈的動機可能是,他發覺++x的翻譯在尺寸上小於x=x+1。 Tjy平坦軟件園

PDP-7上的B編譯器不產生機器指令,而是一個由編譯器輸出組成代碼段地址序列,執行基本運算的解釋模式的threaded代碼[Bell 72]。這些操作——特別對B——典型地運行在一個簡單堆棧機器上。 Tjy平坦軟件園

PDP-7Unix係統上,除了B本身隻有幾個東西是B寫的,因為這個機器太小和太慢,除了試驗而不能做更多事情;完全用B重寫操作係統和其它應用程序,是看起來不可行的代價高昂的動作。Thompson在某些地方,通過提供一個利用換頁解釋器代碼和數據,允許解釋超過8K字節的程序的“虛擬B”編譯器,來釋放地址空間,但它對通用程序來說太慢以致不實用。盡管如此,一些用B寫的工具還是出現了,包括一個早期版本的,Unix用戶熟悉的可變精度計算器dc[McIlroy 79]。我做的最有雄心壯誌的工作,是一個把B翻譯為GE-635機器指令而非threaded 代碼的真正的交叉編譯器。它是一個精巧的絕技:一個用本身語言寫的,生成在一個,在有4k字長用戶地址空間的18位機器上運行的36位大型機代碼,完全的B編譯器。這個項目能實現,僅僅是因為B的簡單性和它的運行時係統。 Tjy平坦軟件園

盡管我們抱有關於實現一個那時,像Fortran, PL/IAlgol 68的主要語言的偶然想法。這樣的項目對我們的顯得絕望的大:需要更簡單和小的工具。所有這些語言都影響我們的工作,但是憑我們自己之力來做這些事情則更有趣。 Tjy平坦軟件園

1970年時,我們看起來能在Unix項目上,獲得一個新的DEC PDP-11。處理器是DEC遞交的第一批產品,三個月後,磁盤才到達。通過threaded技巧,使B程序在其上運行隻需要為運算符重寫代碼段,和一個我用B寫的簡單的匯編器。很快,dc成了在其它操作係統之前,第一個在我們的PDP-11上被測試的有趣的程序。幾乎非常快,但仍需等待磁盤,ThompsonPDP-11匯編語言,重寫了Unix內核和一些基本命令。最早的PDP-11上的Unix把機器上24K內存中的12K給操作係統,一個很小的空間給用戶程序,其餘的作為RAM磁盤。這一版本僅是用於測試,而不是實際的工作;這個機器通過枚舉關閉的,knight的不同尺寸象棋板的路程,來標記時間。在磁盤到達後,我們把匯編語言轉換為PDP-11上的方言,和移植一些B程序,很快移植到它上麵去。 Tjy平坦軟件園

1971年時,我們的微型計算機中心開始有了用戶。我們都希望更容易編寫有趣的軟件。使用匯編顯得沉悶,B不管它的性能問題,已經有了一個小的包含有用服務例程的庫,並且被用於越來越多的新程序。這段時期的最著名的成果,是Steve Johnsonyacc分析——生成器[Johnson 79a]的第一個版本。 Tjy平坦軟件園

B的問題

我們第一次使用BCPL然後是B的機器,是按字尋址的,這些語言的單一數據類型,“單元”,能恰當與硬件機器字互相換算。PDP-11的出現暴露了B的語義模型的一些不足。首先,它從BCPL繼承的幾乎未作改變的字符處理機製是笨拙的:使用庫方法把包裝的字符串展開到單個的單元,然後再次包裝,或者訪問或替換單個字符,在一個麵向字節的機器上,開始變得笨拙,甚至愚蠢。 Tjy平坦軟件園

其次,盡管最初的PDP-11沒有提供浮點算術運算,製造商承諾將很快提供。浮點運算通過定義特別的運算符,被添加到我們的MulticsGCOSB編譯器,但是這種機製僅在相應的機器上才可能,單個字長足夠包含一個浮點數;這在16PDP-11上是不成立的。 Tjy平坦軟件園

最後,BBCPL模型在處理指針時,暗中會做得更多:語言規則,通過定義一個指針作為字數組的索引,強迫指針被表示為字索引。每個指針引用生成一個運行時,從指針到硬件要求的字節地址的度量轉換。 Tjy平坦軟件園

因為這些理由,看起來需要一個類型模式來處理字符和字節尋址,以及為即將到來的浮點硬件作準備。其它問題,特別是類型安全性和接口檢查,看起來並沒有變得像以後那樣重要。 Tjy平坦軟件園

除了語言本身的問題,B編譯器的threaded代碼技術得到的程序,比他們對應的匯編語言版本慢很多,以至我們對用B紀錄操作係統或它的中心工具的可能性打折扣。 Tjy平坦軟件園

1971年時,我開始通過添加一個字符類型,並重寫它的編譯器以生成PDP-11機器指令而非threaded代碼,來擴展B語言。因此從BC的轉換,與創造一個同匯編語言競爭,能產生足夠快和小的程序的編譯器,是同時進行的。我稱這個輕微擴展的語言為NB,表示“新B”(new B)。 Tjy平坦軟件園

C萌芽

NB隻存在了很短時間,以至沒有編寫一個它的完整描述。它提供類型intchar,它們的數組,指向它們的指針,用典型風格聲明如下 Tjy平坦軟件園

    int i, j;    char c, d;    int iarray[10];    int ipoint[];    char carray[10];    char cpoint[];數組的語義與在BBCPL中保持一樣:iarraycarray的聲明產生的單元,被動態初始化為分別指向十個整數和字符序列中的第一個的值。ipointercpointer的聲明省略了尺寸,以表明沒有存儲被自動分配。在過程內部,語言對指針的解釋與數組變量是一樣的:一個指針聲明產生一個單元與數組聲明的區別僅在,程序員被期望給它賦值,而不是讓編譯器分配空間和初始化單元。 Tjy平坦軟件園

值存儲在數組的單元中,指針是按字節計算的,對應存儲區的機器地址。因此通過指針間接引用,不意味著比按比例縮放指針從字到字節的偏移,有更多運行時開銷。另一方麵,對應數組取下標的機器代碼和指針算術依賴於數組和指針的類型:計算iarray[i]ipointer+i表示按比例縮放加數i與所指向對象的尺寸。 Tjy平坦軟件園

這些語義表示一個來自B的容易轉換,我在它們上麵實驗了幾個月。當我嚐試擴展類型符號,特別是添加結構化(紀錄)類型時,問題變得明顯。結構看起來,應該以一種直接的方式影射到機器的內存,但一個結構包含一個數組,沒有合適的地方隱藏包含數組基地址的指針,也沒有方便的方式安排被初始化的對象。例如,早期unix係統的目錄條目,在C可以被描述為 Tjy平坦軟件園

    struct {        int  inumber;        char name[14];    };我希望結構不能僅僅是體現抽象對象的特征,也要描述可能從目錄讀到的位集合。編譯器能在哪裏隱藏指向語義要求的name的指針呢?即使結構被想象的更抽象,指針的空間也能以某種方式隱藏,我如何處理在分配一個,可能是一個結構包含數組再包含結構到任意深度的複雜對象時,完全初始化這些指針的技術問題? Tjy平坦軟件園

這個解決方案形成了一個,在無類型BCPL和類型化C之間進化鏈中的重要飛躍。它移除了指針在內存的具體化。相反促成數組名出現在表達式中時生成指針。C語言的這個規則一直存在至今,就是數組類型的值當出現在表達式中時,被轉換成指向組成數組的對象中的第一個對象的指針。 Tjy平坦軟件園

這個發明使現存的B代碼能繼續工作,不管下層語言語義的改變。僅有幾個程序為了調整它的起點,把新值賦給數組名——在BBCPL中是可能的,在C中無意義——都被很容易修改。更重要的是,新語言保持一致性和對數組有效的(如果並非常見)可解釋性,開辟了通往複雜類型結構的道路。 Tjy平坦軟件園

第二個創新,極力明顯地把C與它的前輩們區分開來,那就是更完整的類型結構,尤其是在聲明語法中的表達式,NB提供基本的類型intchar,它們的數組,指向它們的指針,但沒有更進一步的組合。通用化也被要求:給定一個任意類型對象,描述一個包含它們的新對象,從一個函數求得它,或一個指向它的指針,都是可能的。 Tjy平坦軟件園

對每一個此類複合類對象,已經有了一種討論下層對象的方式:索引數組,調用函數,間接引用指針。類比推理導致了一種名字鏡像聲明語法,名字特征出現的表達式語法,因此, Tjy平坦軟件園

    int i, *pi, **ppi;聲明一個整數,一個指向整數的指針,一個指向指向整數的指針的指針。這些聲明的語法反映i*pi**pi用於表達式時,都得到一個整數類型。類似地, Tjy平坦軟件園

    int f(), *f(), (*f)();聲明一個返回整型值的函數,一個返回整型指針的函數,一個指向返回整型函數的指針; Tjy平坦軟件園

    int *api[10], (*pai)[10];聲明一個整型指針數組,一指向整型數組的指針。在所有這些情況中,一個變量的聲明類似它在表達式中的用法,它的類型是在聲明中,置於開頭的那個。 Tjy平坦軟件園

C語言采用類型組合模式歸功於Algol 68,盡管它或許沒有以Algol追隨者認可的模式出現。我從Algol獲取的主要概念,是一個基於原子類型的類型結構(包括結構),組合為數組,

最後更新:2017-04-02 16:48:17

  上一篇:go 怎樣成為一個優秀的程序員?
  下一篇:go acid