奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

作者 | Michael McMillan

譯者 | 彎月,責編 | 夕顏

封圖 | CSDN下載自視覺中國

出品 | CSDN(ID:CSDNnews)

眾所周知的標誌代碼塊起始和結尾的大括號是什麼時候開始成為編程語言的一部分的呢?或者更重要的是,代碼塊何時成了編程結構的重要組成部分?

我希望通過本文回答這些問題。

無代碼塊的語言

熟悉C語言語法風格的程序員都對編程塊很熟悉。C、C++、Java、JavaScript以及許多其他語言中,所有主要編程結構都是代碼塊。換句話說,這些編程結構都被放到了代碼塊中,而代碼塊的標誌就是起始和結尾的大括號。

嚴格來說這並不完全正確,例如if語句和循環這兩種結構,如果其主體部分只包含一條語句,那麼可以不使用代碼塊。但是,在過去幾年,編程風格的專家們都建議所有編程結構的主體都應該放在代碼塊中(參見Douglas Cockroft的《JavaScript語言精粹》一書,其中的解釋更具說服力)。

但是,第一個高級編程語言並沒有代碼塊。

我以上世紀五十年代時的FORTRAN語言為例說明。高德納在他那篇針對早期高級語言的評論《The Early Development of Programming Languages》(該文章在他的書《Selected Papers on Computer Languages》一書中重印)中比較了幾個早期編程語言的特性。他的比較方法是演示某段程序用幾種語言怎樣編寫。這段程序實現了一個叫做TPK的算法,我們來看看用現代的JavaScript怎樣編寫:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

你不必在意這段程序的功能。這裡的重點是,這段程序展示了高德納認為的現代編程語言中的所有重要特性。

我前面說過,高德納使用該算法比較了幾種編程語言,其中一種語言就是現在人們公認的第一個真正的高級語言。下面是高德納編寫的用Fortran語言實現的TPK算法:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

我不想詳細介紹Fortran的語法,但你可以很清晰地看到,該語言沒有代碼塊。函數定義在某一行上,而不是定義成了一個塊。DO循環使用行標號來控制循環。當時的高級語言還沒有將組合語句分組成代碼塊的概念,所以這些語言依然需要依賴goto來控制程序流程。

這段代碼是高德納使用1957年的Fortran編寫的。在1957~1960年之間,一種新的語言出現了,那就是ALGOL,它彌補了許多Fortran等高級語言的不足之處。

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

ALGOL中的代碼塊

ALGOL編程語言於1958年首次提出,儘管最流行的版本是Algol 60。Algol語言的特性之一就是能夠將語句分組,變成組合語句,也叫代碼塊。每個Algol程序都可以認為是一個代碼塊,因為程序通常包含一條或多條語句(因此稱為“組合語句”)。Algol的開發者認為,許多編程場景(如條件判斷和循環)都需要將多條語句作為一個整體考慮。

Algol使用關鍵字begin和end表示代碼塊的開始和結束。代碼塊可以嵌套在其他代碼塊中,外部的代碼塊叫做主代碼塊,而內部的代碼塊叫做子代碼塊。例如,下面這段Algol程序就包含嵌套的代碼塊:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

該程序將會按照順序輸出數字2和1。

下面是在Algol的if語句中使用代碼塊的例子:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

下面是在Algol的for語句中使用代碼塊的例子:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

下面來看看使用Algol語言編寫的TPK程序,可以看到,與Fortran相比,代碼塊結構可以讓程序更清晰:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

可以看出,Algol的代碼塊結構讓程序更像我們今天使用的語言。

轉向BCPL

塊結構語言語法的下一個改變就是Martin Richards於1967年在劍橋大學發明的BCPL語言。在1960~1967年間Algol語言開發的初始階段,編譯器開發者和系統開發者一直在尋找一種方法,使用機器語言和彙編語言之外的語言來開發系統程序(如操作系統)。之所以這裡強調BCPL,是因為它發展和精煉後變成了由Ken Thompson發明的B語言,後來又發展成了C語言。

Richards開發的BCPL語言是一種系統語言,它有彙編語言同樣的效率,但語法更像Algol等高級語言,所以編寫程序更容易,效率也更高。這意味著Algol等高級語言的許多特性必須用一種更高效的方式包含在BCPL中。

實現這種高效的方式之一就是將代碼塊的標誌從單詞(begin和end)改成符號。對於組合語句和代碼塊,Richards建議使用符號$(和)$作為開始和結束標記。這些符號稱為“節括號”。

在BCPL中,如果將$(和)$與if語句或循環等結構一起使用,則它們表示一個組合語句。如果$(包含一些定義,則它們表示一個代碼塊。

例如,下面是在BCPL中使用if語句和組合語句的例子:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

下面是BCPL代碼塊的例子:

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

這裡,起始記號表示代碼塊的開始,因為它後面緊跟著聲明。

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

$(和$)變成了C語言中的大括號

在1968年或1969年前後,貝爾實驗室的Ken Thompson和Dennis Ritchie開始使用系統編程語言開發操作系統。實際上,Thompson最初想使用Fortran,但很快就放棄了,因為他發現Fortran無法實現。因此他決定修改BCPL語言來創造一種更合適的系統語言,於是B語言誕生了。

儘管B語言更接近Thompson和Ritchie想要的系統語言,但仍然無法完全滿足要求,於是Ritchie開始開發另一種語言,稱為NB,意思是New B。NB並沒有存活太久,最終被另一種全新的語言代替,這個全新的語言最後被稱為C。如果你對C語言如何從BCPL、B和NB發函而來,我建議你閱讀一下Dennis Ritchie的《History of the C Language》。

許多從B語言中繼承到NB再繼承到C語言中的特性,都經過了Thompson的修改,其中之一就是操作符縮寫。為了將語言放入當時內存十分有限的計算機中,這些修改是必須的。例如,Thompson創造了組合賦值運算符(如+=)和自增(++)和自減(--)運算符,以便讓語言更有效率。這也導致BCPL中的其他符號被簡化,如$(和)$就被改成了{和}。

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

現狀

今天的許多語言已經採用大括號作為代碼塊的主要標誌,特別是那些接近C風格的語言,如C++、Java、C#和JavaScript。

更有意思的是,新的語言也採用了大括號,如Go和Rust。實際上,Go語言要求每個條件語句或循環結構都使用大括號,這遵循了編程專家們的建議:即使不必要,每個結構也都應該使用大括號。

原文鏈接:

https://medium.com/better-programming/a-brief-history-of-the-curly-brace-in-programming-5b3eacdc3f7a

本文為CSDN翻譯文章,轉載請註明出處。

奇奇怪怪的知識增加了,大括號的歷史你知道嗎?奇奇怪怪的知識增加了,大括號的歷史你知道嗎?

今日福利

遇見陸奇

同樣作為“百萬人學 AI”的重要組成部分,2020 AIProCon 開發者萬人大會將於 7 月 3 日至 4 日通過線上直播形式,讓開發者們一站式學習瞭解當下 AI 的前沿技術研究、核心技術與應用以及企業案例的實踐經驗,同時還可以在線參加精彩多樣的開發者沙龍與編程項目。參與前瞻系列活動、在線直播互動,不僅可以與上萬名開發者們一起交流,還有機會贏取直播專屬好禮,與技術大咖連麥。

☞一站式殺手級 AI 開發平臺來襲!告別切換零散建模工具

☞北京四環堵車引發的智能交通大構想

☞拜託,別再問我什麼是堆了!

☞北京四環堵車引發的智能交通大構想

☞你公司的虛擬機還閒著?基於Jenkins和Kubernetes的持續集成測試實踐瞭解一下!

☞從Web1.0到Web3.0:詳析這些年互聯網的發展及未來方向


分享到:


相關文章: