偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

編程中花括號(hào)的簡(jiǎn)史

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

[[349123]]

我們每天都使用它們,但是代碼中的花括號(hào)是從哪里來(lái)的呢?

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

在本文中,我將回答這些問(wèn)題。

首先,以非塊狀語(yǔ)言為例

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

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

然而,第一批高級(jí)編程語(yǔ)言并沒(méi)有塊。

我將使用大約在20世紀(jì)50年代末的FORTRAN語(yǔ)言來(lái)演示這一點(diǎn)。

[[349124]]

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

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

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

正如我提到的,Knuth將幾種編程語(yǔ)言與該算法進(jìn)行了比較。他最后看過(guò)的一種語(yǔ)言,現(xiàn)在通常被認(rèn)為是第一種真正的高級(jí)編程語(yǔ)言。下面是Knuth編寫(xiě)的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語(yǔ)法的細(xì)節(jié)我就不多說(shuō)了,但你可以清楚地看到,該語(yǔ)言不包含塊。函數(shù)定義在一行上,而不是作為代碼塊,DO 循環(huán)使用一個(gè)行標(biāo)簽來(lái)控制循環(huán)。當(dāng)時(shí)的高級(jí)語(yǔ)言還沒(méi)有將復(fù)合語(yǔ)句分組成塊的概念,這些語(yǔ)言仍然依靠 goto 來(lái)控制程序流。

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

Algol中的塊

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

[[349125]]

Algol使用關(guān)鍵字 begin 和 end 標(biāo)記了塊的開(kāi)始和結(jié)束。一個(gè)區(qū)塊可以嵌套在另一個(gè)區(qū)塊里面,外區(qū)塊被認(rèn)為是主導(dǎo)區(qū)塊,內(nèi)區(qū)塊被認(rèn)為是從屬區(qū)塊。例如,這里有一個(gè)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 語(yǔ)句中如何使用塊的示例:

  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)對(duì)該程序有什么幫助:

  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)該能看出來(lái),Algol版本的區(qū)塊結(jié)構(gòu)讓它更像你我今天習(xí)慣閱讀的代碼。

轉(zhuǎn)到BCPL

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

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

實(shí)現(xiàn)這一效率的方法之一是將一個(gè)代碼塊的指定從單詞(begin 和 end)簡(jiǎn)化為符號(hào)。對(duì)于復(fù)合語(yǔ)句和代碼塊,Richards選擇了符號(hào) $( 代表開(kāi)頭和 )$ 代表結(jié)尾,這些符號(hào)稱(chēng)為節(jié)括號(hào)。

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

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

  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.      $) 

在這里,開(kāi)始部分方括號(hào)是開(kāi)始一個(gè)塊,因?yàn)槁暶骶o跟著方括號(hào)。

(和) 在C中成為 { 和 }

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

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

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

我們今天的情況

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

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

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

 

作者:Michael McMillan

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

 

責(zé)任編輯:武曉燕 來(lái)源: 前端全棧開(kāi)發(fā)者
相關(guān)推薦

2018-01-26 14:41:04

編程Python開(kāi)發(fā)

2019-03-18 15:53:11

BashLinux花括號(hào)

2010-07-21 16:10:25

計(jì)算機(jī)

2013-06-09 09:15:01

2023-01-13 12:37:43

Bashshell花括號(hào)

2013-06-09 09:58:58

2010-03-11 10:34:22

Scala

2017-08-24 09:20:07

大數(shù)據(jù)數(shù)據(jù)架構(gòu)范式

2013-02-20 09:33:07

PythonWeb

2025-01-03 08:34:40

2019-02-12 15:47:42

Bash尖括號(hào)命令

2014-09-26 09:29:12

Python

2011-03-10 14:55:05

JavaScript

2011-11-03 15:55:40

Windows Pho

2010-05-10 17:14:41

Unix系統(tǒng)

2017-06-21 20:54:40

電子技術(shù)計(jì)算機(jī)電子

2009-06-19 00:05:00

J2EE開(kāi)發(fā)框架POJO

2022-11-22 15:34:24

物聯(lián)網(wǎng)

2012-04-18 15:39:04

諾基亞NFC

2012-02-20 10:12:09

Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)