花下猫语:在准备“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
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 ;
显然,即使我们根本不应该使用分号,也没有就如何最好地使用分号达成共识。我的猜测是,随着编译器和解释器技术的改进,对语句结束符(如分号)这样的语法糖的需求将会减少——尽管分号作为语句分隔符的效果很好。