编程分号的简要历史,分号的使用来自何处?
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
在本文中,我将简要介绍在计算机编程语言中使用分号(许多计算机科学入门学生的祸根)的历史。我们将看到分号有两种用途:作为语句分隔符和作为语句终止符,并且我们将了解在过去60多年的编程语言历史中分号的使用发生了怎样的变化。
为什么编程语言使用分号
分号在编程语言中用于两件事:语句分隔符和语句终止符。当一种语言使用分号作为语句分隔符时,这允许您在同一行上编写多个语句,并使用分号来标记语句的分隔,以便编译器或解释器可以找出一个语句在哪里结束而另一条语句在哪里开始。
在以分号为分隔符的语言中,分号被视为可选的,当一行代码仅包含一条语句时,通常不会编写分号。
作为语句结束符的分号是不可选的,用于明确地标记语句的结束,使用分号作为终止符的编程语言将在分号不在其预期位置时标记错误。许多编程专家声称,以分号结尾的语句可以使程序更快,因为编译器可以更有效地执行,尽管我在本文末尾会对此主张提出异议。
早期的高级语言和分号的使用
当Fortran在20世纪50年代中期被作为一种高级编程语言引入时,编程语言的史前时代就结束了,Fortran既不使用分号作为语句分隔符,也不使用分号作为语句终止符,Fortran中的语句每行只能写一个,而新行是语句终止符。
在现代编程语言中首次使用分号是ALGOL 58,然而,这个版本并没有得到很好的实现,它很快就变成了ALGOL 60。这个早期版本的ALGOL使用分号作为分隔符,尽管分号经常被多余地用作语句结束符(尽管这不是必需的)。分号的这种混合使用可能会导致非常混乱的程序,分号通常放在某些行的末尾,而不是其他的行末尾,如我从Steve Maurer的网站上借来的ALGOL 60代码片段所示:
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
本文作者:杜尼卜
本文来自:“掘金”,了解相关信息可以关注“掘金”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2021算法岗基础技能树怎么点?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 0 - 前言 注:本文默认传统算法是所有工程师的基础技能,所以后面提到的算法主要指机器学习以及深度学习等算法。 尽管目前本人求职的重心还是在后端上,但是为了能从现在的人工智能专业硕士顺利毕业,也为了让自己顺便拓展算法工程这条路,简单的规划一下算法这部分需要补的知识和技能还是有必要的。 本文以拿到2021算法岗Offer为目标,从2020的算法岗面经入手,分析需要点的技能树都有哪些。 1 - 不同算法岗的区别 首先需要说明的一个地方就是,不同领域的技术岗位,都会按照接触科研和业务的程度来进行一定的区分。 可以简单参考知乎上霍华德在问题“学术界科研(research)与工业界研发(R&D)有什么区别?”的回答[1],算法岗可以大致分为: 业务导向,大部分情况下以Development为主; 技术导向,Research和Development兼顾; 科研导向,大部分情况下会Research为主; 近几年这一点在算法岗上表现体现的比较明显,因为在几年前大部分算法都还只在研究阶段,而最近随...
- 下一篇
一篇文章写明白Java的值传递
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 先从一道面试题说起: 查看答案: 值与引用 为了纠正值传递和引用传递的一些误解,此处探讨的并不是值类型和引用类型,而是赋值操作时对各部分的名称。 以上面面试题为例,有 Point p1 = new Point(0, 0); 变量p1里存储着实际对象的地址,一般称这种变量为"引用",引用指向实际对象,我们称实际对象为该引用的值;赋值操作符=实际上做的就是将引用指向值的地址的工作,如果我们有p1 = new Point(3,3); 的话,情形就是这样: 我们要注意到,在堆中的对象Print(0,0) 并没有发生改变,改变的只有引用p1 指向的地址。 值与引用就是以上这些,而值传递和引用传递,和这些一点关系也没有。 值传递和引用传递 我们可以找到网上资料对值传递的定义,大多是这样的: 在方法调用时,传入方法内部的是实参引用的拷贝,因此对形参的任何操作都不会影响到实参。 这句话本身对值传递的定义是比较准确的,但由于前后的矛盾和概念的盲区,让我们理解起来产生了歧义,概况起来歧义有三: 既然传递的是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路