日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
編程中花括號的簡史

我們每天都使用它們,但是代碼中的花括號是從哪里來的呢?

大括號,那個標(biāo)志著代碼塊開始和結(jié)束的熟悉符號,什么時候成為編程的一部分?也許更重要的是,代碼塊何時成為程序結(jié)構(gòu)的一部分?

在本文中,我將回答這些問題。

首先,以非塊狀語言為例

所有熟悉C風(fēng)格編程語法的程序員都熟悉編程塊,用C、C ++、Java、JavaScript和其他語言編寫的所有主要編程結(jié)構(gòu)都是塊結(jié)構(gòu)的。換句話說,這些構(gòu)造的主體放置在塊中,這些塊由打開和閉合的花括號分隔。

有人可能會說,這并不是完全正確的,因為 if 語句和循環(huán)(這里只提到兩種編程構(gòu)造),如果它們的主體只有一個語句,就可以不用塊來構(gòu)造。然而,在過去的幾年里,編程風(fēng)格專家建議將所有的構(gòu)造體放在一個塊中(參見Douglas Cockroft的“JavaScript: The Good Parts”中關(guān)于將所有if和循環(huán)體放在塊中的論點特別有說服力)

然而,第一批高級編程語言并沒有塊。

我將使用大約在20世紀50年代末的FORTRAN語言來演示這一點。

Donald Knuth在他關(guān)于早期高級編程語言的優(yōu)秀評論文章《編程語言的早期開發(fā)》中比較了幾種早期編程語言的特性,這篇文章轉(zhuǎn)載在他的書《計算機語言選集》中。他的做法是,演示某個計算機程序如何用不同的語言實現(xiàn)。這個程序?qū)崿F(xiàn)了一個叫做TPK算法的算法,在現(xiàn)代JavaScript中是這樣的:

 
 
 
 
  1. function f(t) {
  2.   return Math.sqrt(Math.abs(t) + 5 * Math.pow(t, 3));
  3. }
  4. let arr = [];
  5. let y;
  6. for (let i = 0; i < 11; i++) {
  7.   putstr("Enter a number: ");
  8.   arr[i] = parseFloat(readline());
  9. }
  10. for (let i = 10; i >= 0; i--) {
  11.   y = f(arr[i])
  12.   if (y > 400) {
  13.     print(y,"is too large.");
  14.   }
  15.   else {
  16.     print(i,y)
  17.   }
  18. }

不要擔(dān)心程序做什么。重要的一點是,這個程序執(zhí)行了Knuth認為在現(xiàn)代編程語言中對測試很重要的所有特性。

正如我提到的,Knuth將幾種編程語言與該算法進行了比較。他最后看過的一種語言,現(xiàn)在通常被認為是第一種真正的高級編程語言。下面是Knuth編寫的TPK程序在Fortran中的樣子:

 
 
 
 
  1. C   THE TPK ALGORITHM, FORTRAN STYLE
  2.     FUNF(T) = SQRTF(ABSF(T))+5.0*T**3
  3.     DIMENSION A(11)
  4. 1   FORMAT(6F12.4)
  5.     READ 1, A
  6.     DO 10 J = 1, 11
  7.     I = 11 – J
  8.     Y = FUNF(A(I+1))
  9.     IF (400.0-Y) 4, 8, 8
  10. 4   PRINT 5, I
  11. 5   FORMAT(I10, 10H TOO LARGE)
  12.     GO TO 10
  13. 8   PRINT 9, I, Y
  14. 9   FORMAT(I10, F12.7)
  15. 10  CONTINUE
  16.     STOP 52525

Fortran語法的細節(jié)我就不多說了,但你可以清楚地看到,該語言不包含塊。函數(shù)定義在一行上,而不是作為代碼塊,DO 循環(huán)使用一個行標(biāo)簽來控制循環(huán)。當(dāng)時的高級語言還沒有將復(fù)合語句分組成塊的概念,這些語言仍然依靠 goto 來控制程序流。

該代碼由Knuth使用1957年的Fortran版本編寫。1957年至1960年間,一種新的語言ALGOL被開發(fā)出來,它彌補了當(dāng)時Fortran等語言和其他高級語言的許多缺陷。

Algol中的塊

Algol編程語言首次被描述是在1958年,盡管該語言最流行的版本是Algol 60。Algol的功能之一是將語句分組為復(fù)合語句(稱為塊)的能力,每個Algol程序都被視為一個塊,因為一個程序通常包含一個或多個語句(因此為復(fù)合語句)。Algol的開發(fā)者認識到,許多編程場景,如條件和循環(huán),需要將語句作為一個單元來考慮。

Algol使用關(guān)鍵字 begin 和 end 標(biāo)記了塊的開始和結(jié)束。一個區(qū)塊可以嵌套在另一個區(qū)塊里面,外區(qū)塊被認為是主導(dǎo)區(qū)塊,內(nèi)區(qū)塊被認為是從屬區(qū)塊。例如,這里有一個Algol程序,可以嵌套塊:

 
 
 
 
  1. begin real a;
  2.      a := 1;
  3.      begin real a;
  4.           a := 2;
  5.           print(a)
  6.      end;
  7.      print(a)
  8. end

依次打印數(shù)字2和1。

這是在Algol的 if 語句中如何使用塊的示例:

 
 
 
 
  1. if x > -1 then
  2.      begin
  3.           if x ≠ 0 then
  4.           x := 1/x
  5.      end;

這是Algol中 for 循環(huán)塊的示例:

 
 
 
 
  1. begin
  2.      real a0, a1, a2, a3, z, p;
  3.      integer n, i;
  4.      read(a0, a1, a2, a3);
  5.      read(n)
  6.      for i := 1 step 1 until n do
  7.           begin
  8.                read(z);
  9.                p := ((a3 × z + a2) × z + a1) × z + a0
  10.                print(p)
  11.           end i
  12. end

現(xiàn)在讓我們看看Algol中的TPK程序,看看與Fortran版本相比,塊結(jié)構(gòu)對該程序有什么幫助:

 
 
 
 
  1. TPK begin integer i, real y; real a[0:10];
  2.      real procedure f(t); real  t; value t;
  3.      f := sqrt(abs(t)) + 5 × t ↑ 3;
  4.      for i := 0 step 1 until 10 do read(a[i]);
  5.      for i := 10 step -1 until 0 do
  6.           begin y := f(a[i]);
  7.                if y > 400 then write(I, 'TOO LARGE')
  8.                else write(i, y);
  9.           end
  10. end TPK

你應(yīng)該能看出來,Algol版本的區(qū)塊結(jié)構(gòu)讓它更像你我今天習(xí)慣閱讀的代碼。

轉(zhuǎn)到BCPL

塊結(jié)構(gòu)語言的語法的下一個變化是1967年由劍橋大學(xué)的馬丁·理查茲(Martin Richards)開發(fā)的BCPL語言。在1960年至1967年Algol最初開發(fā)期間,編譯器和系統(tǒng)開發(fā)人員一直在尋找使用機器語言和匯編語言以外的語言開發(fā)系統(tǒng)應(yīng)用程序(如操作系統(tǒng))的方法。我之所以強調(diào)BCPL,是因為C是通過Ken Thompson開發(fā)的一種名為B的中間語言,作為BCPL的完善和改進而開發(fā)的。

Richards將BCPL開發(fā)為一種系統(tǒng)開發(fā)語言,它與匯編語言一樣高效,但具有更高級別的語法,從而使編碼更簡單、更高效。這意味著高級語言(如Algol)的許多特性需要以更有效的方式包含在BCPL等語言中。

實現(xiàn)這一效率的方法之一是將一個代碼塊的指定從單詞(begin 和 end)簡化為符號。對于復(fù)合語句和代碼塊,Richards選擇了符號 $( 代表開頭和 )$ 代表結(jié)尾,這些符號稱為節(jié)括號。

在BCPL中,如果 $( 和 )$ 與一個結(jié)構(gòu)體一起使用,比如 if 語句或循環(huán),那么它們就是在限定一個復(fù)合語句,如果 $( 包括一些聲明,那么它們就是在給一個塊劃定界限。

例如,下面是BCPL中帶有復(fù)合語句的 if 語句的寫法:

 
 
 
 
  1. IF A < B
  2.      $( LET T = A
  3.           A := B; B := T
  4.      $)

這是BCPL塊的示例:

 
 
 
 
  1. GET "LIBHDR"
  2. LET START() BE
  3.      $( LET A, B, C, SUM = 1, 2, 3, 0
  4.           SUM := A + B + C
  5.           WRITES("Sum is ")
  6.           WRITEN(SUM)
  7.      $)

在這里,開始部分方括號是開始一個塊,因為聲明緊跟著方括號。

(和) 在C中成為 { 和 }

大約在1968年或1969年,貝爾實驗室的肯-湯普森和丹尼斯-里奇開始嘗試使用系統(tǒng)編程語言開發(fā)操作系統(tǒng)。湯普森其實一開始就嘗試使用Fortran進行探索,但當(dāng)他意識到這不可能時,很快就放棄了。他決定要對BCPL進行修改,使其成為一種更符合自己喜好的系統(tǒng)編程語言,于是開發(fā)了B。

B雖然更接近湯普森和里奇想要的系統(tǒng)開發(fā)語言,但仍然不能完全滿足他們的需求,所以里奇開始為新的B開發(fā)另一種語言NB。NB的生命力并不長,最終被一種全新的語言所取代,他們自然而然地稱之為C。如果你對C語言是如何從BCPL、B和NB發(fā)展而來的感興趣,我鼓勵你閱讀丹尼斯-里奇的《C語言的歷史》。

湯普森在B中固定并延續(xù)到NB然后在C中固定的許多事物之一就是縮寫運算符,這些都是為了讓擴展后的語言適應(yīng)當(dāng)時計算機的內(nèi)存限制所必需的。例如,湯普森創(chuàng)造了復(fù)合賦值運算符( += 為例)以及增量(++)和減量(-)運算符,作為提高語言效率的方法。此舉是為了提高效率,導(dǎo)致BCPL的其他運算符被簡化——例如,$( 和 $) 被 { 和 } 取代。

我們今天的情況

在許多編程語言中,花括號已經(jīng)被用作塊的主要符號,特別是那些最接近C風(fēng)格的語言,包括c++、Java、c#和JavaScript。

更有趣的是,新的語言已經(jīng)采用了大括號的使用,包括Go和Rust。事實上,Go要求對每個條件或循環(huán)構(gòu)造都使用花括號,這是遵循編程專家的觀點,即即使語言不需要花括號,程序員也應(yīng)該對每個可以使用花括號的構(gòu)造使用花括號。

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

作者:Michael McMillan

本文轉(zhuǎn)載自微信公眾號「前端全棧開發(fā)者」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系前端全棧開發(fā)者公眾號。


網(wǎng)站欄目:編程中花括號的簡史
文章鏈接:http://m.5511xx.com/article/cdooigd.html