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

語言: CN / TW / HK

在本文中,我將簡要介紹在計算機程式語言中使用分號(許多電腦科學入門學生的禍根)的歷史。我們將看到分號有兩種用途:作為語句分隔符和作為語句終止符,並且我們將瞭解在過去60多年的程式語言歷史中分號的使用發生了怎樣的變化。

為什麼程式語言使用分號
分號在程式語言中用於兩件事:語句分隔符和語句終止符。當一種語言使用分號作為語句分隔符時,這允許您在同一行上編寫多個語句,並使用分號來標記語句的分隔,以便編譯器或直譯器可以找出一個語句在哪裡結束而另一條語句在哪裡開始。

在以分號為分隔符的語言中,分號被視為可選的,當一行程式碼僅包含一條語句時,通常不會編寫分號。

作為語句結束符的分號是不可選的,用於明確地標記語句的結束,使用分號作為終止符的程式語言將在分號不在其預期位置時標記錯誤。許多程式設計專家聲稱,以分號結尾的語句可以使程式更快,因為編譯器可以更有效地執行,儘管我在本文末尾會對此主張提出異議。

早期的高階語言和分號的使用
當Fortran在20世紀50年代中期被作為一種高階程式語言引入時,程式語言的史前時代就結束了,Fortran既不使用分號作為語句分隔符,也不使用分號作為語句終止符,Fortran中的語句每行只能寫一個,而新行是語句終止符。

在現代程式語言中首次使用分號是ALGOL 58,然而,這個版本並沒有得到很好的實現,它很快就變成了ALGOL 60。這個早期版本的ALGOL使用分號作為分隔符,儘管分號經常被多餘地用作語句結束符(儘管這不是必需的)。分號的這種混合使用可能會導致非常混亂的程式,分號通常放在某些行的末尾,而不是其他的行末尾,如我從Steve Maurer的網站上借來的ALGOL 60程式碼片段所示:

COMMENT advance to the next un-crossed out number. ;
COMMENT this number must be a prime ;
FOR i := i WHILE i<1000 AND candidates[i] = 0 DO
  BEGIN
      i := i+1;
  END;
  COMMENT insure against running off end of the data structure ;
  IF i<1000 THEN
      BEGIN
         COMMENT cross out all multiples, starting with 2*p.;
         j := 2;
         k := j*i;
        FOR k := k WHILE k < 1000 DO
             BEGIN
                  candidates[k] := 0;
                  j := j + 1;
                  k := j*i;
             END;
             COMMENT advance to the next candidate ;
             i := i+1;
      END
 END;

Algol 60衍生出了Algol的其他版本……一直到Algol 68。許多語言都是基於Algol的,但對當今語言影響最大的版本是Basic組合式程式語言(BCPL)。

BCPL是一種程式語言,由劍橋大學的Martin Richards於1967年開發,BCPL的設計採用了許多後來影響C語言發展的概念,稍後我們將看到。BCPL還使用分號作為語句分隔符,許多編寫BCPL的程式設計師也使用分號來指示行的結尾,儘管像Algol一樣,這種用法是多餘的,行尾字元是BCPL中真正的語句分隔符。

影響分號當前使用的另一種語言是IBM的程式語言PL/I。PL/I是在20世紀60年代中期開發的,並且是當時的c++語言——因為該語言的設計者試圖包含所有其他流行程式語言的所有特性,這樣該語言就可以取代Fortran用於科學計算,而COBOL用於商業計算。

PL/I使用分號作為語句終止符,並且此設計決策對其他語言實現者(如C的開發者Ken Thompson和Dennis Ritchie)有影響。

B,NB,C和分號
大約在1968年左右,當貝爾實驗室逐漸退出Multics專案時,Ken Thompson開始開發一種基於BCPL的新語言,他稱之為B語言。您可以在Dennis Ritchie的有關C語言歷史的文章中瞭解有關B的開發的更多資訊。

湯普森(Thompson)將B設計為一種系統程式語言,用於開發當時處於萌芽狀態的Unix作業系統。湯普森(Thompson)在B程式語言的設計中對BCPL進行了許多更改,他所做的更改之一是使分號成為語句終止符是強制性的。正如我前面提到的,在BCPL中,分號作為語句結束符是可選的,但這只是因為編譯器使用了聰明的規則來允許不使用分號。湯普森希望B是一種更高效的語言,因此需要使用分號作為語句結束符。

當湯普森和裡奇試圖用B構建Unix時,他們意識到甚至湯普森的新語言也不適合作為系統程式語言,因此裡奇開發了一種新的B版本,稱為NB,以解決其中的一些問題。NB作為一種語言並沒有持續很長時間,因為兩個人決定只需要廢棄B就可以了。

今天的分號狀態
正如我們所知,分號已經成為許多語言(C、C++、Java、C#和JavaScript)中選擇的語句結束符,這裡只提到一些最流行的語言。JavaScript是一個有趣的示例,因為最新版本的JavaScript允許您在大多數以換行符結尾的語句的末尾省略分號。

並非所有的程式語言都使用分號作為語句終止符。Python與Visual Basic和Visual Basic.NET一樣,將換行符用作語句終止符。Ruby是另一種不使用分號的流行語言。

另一種較新的語言Go也不使用分號作為語句結束符——儘管它確實使用它作為語句分隔符。另一方面,另一種新的系統程式語言Rust使用分號作為語句結束符。

要檢視哪些語言使用哪種字元或哪些字元作為語句終止符和語句分隔符,請轉到此處。

; // Terminator ;
顯然,即使我們根本不應該使用分號,也沒有就如何最好地使用分號達成共識。我的猜測是,隨著編譯器和直譯器技術的改進,對語句結束符(如分號)這樣的語法糖的需求將會減少——儘管分號作為語句分隔符的效果很好。

以上就是本次分享的所有內容,想要了解更多 python 知識歡迎前往公眾號:Python 程式設計學習圈 ,傳送 “J” 即可免費獲取,每日干貨分享