奇奇怪怪的知识增加了,大括号的历史你知道吗?
作者 |?Michael McMillan
譯者 |?彎月,責(zé)編 | 夕顏
封圖 | CSDN下載自視覺中國
出品 | CSDN(ID:CSDNnews)
眾所周知的標(biāo)志代碼塊起始和結(jié)尾的大括號(hào)是什么時(shí)候開始成為編程語言的一部分的呢?或者更重要的是,代碼塊何時(shí)成了編程結(jié)構(gòu)的重要組成部分?
?
我希望通過本文回答這些問題。
無代碼塊的語言
?
熟悉C語言語法風(fēng)格的程序員都對(duì)編程塊很熟悉。C、C++、Java、JavaScript以及許多其他語言中,所有主要編程結(jié)構(gòu)都是代碼塊。換句話說,這些編程結(jié)構(gòu)都被放到了代碼塊中,而代碼塊的標(biāo)志就是起始和結(jié)尾的大括號(hào)。
?
嚴(yán)格來說這并不完全正確,例如if語句和循環(huán)這兩種結(jié)構(gòu),如果其主體部分只包含一條語句,那么可以不使用代碼塊。但是,在過去幾年,編程風(fēng)格的專家們都建議所有編程結(jié)構(gòu)的主體都應(yīng)該放在代碼塊中(參見Douglas Cockroft的《JavaScript語言精粹》一書,其中的解釋更具說服力)。
?
但是,第一個(gè)高級(jí)編程語言并沒有代碼塊。
?
我以上世紀(jì)五十年代時(shí)的FORTRAN語言為例說明。高德納在他那篇針對(duì)早期高級(jí)語言的評(píng)論《The Early Development of Programming Languages》(該文章在他的書《Selected Papers on Computer Languages》一書中重印)中比較了幾個(gè)早期編程語言的特性。他的比較方法是演示某段程序用幾種語言怎樣編寫。這段程序?qū)崿F(xiàn)了一個(gè)叫做TPK的算法,我們來看看用現(xiàn)代的JavaScript怎樣編寫:
?
你不必在意這段程序的功能。這里的重點(diǎn)是,這段程序展示了高德納認(rèn)為的現(xiàn)代編程語言中的所有重要特性。
?
我前面說過,高德納使用該算法比較了幾種編程語言,其中一種語言就是現(xiàn)在人們公認(rèn)的第一個(gè)真正的高級(jí)語言。下面是高德納編寫的用Fortran語言實(shí)現(xiàn)的TPK算法:
?
我不想詳細(xì)介紹Fortran的語法,但你可以很清晰地看到,該語言沒有代碼塊。函數(shù)定義在某一行上,而不是定義成了一個(gè)塊。DO循環(huán)使用行標(biāo)號(hào)來控制循環(huán)。當(dāng)時(shí)的高級(jí)語言還沒有將組合語句分組成代碼塊的概念,所以這些語言依然需要依賴goto來控制程序流程。
?
這段代碼是高德納使用1957年的Fortran編寫的。在1957~1960年之間,一種新的語言出現(xiàn)了,那就是ALGOL,它彌補(bǔ)了許多Fortran等高級(jí)語言的不足之處。
ALGOL中的代碼塊
?
ALGOL編程語言于1958年首次提出,盡管最流行的版本是Algol 60。Algol語言的特性之一就是能夠?qū)⒄Z句分組,變成組合語句,也叫代碼塊。每個(gè)Algol程序都可以認(rèn)為是一個(gè)代碼塊,因?yàn)槌绦蛲ǔ0粭l或多條語句(因此稱為“組合語句”)。Algol的開發(fā)者認(rèn)為,許多編程場(chǎng)景(如條件判斷和循環(huán))都需要將多條語句作為一個(gè)整體考慮。
?
Algol使用關(guān)鍵字begin和end表示代碼塊的開始和結(jié)束。代碼塊可以嵌套在其他代碼塊中,外部的代碼塊叫做主代碼塊,而內(nèi)部的代碼塊叫做子代碼塊。例如,下面這段Algol程序就包含嵌套的代碼塊:
?
該程序?qū)?huì)按照順序輸出數(shù)字2和1。
?
下面是在Algol的if語句中使用代碼塊的例子:
?
下面是在Algol的for語句中使用代碼塊的例子:
?
下面來看看使用Algol語言編寫的TPK程序,可以看到,與Fortran相比,代碼塊結(jié)構(gòu)可以讓程序更清晰:
?
可以看出,Algol的代碼塊結(jié)構(gòu)讓程序更像我們今天使用的語言。
轉(zhuǎn)向BCPL
?
塊結(jié)構(gòu)語言語法的下一個(gè)改變就是Martin Richards于1967年在劍橋大學(xué)發(fā)明的BCPL語言。在1960~1967年間Algol語言開發(fā)的初始階段,編譯器開發(fā)者和系統(tǒng)開發(fā)者一直在尋找一種方法,使用機(jī)器語言和匯編語言之外的語言來開發(fā)系統(tǒng)程序(如操作系統(tǒng))。之所以這里強(qiáng)調(diào)BCPL,是因?yàn)樗l(fā)展和精煉后變成了由Ken Thompson發(fā)明的B語言,后來又發(fā)展成了C語言。
?
Richards開發(fā)的BCPL語言是一種系統(tǒng)語言,它有匯編語言同樣的效率,但語法更像Algol等高級(jí)語言,所以編寫程序更容易,效率也更高。這意味著Algol等高級(jí)語言的許多特性必須用一種更高效的方式包含在BCPL中。
?
實(shí)現(xiàn)這種高效的方式之一就是將代碼塊的標(biāo)志從單詞(begin和end)改成符號(hào)。對(duì)于組合語句和代碼塊,Richards建議使用符號(hào)$(和)$作為開始和結(jié)束標(biāo)記。這些符號(hào)稱為“節(jié)括號(hào)”。
?
在BCPL中,如果將$(和)$與if語句或循環(huán)等結(jié)構(gòu)一起使用,則它們表示一個(gè)組合語句。如果$(包含一些定義,則它們表示一個(gè)代碼塊。
?
例如,下面是在BCPL中使用if語句和組合語句的例子:
?
下面是BCPL代碼塊的例子:
?
這里,起始記號(hào)表示代碼塊的開始,因?yàn)樗竺婢o跟著聲明。
?
$(和$)變成了C語言中的大括號(hào)
?
在1968年或1969年前后,貝爾實(shí)驗(yàn)室的Ken Thompson和Dennis Ritchie開始使用系統(tǒng)編程語言開發(fā)操作系統(tǒng)。實(shí)際上,Thompson最初想使用Fortran,但很快就放棄了,因?yàn)樗l(fā)現(xiàn)Fortran無法實(shí)現(xiàn)。因此他決定修改BCPL語言來創(chuàng)造一種更合適的系統(tǒng)語言,于是B語言誕生了。
?
盡管B語言更接近Thompson和Ritchie想要的系統(tǒng)語言,但仍然無法完全滿足要求,于是Ritchie開始開發(fā)另一種語言,稱為NB,意思是New B。NB并沒有存活太久,最終被另一種全新的語言代替,這個(gè)全新的語言最后被稱為C。如果你對(duì)C語言如何從BCPL、B和NB發(fā)函而來,我建議你閱讀一下Dennis Ritchie的《History of the C Language》。
?
許多從B語言中繼承到NB再繼承到C語言中的特性,都經(jīng)過了Thompson的修改,其中之一就是操作符縮寫。為了將語言放入當(dāng)時(shí)內(nèi)存十分有限的計(jì)算機(jī)中,這些修改是必須的。例如,Thompson創(chuàng)造了組合賦值運(yùn)算符(如+=)和自增(++)和自減(--)運(yùn)算符,以便讓語言更有效率。這也導(dǎo)致BCPL中的其他符號(hào)被簡化,如$(和)$就被改成了{(lán)和}。
?
現(xiàn)狀
?
今天的許多語言已經(jīng)采用大括號(hào)作為代碼塊的主要標(biāo)志,特別是那些接近C風(fēng)格的語言,如C++、Java、C#和JavaScript。
?
更有意思的是,新的語言也采用了大括號(hào),如Go和Rust。實(shí)際上,Go語言要求每個(gè)條件語句或循環(huán)結(jié)構(gòu)都使用大括號(hào),這遵循了編程專家們的建議:即使不必要,每個(gè)結(jié)構(gòu)也都應(yīng)該使用大括號(hào)。
原文鏈接:
https://medium.com/better-programming/a-brief-history-of-the-curly-brace-in-programming-5b3eacdc3f7a
本文為CSDN翻譯文章,轉(zhuǎn)載請(qǐng)注明出處。
同時(shí),歡迎所有開發(fā)者掃描下方二維碼填寫《開發(fā)者與AI大調(diào)研》,只需2分鐘,便可收獲價(jià)值299元的「AI開發(fā)者萬人大會(huì)」在線直播門票!
推薦閱讀:
你知道嗎?其實(shí) Oracle 直方圖自動(dòng)統(tǒng)計(jì)算法存在這些缺陷!(附驗(yàn)證步驟)
你公司的虛擬機(jī)還閑著?基于 Jenkins 和 Kubernetes 的持續(xù)集成測(cè)試實(shí)踐了解一下!
一站式殺手級(jí) AI 開發(fā)平臺(tái)來襲!告別切換零散建模工具
那些神一樣的程序員
比特幣當(dāng)贖金,WannaRen 勒索病毒二度來襲!
通過 Python 代碼實(shí)現(xiàn)時(shí)間序列數(shù)據(jù)的統(tǒng)計(jì)學(xué)預(yù)測(cè)模型
總結(jié)
以上是生活随笔為你收集整理的奇奇怪怪的知识增加了,大括号的历史你知道吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯云连续三年登上KVM开源贡献榜,引领
- 下一篇: 以云战“疫”,这次阿里云又让人们惊了……