編程語言中花括號 { } 的簡明歷史

???? Python貓” ,一個值得加星標的公衆號

花下貓語:今天分享的文章,確切地說該稱爲“編程語言中花括號的起源”,主要介紹了早期編程語言中代碼塊定界符的演變過程。Python 是在 C 語言之後發明的,對於花括號,它採取了批判揚棄的態度。C 語言的徒子徒孫比較多,所以花括號遍地開花,不用花括號的語言反而顯得特立獨行了……

作者 | Michael McMillan

譯者 | 彎月,責編 | 夕顏

出品 | 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

優質文章,推薦閱讀:

編程語言中分號“;”的簡明歷史

Python 的縮進是不是反人類的設計?

Python進階:切片的誤區與高級用法

爲什麼 Python 3  把 print 改爲函數?

感謝創作者的好文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章