作者 | Michael McMillan

译者 | 弯月,责编 | 夕颜

封图 | CSDN下载自视觉中国

出品 | CSDN(ID:CSDNnews)

众所周知的标志代码块起始和结尾的大括号是什么时候开始成为编程语言的一部分的呢?或者更重要的是,代码块何时成了编程结构的重要组成部分?

我希望通过本文回答这些问题。

无代码块的语言

熟悉C语言语法风格的程序员都对编程块很熟悉。C、C++、Java、JavaScript以及许多其他语言中,所有主要编程结构都是代码块。换句话说,这些编程结构都被放到了代码块中,而代码块的标志就是起始和结尾的大括号。

严格来说这并不完全正确,例如if语句和循环这两种结构,如果其主体部分只包含一条语句,那么可以不使用代码块。但是,在过去几年,编程风格的专家们都建议所有编程结构的主体都应该放在代码块中(参见Douglas Cockroft的《JavaScript语言精粹》一书,其中的解释更具说服力)。

但是,第一个高级编程语言并没有代码块。

我以上世纪五十年代时的FORTRAN语言为例说明。高德纳在他那篇针对早期高级语言的评论《The Early Development of Programming Languages》(该文章在他的书《Selected Papers on Computer Languages》一书中重印)中比较了几个早期编程语言的特性。他的比较方法是演示某段程序用几种语言怎样编写。这段程序实现了一个叫做TPK的算法,我们来看看用现代的JavaScript怎样编写:

你不必在意这段程序的功能。这里的重点是,这段程序展示了高德纳认为的现代编程语言中的所有重要特性。

我前面说过,高德纳使用该算法比较了几种编程语言,其中一种语言就是现在人们公认的第一个真正的高级语言。下面是高德纳编写的用Fortran语言实现的TPK算法:

我不想详细介绍Fortran的语法,但你可以很清晰地看到,该语言没有代码块。函数定义在某一行上,而不是定义成了一个块。DO循环使用行标号来控制循环。当时的高级语言还没有将组合语句分组成代码块的概念,所以这些语言依然需要依赖goto来控制程序流程。

这段代码是高德纳使用1957年的Fortran编写的。在1957~1960年之间,一种新的语言出现了,那就是ALGOL,它弥补了许多Fortran等高级语言的不足之处。

ALGOL中的代码块

ALGOL编程语言于1958年首次提出,尽管最流行的版本是Algol 60。Algol语言的特性之一就是能够将语句分组,变成组合语句,也叫代码块。每个Algol程序都可以认为是一个代码块,因为程序通常包含一条或多条语句(因此称为“组合语句”)。Algol的开发者认为,许多编程场景(如条件判断和循环)都需要将多条语句作为一个整体考虑。

Algol使用关键字begin和end表示代码块的开始和结束。代码块可以嵌套在其他代码块中,外部的代码块叫做主代码块,而内部的代码块叫做子代码块。例如,下面这段Algol程序就包含嵌套的代码块:

该程序将会按照顺序输出数字2和1。

下面是在Algol的if语句中使用代码块的例子:

下面是在Algol的for语句中使用代码块的例子:

下面来看看使用Algol语言编写的TPK程序,可以看到,与Fortran相比,代码块结构可以让程序更清晰:

可以看出,Algol的代码块结构让程序更像我们今天使用的语言。

转向BCPL

块结构语言语法的下一个改变就是Martin Richards于1967年在剑桥大学发明的BCPL语言。在1960~1967年间Algol语言开发的初始阶段,编译器开发者和系统开发者一直在寻找一种方法,使用机器语言和汇编语言之外的语言来开发系统程序(如操作系统)。之所以这里强调BCPL,是因为它发展和精炼后变成了由Ken Thompson发明的B语言,后来又发展成了C语言。

Richards开发的BCPL语言是一种系统语言,它有汇编语言同样的效率,但语法更像Algol等高级语言,所以编写程序更容易,效率也更高。这意味着Algol等高级语言的许多特性必须用一种更高效的方式包含在BCPL中。

实现这种高效的方式之一就是将代码块的标志从单词(begin和end)改成符号。对于组合语句和代码块,Richards建议使用符号$(和)$作为开始和结束标记。这些符号称为“节括号”。

在BCPL中,如果将$(和)$与if语句或循环等结构一起使用,则它们表示一个组合语句。如果$(包含一些定义,则它们表示一个代码块。

例如,下面是在BCPL中使用if语句和组合语句的例子:

下面是BCPL代码块的例子:

这里,起始记号表示代码块的开始,因为它后面紧跟着声明。

$(和$)变成了C语言中的大括号

在1968年或1969年前后,贝尔实验室的Ken Thompson和Dennis Ritchie开始使用系统编程语言开发操作系统。实际上,Thompson最初想使用Fortran,但很快就放弃了,因为他发现Fortran无法实现。因此他决定修改BCPL语言来创造一种更合适的系统语言,于是B语言诞生了。

尽管B语言更接近Thompson和Ritchie想要的系统语言,但仍然无法完全满足要求,于是Ritchie开始开发另一种语言,称为NB,意思是New B。NB并没有存活太久,最终被另一种全新的语言代替,这个全新的语言最后被称为C。如果你对C语言如何从BCPL、B和NB发函而来,我建议你阅读一下Dennis Ritchie的《History of the C Language》。

许多从B语言中继承到NB再继承到C语言中的特性,都经过了Thompson的修改,其中之一就是操作符缩写。为了将语言放入当时内存十分有限的计算机中,这些修改是必须的。例如,Thompson创造了组合赋值运算符(如+=)和自增(++)和自减(--)运算符,以便让语言更有效率。这也导致BCPL中的其他符号被简化,如$(和)$就被改成了{和}。

现状

今天的许多语言已经采用大括号作为代码块的主要标志,特别是那些接近C风格的语言,如C++、Java、C#和JavaScript。

更有意思的是,新的语言也采用了大括号,如Go和Rust。实际上,Go语言要求每个条件语句或循环结构都使用大括号,这遵循了编程专家们的建议:即使不必要,每个结构也都应该使用大括号。

原文链接:

https://medium.com/better-programming/a-brief-history-of-the-curly-brace-in-programming-5b3eacdc3f7a

本文为CSDN翻译文章,转载请注明出处。

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调研》,只需2分钟,便可收获价值299元的「AI开发者万人大会」在线直播门票!

推荐阅读:

  • 你知道吗?其实 Oracle 直方图自动统计算法存在这些缺陷!(附验证步骤)

  • 你公司的虚拟机还闲着?基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下!

  • 一站式杀手级 AI 开发平台来袭!告别切换零散建模工具

  • 那些神一样的程序员

  • 比特币当赎金,WannaRen 勒索病毒二度来袭!

  • 通过 Python 代码实现时间序列数据的统计学预测模型

真香,朕在看了!

奇奇怪怪的知识增加了,大括号的历史你知道吗?相关推荐

  1. 5条出人意外的大脑秘密,奇奇怪怪的知识又增加了!

    来源:混沌巡洋舰 本文授权摘自<人体简史>,作者 比尔·布莱森 ,畅销书<万物简史>作者. 1 你的大脑80%都是水 作为一项纯粹的奇迹,人类的大脑长得毫不起眼.首先,它有75 ...

  2. 《JavaScript 秘密花园》—一些奇奇怪怪的知识

    对象 toString:所有对象都有toString()方法,基本类型除null和undefined外也有 2.toString() 语法错误因为会把 . 当成数字运算,解决办法 2..toStrin ...

  3. CTF MISC在我眼里各种奇奇怪怪的题学习思路总结(持续更新)

    系列文章目录 MISC:图片隐写简单题学习思路总结(持续更新) CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.二维码 1.1 QR码 1.2 Maxicode码 ...

  4. 对比学习知识扩展——一堆奇奇怪怪的loss,快把我压死了orz...

    1.交叉熵loss和对比loss区别 交叉熵 loss 是 最后结果过一层 fc 然后进行 softmax . 然后  fc  的系数 W 就是特征的模板(模板的意思是把一些特征用这个Wc参数转换后, ...

  5. 各种奇奇怪怪的编码,究竟怎么来的?

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来源:数据分析与统计学之美 问题起源 我们在学习Python的过程中,可能会经常遇到下方这样的编码问题. 有时 ...

  6. 奇奇怪怪的大佬:从职业赌徒到互联网大佬

    想必上个月花季少女命丧货拉拉的新闻大家都有所耳闻,虽然事后警方已经给出了最终分析结果,但是货拉拉司机途中曾三次偏离导航规划路线.车内无任何录音录像设备.少女跳窗为何后脑勺着地等耐人寻味的话题,一时间将 ...

  7. 奇奇怪怪的小姿势——关于UI的各种Position

    奇奇怪怪的小姿势--关于UI的各种Position LocalPosition     重心点相对于父节点重心点的偏移量 AnchoredPosition   重心点相对于父节点锚点的偏移量 Posi ...

  8. C. 奇奇怪怪的魔法阵(未搞懂)

    C. 奇奇怪怪的魔法阵 题意: n个点m条边,定义集合S为独立集,当且仅当任意x,y∈S,x与y之间没有边.空集也是独立集 现在对于每一个点的集合T,有多少子集为独立集 设N=0,1,-,n-1,AT ...

  9. Vue组件库 View UI 来看看这80种奇奇怪怪的按钮

    80种奇奇怪怪的按钮,先睹为快! 本文详细讲解 View UI 中,Button 组件的样式配置和单击事件响应. 目录 一.按钮样式 1.1 颜色 1.2 大小 1.3 按钮形状 1.4 背景透明 1 ...

最新文章

  1. java 使用http2.0_【Java】okhttp3如何发送http2请求?
  2. @async 没有异步_spring boot使用@Async异步任务
  3. 加强数据中心安全的六条措施
  4. 操作符offset 和 jmp指令
  5. 微信小程序开发教程(基础篇)8-数据绑定下
  6. Martix工作室考核题 —— 2019-3-8 第三题
  7. linux文本工具总结,Linux 文本工具
  8. 微服务意味着分布式系统
  9. 【git系列】合并分支进master
  10. c# 一种缓存模板
  11. 订阅机票时要注意的几个教训
  12. matlab状态空间程序,实验四用MATLAB求解状态空间模型
  13. java加载mysql驱动_Java 加载数据库驱动(JDBC)
  14. 2022中兴捧月算法挑战赛(RAW图像去噪)——初赛到决赛总结与反思
  15. 8分之七怎么用计算机,如何用八屏电脑看盘
  16. input 框换背景色
  17. 数据仓库实践-拉链表设计
  18. contiki学习笔记(五)ctimer和etimer
  19. 穿越时空的爱恋-Z80 CPU的前世今生
  20. mac 下使用ssh

热门文章

  1. java nutz_jnutz: 基于nutz的java+js混合开发项目
  2. 部编版是什么版本_部编版是人教版吗
  3. python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式
  4. div中的p标签于img设置同一水平_前端工程师:css中一些需要注意的东西
  5. 两条边延长角会有什么变化_田园易经:什么样的风水环境会影响人的健康?
  6. 如何在读研读博的道路上迅速失败?
  7. 从放牛娃到北大博士,这篇论文后记刷屏
  8. 重磅!13所985高校,成立大学联盟!
  9. 这就是库克的重大计划?英特尔新CEO帕特誓言:CPU必须要比苹果好!
  10. 一位女博士五年的艰难毕业历程