编程分号的简要历史,分号的使用来自何处?

简介:

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


在本文中,我将简要介绍在计算机编程语言中使用分号(许多计算机科学入门学生的祸根)的历史。我们将看到分号有两种用途:作为语句分隔符和作为语句终止符,并且我们将了解在过去60多年的编程语言历史中分号的使用发生了怎样的变化。

为什么编程语言使用分号

分号在编程语言中用于两件事:语句分隔符和语句终止符。当一种语言使用分号作为语句分隔符时,这允许您在同一行上编写多个语句,并使用分号来标记语句的分隔,以便编译器或解释器可以找出一个语句在哪里结束而另一条语句在哪里开始。

在以分号为分隔符的语言中,分号被视为可选的,当一行代码仅包含一条语句时,通常不会编写分号。

作为语句结束符的分号是不可选的,用于明确地标记语句的结束,使用分号作为终止符的编程语言将在分号不在其预期位置时标记错误。许多编程专家声称,以分号结尾的语句可以使程序更快,因为编译器可以更有效地执行,尽管我在本文末尾会对此主张提出异议。

早期的高级语言和分号的使用

当Fortran在20世纪50年代中期被作为一种高级编程语言引入时,编程语言的史前时代就结束了,Fortran既不使用分号作为语句分隔符,也不使用分号作为语句终止符,Fortran中的语句每行只能写一个,而新行是语句终止符。

在现代编程语言中首次使用分号是ALGOL 58,然而,这个版本并没有得到很好的实现,它很快就变成了ALGOL 60。这个早期版本的ALGOL使用分号作为分隔符,尽管分号经常被多余地用作语句结束符(尽管这不是必需的)。分号的这种混合使用可能会导致非常混乱的程序,分号通常放在某些行的末尾,而不是其他的行末尾,如我从Steve Maurer的网站上借来的ALGOL 60代码片段所示:

1

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 ;

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

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-11
本文作者:杜尼卜
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
12月前
|
监控 Java Go
深入探索 RUM 与全链路追踪:优化数字体验的利器
本文主要介绍了基于 OpenTeletemetry 与 W3C 协议构建端到端全链路的解决方案,同时探讨了 RUM 与端到端链路集成的最佳实践,希望可以为大家在生产环境落地应用提供一些参考。
614 113
|
9月前
|
机器学习/深度学习 边缘计算 人工智能
迎接混合云下半场:Hybrid WAN赋能智能化的未来之路
Gartner预测,至2027年90%的企业将采用混合云策略,标志混合云在企业IT战略中的核心地位。文章探讨了混合云与边缘计算、AI及机器学习的结合对信息技术领域的影响,以及企业在混合云部署中面临的灵活性与安全性、低延迟与高效连接、成本控制等挑战。通过介绍Hybrid WAN解决方案及其在智能汽车和制造业的应用案例,展示了如何通过智能化网络管理、高性能连接和灵活的成本控制来克服这些挑战,实现混合云的高效部署。
 迎接混合云下半场:Hybrid WAN赋能智能化的未来之路
|
安全 JavaScript Swift
Swift开发——输出格式化字符
这篇文章介绍了Swift语言的基本概念和格式化输出方法。Swift是苹果平台的官方编程语言,强调类型安全,使用`main.swift`作为程序入口。文章通过示例展示了如何使用`print`函数进行格式化字符串输出,包括控制整数和浮点数的宽度、对齐方式以及使用`String(format:)`函数。示例代码创建了一个名为Ch0001的工程,并展示了不同输出方式,如常规输出、格式化输出和使用`\(`常量名或变量名`)`的形式。最后,文章给出了程序的运行结果截图。
169 0
Swift开发——输出格式化字符
|
11月前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
388 2
|
Linux 测试技术 iOS开发
Meson:现代的构建系统
Meson:现代的构建系统
662 0
|
算法 编译器 C语言
【C/C++ 编译器的差异化】C++标准库在GCC和VS之间的表现差异
【C/C++ 编译器的差异化】C++标准库在GCC和VS之间的表现差异
1319 1
|
11月前
|
SQL NoSQL 数据处理
深入探索MongoDB的聚合操作
【10月更文挑战第13天】
259 0
|
XML Java 数据格式
深入探索Spring的Bean注入:四种方式解析与循环依赖探讨
深入探索Spring的Bean注入:四种方式解析与循环依赖探讨
333 0
|
开发者 Python
软件开发中的 DRY、KISS 和 SOLID 原则
**软件开发中的DRY、KISS和SOLID原则概览** - **DRY (Don't Repeat Yourself)**: 避免代码重复,确保每项知识在系统中有唯一表示,减少冗余,提高可维护性。例如,通过封装重复逻辑到函数或类。
271 0
|
Java Nacos 开发者
解决Spring Cloud整合Nacos与Gateway的探险之旅
解决Spring Cloud整合Nacos与Gateway的探险之旅
592 0