编程中花括号的简史
我们每天都使用它们 , 但是代码中的花括号是从哪里来的呢?
文章插图
大括号 , 那个标志着代码块开始和结束的熟悉符号 , 什么时候成为编程的一部分?也许更重要的是 , 代码块何时成为程序结构的一部分?
在本文中 , 我将回答这些问题 。
首先 , 以非块状语言为例所有熟悉C风格编程语法的程序员都熟悉编程块 , 用C、C ++、Java、JavaScript和其他语言编写的所有主要编程结构都是块结构的 。 换句话说 , 这些构造的主体放置在块中 , 这些块由打开和闭合的花括号分隔 。
有人可能会说 , 这并不是完全正确的 , 因为 if 语句和循环(这里只提到两种编程构造) , 如果它们的主体只有一个语句 , 就可以不用块来构造 。 然而 , 在过去的几年里 , 编程风格专家建议将所有的构造体放在一个块中(参见Douglas Cockroft的“JavaScript: The Good Parts”中关于将所有if和循环体放在块中的论点特别有说服力)
然而 , 第一批高级编程语言并没有块 。
我将使用大约在20世纪50年代末的FORTRAN语言来演示这一点 。
文章插图
Donald Knuth在他关于早期高级编程语言的优秀评论文章《编程语言的早期开发》中比较了几种早期编程语言的特性 , 这篇文章转载在他的书《计算机语言选集》中 。 他的做法是 , 演示某个计算机程序如何用不同的语言实现 。 这个程序实现了一个叫做TPK算法的算法 , 在现代JavaScript中是这样的:
function f(t) {return Math.sqrt(Math.abs(t) + 5 * Math.pow(t, 3));}let arr = [];let y;for (let i = 0; i < 11; i++) {putstr("Enter a number: ");arr[i] = parseFloat(readline());}for (let i = 10; i >= 0; i--) {y = f(arr[i])if (y > 400) {print(y,"is too large.");}else {print(i,y)}}不要担心程序做什么 。 重要的一点是 , 这个程序执行了Knuth认为在现代编程语言中对测试很重要的所有特性 。
正如我提到的 , Knuth将几种编程语言与该算法进行了比较 。 他最后看过的一种语言 , 现在通常被认为是第一种真正的高级编程语言 。 下面是Knuth编写的TPK程序在Fortran中的样子:
CTHE TPK ALGORITHM, FORTRAN STYLEFUNF(T) = SQRTF(ABSF(T))+5.0*T**3DIMENSION A(11)1FORMAT(6F12.4)READ 1, ADO 10 J = 1, 11I = 11 – JY = FUNF(A(I+1))IF (400.0-Y) 4, 8, 84PRINT 5, I5FORMAT(I10, 10H TOO LARGE)GO TO 108PRINT 9, I, Y9FORMAT(I10, F12.7)10CONTINUESTOP 52525Fortran语法的细节我就不多说了 , 但你可以清楚地看到 , 该语言不包含块 。 函数定义在一行上 , 而不是作为代码块 , DO 循环使用一个行标签来控制循环 。 当时的高级语言还没有将复合语句分组成块的概念 , 这些语言仍然依靠 goto 来控制程序流 。
该代码由Knuth使用1957年的Fortran版本编写 。 1957年至1960年间 , 一种新的语言ALGOL被开发出来 , 它弥补了当时Fortran等语言和其他高级语言的许多缺陷 。
Algol中的块Algol编程语言首次被描述是在1958年 , 尽管该语言最流行的版本是Algol 60 。 Algol的功能之一是将语句分组为复合语句(称为块)的能力 , 每个Algol程序都被视为一个块 , 因为一个程序通常包含一个或多个语句(因此为复合语句) 。 Algol的开发者认识到 , 许多编程场景 , 如条件和循环 , 需要将语句作为一个单元来考虑 。
文章插图
Algol使用关键字 begin 和 end 标记了块的开始和结束 。 一个区块可以嵌套在另一个区块里面 , 外区块被认为是主导区块 , 内区块被认为是从属区块 。 例如 , 这里有一个Algol程序 , 可以嵌套块:
begin real a;a := 1;begin real a;a := 2;print(a)end;print(a)end依次打印数字2和1 。
这是在Algol的 if 语句中如何使用块的示例:
if x > -1 thenbeginif x ≠ 0 thenx := 1/xend;这是Algol中 for 循环块的示例:
beginreal a0, a1, a2, a3, z, p;integer n, i;read(a0, a1, a2, a3);read(n)for i := 1 step 1 until n dobeginread(z);p := ((a3 × z + a2) × z + a1) × z + a0print(p)end iend现在让我们看看Algol中的TPK程序 , 看看与Fortran版本相比 , 块结构对该程序有什么帮助:
TPK begin integer i, real y; real a[0:10];real procedure f(t); realt; value t;f := sqrt(abs(t)) + 5 × t ↑ 3;for i := 0 step 1 until 10 do read(a[i]);for i := 10 step -1 until 0 dobegin y := f(a[i]);if y > 400 then write(I, 'TOO LARGE')else write(i, y);endend TPK你应该能看出来 , Algol版本的区块结构让它更像你我今天习惯阅读的代码 。
- Twitter|Twitter的Audio Spaces测试包括转录、扬声器控制和报告功能
- Linux(服务器编程):百万并发服务器系统参数调优
- 一个方括号引发的惨案
- 菜鸟学编程,不懂C++ this指针?还不赶快来学一学
- 编程猫领衔,9家编程app测评一览详解
- 都说编程要逻辑好,如何理解这个逻辑
- 非计算机专业在大一期间该选修计算机基础还是Python编程
- Java安全之Javassist动态编程
- 一分钟编程之让百度谷歌一下
- 盘点:2020年5种流行的 AI 编程语言,就业高薪不是梦
