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

作者 | 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 代码实现时间序列数据的统计学预测模型

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5年时间,我从开发做到总裁的秘籍--如何提升技术型管理者的领导力

对于深耕技术的一线开发者而言,大多数都希望把技术工作进行到底,或者一直从事和技术技术相关性更高的工作。但随着年龄和经验的增长,我对管理和技术的思考越来越多、越来越深入,和大多数人一样,站在这个路口——到底继…

css-结构伪类选择器

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>/* ul的第一个子元素 */body ul li:first-child{background: #12ec4e;}/* ul的最后一个子元素 */ul li:last-child…

闲鱼无障碍是怎么在端侧实现的

Hi&#xff0c;小伙伴们还记得之前刷屏的“闲鱼为1700万人&#xff0c;打造了一条盲道”的文章吗&#xff1f; 在今年4月&#xff0c;闲鱼和深圳市信息无障碍研究会取得了联系。在沟通过程中&#xff0c;我们了解到在移动互联网时代&#xff0c;视障人士同样可以通过手机&#…

面试造飞机系列:看架构师如何设计微服务接口

来源 | 后端技术学堂责编 | Carol封图| CSDN下载于视觉中国 在微服务设计中&#xff0c;服务间接口通信设计常见的有两种方式&#xff1a;RPC 和 REST&#xff0c;关于微服务和 RPC 的更多细节&#xff0c;可以参考我上一篇文章 面试都在问的微服务&#xff0c;一文带你彻底搞…

日均处理万亿数据!Flink在快手的应用实践与技术演进之路

董亭亭&#xff0c;快手大数据架构实时计算引擎团队负责人。目前负责 Flink 引擎在快手内的研发、应用以及周边子系统建设。2013 年毕业于大连理工大学&#xff0c;曾就职于奇虎 360、58 集团。主要研究领域包括&#xff1a;分布式计算、调度系统、分布式存储等系统。 本次的分…

css-字体样式

字体样式 <!--font-family: 字体font-size: 字体大小font-weight: 字体粗细color: 字体颜色--><style>body{font-family: "Arial Black", 楷体,serif;color: #cdbb21;}h1{font-size: 50px;}.p1{font-weight: bolder;}</style><!--字体风格 ob…

小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!

作者 | 王洪鹏责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;封图| CSDN下载于视觉中国 上篇文章&#xff1a;小网站的容器化(上) 中我们大致描述了下个人网站在日常维护中的痛点&#xff0c;文章的后半部分我们添加了一个纯静态网站容器化的简…

阿里云应用高可用 AHAS 正式商用,可一键提升云上应用可用性

在分布式架构环境下&#xff0c;服务间的依赖日益复杂&#xff0c;可能没有人能说清单个故障对整个系统的影响&#xff0c;构建一个高可用的分布式系统面临着很大挑战。 7月17日&#xff0c;阿里云应用高可用服务AHAS 正式商用&#xff0c;包含架构感知、流控降级和故障演练三…

机器学习在高德起点抓路中的应用实践

导读&#xff1a;高德地图作为中国领先的出行领域解决方案提供商&#xff0c;导航是其核心用户场景。路线规划作为导航的前提&#xff0c;是根据起点、终点以及路径策略设置&#xff0c;为用户量身定制出行方案。 起点抓路&#xff0c;作为路线规划的初始必备环节&#xff0c;…

css-阴影和超链接伪类

阴影和超链接伪类 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>/* 默认的颜色 */a{text-decoration: none; /* 去掉下划线 */color: #000000; /* 修改颜色 */}…

时尚电商新赛道:揭秘 FashionAI 技术

雷音是阿里巴巴研究员、淘系技术部 FashionAI 负责人&#xff0c;在淘系技术嘉年华硅谷站&#xff0c;他分享了《时尚电商新赛道— FashionAI 中的技术》 &#xff0c;旨在揭秘&#xff1a;从面向机器学习的知识重建切入&#xff0c;提出了在 AI 能力的推动下&#xff0c;让人值…

MQ 技术产品井喷,今天来详聊一下腾讯开源消息中间件 TubeMQ | 原力计划

作者 | kimmking来源 | CSDN博客&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;随着分布式技术的发展&#xff0c;MQ技术产品也出现井喷。目前除了各类常用的MQ&#xff0c;比如Apache的ActiveMQ&#xff0c;Kafka&#xff0c;Pulsar&#xff0c;Rock…

MongoDB compact 命令详解

为什么需要 compact 一图胜千言 remove 与 drop 的区别 MongoDB 里删除一个集合里所有文档&#xff0c;有两种方式 db.collection.remove({}, {multi: true})&#xff0c;逐个文档从 btree 里删除&#xff0c;最后所有文档被删除&#xff0c;但文件物理空间不会被回收db.col…

css-背景图片和渐变

背景图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>/* 边框 border 1px粗细 solid样式 red颜色*/div{width: 1000px;height: 700px;border: 1px solid red;/*…

GitOps 初探

前言 GitOps 的概念最初来源于 Weaveworks 的联合创始人 Alexis 在 2017 年 8 月发表的一篇博客 GitOps - Operations by Pull Request。文章介绍了 Weaveworks 的工程师如何以 Git 作为事实的唯一真实来源&#xff0c;部署、管理和监控基于 Kubernetes 的 SaaS 应用。 随后&…

老码农吐血建议:2020年,低于1w的程序员要注意了...

最近在知乎上&#xff0c;关于AI的这个话题又被顶起来&#xff0c;其中&#xff0c;这条回答让人印象深刻&#xff1a;在这短短的一条信息里&#xff0c;无疑显示出&#xff1a;AI行业缺人&#xff0c;高端岗位80万年薪恐怕也招不来&#xff01;小编上周在一个AI群里&#xff0…

重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案&#xff0c;是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统&#xff0c;并于 2015 年正式发布。2016 年&#xff0c;Prometheus 正式加入 Cloud Native Computing Foundation&#xff0c;成为受欢迎度仅次于…

Archsummit 2019重磅分享|闲鱼Flutter&FaaS云端一体化架构

作者&#xff1a;闲鱼技术&#xff0d;国有   讲师介绍 国有&#xff0c;闲鱼架构团队负责人。在7月13号落幕的2019年Archsummit峰会上就近一年来闲鱼在Flutter&FaaS一体化项目上的探索和实践进行了分享。 传统NativeWeb服务端混合开发的挑战 随着无线&#xff0c;Io…

Spring Cloud 云架构下的微服务架构:部门微服务(Dept)

作者 | springML来源 | CSDN 博客 责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;封图| CSDN下载于视觉中国 对于 Rest 基础架构实现处理是 SpringCloud 核心所在&#xff0c;其基本操作形式在 SpringBoot 之中已经有了明确的讲解&#xff0c;…

并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期&#xff0c;该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解&#xff0c;以帮助大家构建完整的性能压测的理论体系&#xff0c;并提供有例可依的实战。 该系列专…