我们每天都在使用大括号,但是代码中的大括号是从哪里来的呢?花括号这个标记代码块开始和结束的熟悉符号是什么时候成为编程的一部分的??也许更重要的是,代码块什么时候成为程序结构的一部分?在本文中,我将回答这些问题。首先,以非块语言为例。所有熟悉C风格编程语法的程序员都熟悉编程块。所有用C、C++、Java、JavaScript和其他语言编写的主要编程结构都是块结构的。换句话说,这些构造的主体被放置在块中,块由打开和关闭花括号分隔。有人可能会争辩说这不完全正确,因为if语句和循环(这里只提到了两种编程结构)如果它们的主体只有一个语句,则可以在没有块的情况下构造。然而,在过去的几年中,编程风格专家建议将所有结构放在一个块中(请参阅DouglasCockroft的“JavaScript:好的部分”以获得将所有if和循环体放在块中的论点,尤其是雄辩)但是,第一个高级编程语言没有块。我将使用大约1950年代后期的FORTRAN语言来演示这一点。DonaldKnuth在他关于早期高级编程语言的优秀评论文章《编程语言的早期开发》中比较了几种早期编程语言的特性,转载于他的书《计算机语言选集》中。他所做的是演示如何用不同的语言来实现计算机程序。该程序实现了一种称为TPK算法的算法,在现代JavaScript中它看起来像这样:functionf(t){returnMath.sqrt(Math.abs(t)+5*Math.pow(t,3));}letarr=[];lety;for(leti=0;i<11;i++){putstr("Enteranumber:");arr[i]=parseFloat(readline());}for(leti=10;i>=0;i--){y=f(arr[i])if(y>400){print(y,"istoolarge.");}else{print(i,y)}}不用担心程序做了什么.重要的一点是,该程序实现了Knuth认为对现代编程语言测试很重要的所有功能。正如我提到的,Knuth将几种编程语言与该算法进行了比较。他最后看的一种语言现在被普遍认为是第一种真正的高级编程语言。这是Knuth编写的TPK程序在Fortran中的样子:CTHETPKALGORITHM,FORTRANSTYLEFUNF(T)=SQRTF(ABSF(T))+5.0*T**3DIMENSIONA(11)1FORMAT(6F12.4)READ1,ADO10J=1,11I=11–JY=FUNF(A(I+1))IF(400.0-Y)4,8,84PRINT5,I5FORMAT(I10,10HTOOLARGE)GOTO108PRINT9,I,Y9FORMAT(I10,F12.7)10CONTINUESTOP52525Fortran语法细节Not话不多说,但你可以清楚地看到,该语言不包含块。函数定义在一行上,而不是作为代码块,DO循环使用行标签来控制循环。当时的高级语言并没有将复合语句组合成块的概念,这些语言仍然依赖goto来控制程序流程。该代码由Knuth使用1957版的Fortran编写。1957年到1960年间,一种新的语言ALGOL被开发出来,填补了Fortran等当时高级语言等语言的许多不足。Algol中的块Algol编程语言于1958年首次被描述,尽管该语言最流行的版本是Algol60。Algol的一个特性是能够将语句分组为复合语句(称为块),每个Algol程序都被认为一个块,因为程序通常包含一个或多个语句(因此是复合语句)。Algol的开发人员认识到,许多编程场景(例如条件和循环)需要将语句视为一个单元。Algol用关键字begin和end标记块的开始和结束。一个块可以嵌套在另一个块中,外部块被认为是主导块,内部块被认为是从属块。例如,这是一个可以嵌套块的Algol程序:beginreala;a:=1;beginreala;a:=2;print(a)end;print(a)end依次打印数字2和1。以下是如何在Algol的if语句中使用块的示例:ifx>-1thenbeginifx≠0thenx:=1/xend;下面是Algol中for循环块的示例:beginreala0,a1,a2,a3,z,p;整数,我;读(a0,a1,a2,a3);读(n)fori:=1step1untilndobeginread(z);p:=((a3×z+a2)×z+a1)×z+a0print(p)endiendnow让我们看看Algol中的TPK程序,看看与Fortran版本相比,块结构如何帮助它:TPKbeginintegeri,realy;reala[0:10];realproceduref(t);realt;valuet;f:=sqrt(abs(t))+5×t↑3;fori:=0step1until10doread(a[i]);fori:=10step-1until0dobeginy:=f(a[i]);ify>400thenwrite(I,'TOOLARGE')elsewrite(i,y);endendTPK你应该能够看到Algol版本的块结构让它更像今天你我习惯阅读的代码。BCPL块结构语言的下一个语法变化是BCPL语言,它由剑桥大学的MartinRichards于1967年开发。在1960年至1967年Algol的初始开发期间,编译器和系统开发人员正在寻找使用机器语言和汇编语言以外的语言开发系统应用程序(例如操作系统)的方法。我强调BCPL是因为C是通过KenThompson开发的中间语言B对BCPL进行的细化和改进而开发的。Richards将BCPL开发为一种系统开发语言,它与汇编语言一样高效,但具有更高级的语法,使编码更简单、更高效。这意味着Algol等高级语言的很多特性需要以更高效的方式包含在BCPL等语言中。实现这种效率的一种方法是将代码块的规范从单词(开始和结束)简化为符号。对于复合语句和代码块,Richards选择符号$(开始和)$结束,这些符号称为节括号。在BCPL中,如果$(和)$与构造一起使用,例如if语句或循环,那么它们将分隔复合语句,如果$(包含一些声明,则它们将分隔块。例如,下面是一个带有复合语句的if语句是如何用BCPL编写的:IFA
