花下貓語:在準備“Python為什麼”系列的下一個話題的時候,我偶然查到這篇文章,介紹了分号“;”在程式設計語言中的曆史。分号在 Python 中也有使用,但很少見,是為什麼呢?下一篇原創文章将會回答這個問題,而今天的分享,是一個知識鋪墊。Enjoy!
在本文中,我将簡要介紹在計算機程式設計語言中使用分号(許多計算機科學入門學生的禍根)的曆史。我們将看到分号有兩種用途:作為語句分隔符和作為語句終止符,并且我們将了解在過去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
COMMENT cross out all multiples, starting with 2*p.;
j :=2;
k :=j*i;
FOR k :=k WHILE k < 1000 DO
candidates[k] :=0;
j :=j + 1;
COMMENT advance to the next candidate ;
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 ;
顯然,即使我們根本不應該使用分号,也沒有就如何最好地使用分号達成共識。我的猜測是,随着編譯器和解釋器技術的改進,對語句結束符(如分号)這樣的文法糖的需求将會減少——盡管分号作為語句分隔符的效果很好。