奇奇怪怪的知识增加了,大括号的历史你知道吗?
作者 |?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大調研》,只需2分鐘,便可收獲價值299元的「AI開發者萬人大會」在線直播門票!
推薦閱讀:
你知道嗎?其實 Oracle 直方圖自動統計算法存在這些缺陷!(附驗證步驟)
你公司的虛擬機還閑著?基于 Jenkins 和 Kubernetes 的持續集成測試實踐了解一下!
一站式殺手級 AI 開發平臺來襲!告別切換零散建模工具
那些神一樣的程序員
比特幣當贖金,WannaRen 勒索病毒二度來襲!
通過 Python 代碼實現時間序列數據的統計學預測模型
總結
以上是生活随笔為你收集整理的奇奇怪怪的知识增加了,大括号的历史你知道吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯云连续三年登上KVM开源贡献榜,引领
- 下一篇: 以云战“疫”,这次阿里云又让人们惊了……