COBOL
范例 | 程序性,命令性,面向对象,通用 |
---|---|
设计 | 霍华德·布罗姆伯格(Howard Bromberg),诺曼(Norman)折扣,弗农·里夫斯( Vernon Reeves) ,让·E ·萨米特(Jean E. |
开发人员 | codasyl , ANSI , ISO / IEC |
首先出现 | 1959 |
稳定版本 | ISO / IEC 1989:2023/2023 |
打字学科 | 弱,静态 |
文件名扩展 |
.cbl ,.cob ,.cpy
|
主要实施 | |
gnucobol , IBM COBOL ,微聚焦视觉COBOL | |
方言 | |
COBOL/2,DEC COBOL-10,DEC PDP-11 COBOL,DEC PDP-11 COBOL-85,DEC VAX COBOL,DOSVS COBOL,ENVYR ICOBOL,FUJITSU COBOL,HITACHI COBOL,HITACHI COBOL2002,HP3000 COBOL/II,IBM COBOL SAA ,IBM COBOL,IBM COBOL,IBM COBOL,IBM COBOL,IBM COBOL /400,IBM COBOL/II,IBM Enterprise COBOL,IBM ILE COBOL,IBM OS/VS COBOL,ICL COBOL(VME),Micro Focus Acucobol-GT,Micro Focus Cobol-IT,Micro Focus RM/Cobol,Micro Cosib rm/cobol,Micro focus Visual Cobol ,Microsoft COBOL,RAIN COD COBOL,REALIA COBOL,RYAN MCFARLAND RM/COBOL,RYAN MCFARLAND RM/COBOL-85,TANDEM(NONSTOP) COBOL,TANDEM(NONSTOP)SCOBOL,SCOBOL,UNIVAC COBOL,UNIVAC COBOL,UNISYS MCP COBOL 74,UNISYS MCCP COBOL,UNISYS MCP COBOL85,UNIX COBOL 85,UNIX /开放的,非常伊斯科咖啡,王vs cobol | |
被影响 | |
初始:Aimaco,Comtran,事实,流程COBOL 2002:C ++,EIFFEL,SMALLTALK | |
受影响 | |
cobolscript , egl , pl/i , pl/b | |
|
COBOL ( ; “以商业为导向的语言”的首字母缩写词是一种旨在商业使用的英语式计算机编程语言。自2002年以来,这是一种势在必行的,程序性的语言。 COBOL主要用于公司和政府的商业,金融和行政系统。 COBOL仍然广泛用于部署在大型计算机上的应用程序中,例如大规模批处理和交易处理作业。直到2006年,许多大型金融机构都在开发该语言的新系统,但是当今COBOL的大多数编程纯粹是为了维护现有的应用程序。程序正在转移到新平台,用现代语言重写或替换为其他软件。
Cobol是由Codasyl于1959年设计的,部分基于Grace Hopper设计的编程语言流程。它是作为美国国防部努力的一部分而创建的,以创建一种用于数据处理的便携式编程语言。它最初被视为定格,但国防部迅速迫使计算机制造商提供它,从而广泛采用。它在1968年进行了标准化,已进行了五次修订。扩展包括对结构化和面向对象的编程的支持。当前的标准是ISO / IEC 1989:2023。
COBOL语句具有散文语法,例如MOVE x TO y
,旨在自我纪念碑且高度可读。但是,它是冗长的,使用300多个保留单词。这与其他语言的简洁和数学启发的语法形成鲜明对比(在这种情况下,y = x;
).
COBOL代码分为四个部门(标识,环境,数据和程序),其中包含刻度,段落和句子的严格层次结构。该标准缺乏大型标准库,指定了43个语句,87个功能,只有一个类。
创建COBOL并且没有参与其设计时,学术计算机科学家通常对业务应用不感兴趣。它(有效地)是从头开始设计的,是一种用于业务的计算机语言,重点是输入和输出,其数据类型是文本的数字和字符串。
COBOL因其详细性,设计过程和对结构化编程的支持不佳而受到批评。这些弱点会导致整体程序,尽管它们的本地可读性很难理解。
多年来,COBOL一直被认为是大型机业务运营的编程语言,尽管近年来,许多COBOL操作已转移到云计算。
历史和规范
年 | 非正式名称 | ANSI煽动标准 | ISO/IEC标准 |
---|---|---|---|
1960 | COBOL-60 | — | — |
1961 | COBOL-61 | — | — |
1963 | COBOL-61扩展 | — | — |
1965 | COBOL-65 | — | — |
1968 | COBOL-68 | X3.23-1968 | — |
1974 | COBOL-74 | X3.23-1974 | — |
1985 | COBOL-85 | X3.23-1985 | 1989:1985 |
2002 | COBOL-2002 | — | 1989:2002 |
2014 | COBOL-2014 | — | 1989:2014 |
2023 | COBOL-2023 | — | 1989:2023 |
背景
在1950年代后期,计算机用户和制造商开始关注编程成本上升。 1959年的一项调查发现,在任何数据处理安装中,该编程平均成本为800,000美元,而翻译以新硬件运行的程序将花费60万美元。在新的编程语言激增的时候,同样的调查表明,如果使用了一种以商业为导向的通用语言,则转换将更便宜,更快。
1959年4月8日, Burroughs Corporation的计算机科学家玛丽·霍斯(Mary K.代表包括Grace Hopper (类似英语数据处理语言流程的发明者), Jean Sammet和Saul Gorn 。
在4月的会议上,该小组要求国防部(DOD)赞助创建通用商业语言的努力。代表团给国防部数据系统研究人员的主任查尔斯·菲利普斯(Charles A. Phillips)留下了深刻的印象,他们认为他们“完全理解”了国防部的问题。国防部运营了225台计算机,还有175台的订单,并花费了超过2亿美元来实施程序来运行它们。便携式程序将节省时间,降低成本并轻松现代化。
查尔斯·菲利普斯(Charles Phillips)同意赞助会议,并任命代表团起草议程。
COBOL 60
1959年5月28日至29日(苏黎世Algol 58会议之后的一年),在五角大楼举行了一次会议,讨论创建一种常见的企业编程语言。它有41人参加,并由菲利普斯(Phillips)主持。国防部担心它是否可以在不同计算机上运行相同的数据处理程序。 Fortran是当时唯一的主流语言,缺少编写此类程序所需的功能。
代表热情地描述了一种可以在各种环境中起作用的语言,从银行和保险到公用事业和库存控制。他们一致同意,更多的人应该能够编程,并且新语言不应受到当代技术的局限性的限制。多数人同意该语言应最大程度地使用英语,能够更改,与机器独立并易于使用,即使以权力为代价也是如此。
会议导致成立了一个指导委员会以及简短,中间和远程委员会。短期委员会的委员会持续到9月(三个月),以制定临时语言的规格,然后其他委员会将改进。但是,他们的正式任务是确定现有编程语言的优势和劣势,并没有明确指示他们创建一种新语言。
截止日期被短期委员会难以置信。一位成员贝蒂·霍尔伯顿(Betty Holberton)将三个月的截止日期描述为“非常乐观”,并怀疑该语言确实会成为一个定格。
指导委员会于6月4日开会,并同意将整个活动命名为数据系统语言委员会或Codasyl ,并组成执行委员会。
短期委员会成员代表六家计算机制造商和三个政府机构。计算机制造商是Burroughs Corporation , IBM , Minneapolis-Honeywell (Honeywell Labs), RCA , Sperry Rand和Sylvania Electric Products 。政府机构是美国空军,海军的戴维·泰勒(David Taylor)模特盆地和国家标准局(现为国家标准技术研究所)。该委员会由美国国家标准局的约瑟夫·韦格斯坦(Joseph Wegstein)主持。工作首先研究数据描述,声明,现有应用程序和用户体验。
委员会主要检查了流动性, AIMACO和COMTRAN编程语言。流程语言特别有影响力,因为它已经实施,并且Aimaco是它的衍生物,只有很小的变化。 Flow-Matic的发明家Grace Hopper也是委员会的技术顾问。 Flow-Matic对COBOL的主要贡献是较长的可变名称,命令的英语单词以及数据描述和说明的分离。
霍珀有时被称为“ Cobol的母亲”或“ Cobol的祖母”,尽管Cobol的首席设计师Jean Sammet说,Hopper“不是Cobol的母亲,创造者或开发人员”。
由鲍勃·贝默(Bob Bemer)发明的IBM的Comtran语言被由格蕾丝·霍珀(Grace Hopper)的同事组成的短期委员会视为流程委员会的竞争对手。它的某些功能没有被纳入COBOL,因此看起来IBM似乎已经主导了设计过程,而Jean Sammet在1981年表示,某些委员会成员(包括她本人)有“强烈的反IBM偏见”。在一个案例中,在Comtran手册和中级委员会成员的作者Roy Goldfinger参加了一次小组委员会会议以支持他的语言并鼓励使用代数表达式的小组委员会会议,Grace Hopper向Sphrange委员会发送了一份备忘录。努力创建基于英语的语言。
1980年,格雷斯·霍珀(Grace Hopper)评论说,“ Cobol 60是95%的流动性”,而Comtran具有“极小”的影响力。此外,她说她会声称工作受到流动和comtran的影响,只是“让其他人感到高兴,这样他们就不会试图将我们淘汰”。
COMTRAN的功能包括在COBOL中,包括公式,PICTURE
条款,改进IF
语句,消除了对TOS的需求,以及更强大的文件管理系统。
委员会工作的有用性是辩论的主题。虽然一些成员认为该语言的妥协性太多,并且是委员会设计的结果,但另一些人则认为这比所检查的三种语言要好。有些人认为这种语言太复杂了。其他,太简单了。
有争议的功能包括一些被认为是无用的或对于数据处理用户而言太过高级的功能。这些功能包括布尔表达式,公式和表订阅(指数)。另一个争议的要点是是否要使关键字对上下文敏感以及对可读性的影响。尽管上下文敏感的关键字被拒绝,但该方法后来在PL/I中使用,并且从2002年开始在COBOL中进行部分使用。几乎没有考虑交互性,与操作系统的互动(当时很少存在)和功能(认为是纯粹的数学并且在数据处理中无用)。
规格于9月4日提交给执行委员会。他们没有期望:约瑟夫·韦格斯坦(Joseph Wegstein)指出,“它包含粗糙的斑点并需要一些加法”,鲍勃·贝默(Bob Bemer)后来将其描述为“霍奇普奇”。给出小组委员会直到12月进行改进。
在9月中旬的会议上,委员会讨论了新语言的名称。建议包括“繁忙”(业务系统),“ Infosyl”(信息系统语言)和“ cocosyl”(常见的计算机系统语言)。目前尚不清楚谁创造了“ Cobol”这个名字,尽管鲍勃·贝默(Bob Bemer)后来声称这是他的建议。
10月,中级委员会收到了罗伊·纳特(Roy Nutt)创建的事实语言规范的副本。它的功能给委员会留下了深刻的印象,以至于他们通过了一项决议来基于COBOL。
这是对短期委员会的打击,后者在规格上取得了良好的进步。尽管从技术上讲是优越的,但事实并未通过可移植性或通过制造商和用户共识而创建。它还缺乏可证明的实现,使基于流动的COBOL的支持者可以推翻该分辨率。 RCA代表霍华德·布罗姆伯格(Howard Bromberg)也封锁了事实,因此RCA在COBOL实施方面的工作不会浪费。
很快,委员会太大了,无法迅速取得进一步的进展。一个沮丧的霍华德·布罗姆伯格(Howard Bromberg)购买了一个$ 15的墓碑,上面刻有“ Cobol”,并将其发送给查尔斯·菲利普斯(Charles Phillips),以表现出他的不满。
成立了一个小组委员会来分析现有语言,并由六个人组成:
- IBM的William Selden和Gertrude Tierney,
- 霍华德·布罗姆伯格(Howard Bromberg)和霍华德(Howard)折扣,
- Sylvania Electric Products的Vernon Reeves和Jean E. Sammet 。
小组委员会做了大部分工作,创建了规格,使短期委员会在制作完成的规范之前审查和修改其工作。
该规格于1960年1月8日得到执行委员会的批准,并送往政府印刷办公室,该办公室将其印刷为COBOL 60 。该语言的陈述目标是允许易于编写高效,便携式程序,以使用户能够以最少的努力和成本转移到新系统,并适合经验不足的程序员。
Codasyl执行委员会后来成立了COBOL维护委员会,以回答用户和供应商的问题,并改善和扩展规格。
1960年,计划建造COBOL编译器的制造商名单不断增长。到9月,又有五个制造商加入了Codasyl( Bendix , Control Data Corporation , GE GE), National Cash登记册和Philco ),所有代表的制造商都宣布了Cobol编译器。 GE和IBM计划分别将Cobol整合到自己的语言中,Gecom和Comtran。相比之下,国际计算机和制表符计划用COBOL替换其语言Codel。
同时,RCA和Sperry Rand致力于创建COBOL编译器。第一个COBOL计划于8月17日在RCA 501上运行。12月6日和7日,同一COBOL计划(尽管有较小的更改)在RCA计算机和Remington-Rand Univac计算机上运行,这表明可以实现兼容性。
在所有COBOL参考手册中印刷的建议咨询中,使用哪种语言的相对影响一直持续到今天:
COBOL是一种行业语言,不是任何公司或公司集团,或任何组织或组织组的财产。
任何贡献者或Codasyl Cobol委员会对编程系统和语言的准确性和功能都没有明示或暗示的保修。此外,与此有关的任何贡献者或委员会都不承担任何责任。本文使用的版权材料的作者和版权持有人如下:
- Flow-Matic( Unisys Corporation的商标),Unisys Corporation的1958年,1958年版权所有的数据自动化系统的编程(R)I和II,数据自动化系统; IBM商业翻译表编号F28-8013,IBM 1959年版权保护;事实,DSI 27a5260-2760,由明尼阿波利斯 - 霍尼韦尔(Minneapolis-Honeywell)1960年获得版权保护。
他们在COBOL规范中全部或部分地授权了该材料的使用。此类授权扩展到在编程手册或类似出版物中的复制和使用COBOL规范。
COBOL-61至COBOL-65
在十年末,COBOL不太可能出现。
匿名,1960年6月
在Cobol 60中发现了许多逻辑缺陷,导致通用电气的Charles Katz警告说,它不能明确地解释。一个不情愿的短期委员会进行了全面的清理工作,到1963年3月,据报导,尽管语义歧义仍然存在,但Cobol的语法与Algol一样可定义。
COBOL是一种很难编写编译器的语言,由于语法构造中的较大语法和许多可选元素,并且需要为具有许多可能的数据表示的语言生成有效的代码,并具有许多可能的数据表示,并具有隐性类型的转换以及必要的设置- I/O操作的UPS。早期的COBOL编译器是原始的且缓慢的。 1962年的美国海军评估发现,每分钟的汇编速度为3-11个声明。到1964年中期,他们已经增加到每分钟的11-1000个声明。据观察,内存的增加将大大提高速度,并且汇编成本差异很大:每陈述成本在0.23美元至18.91美元之间。
1962年底,IBM宣布COBOL将是他们的主要发展语言,而Comtran的发展将停止。
COBOL规格在发布后的五年内进行了三次修订。 COBOL-60在1961年被COBOL-61取代。然后,这被1963年的COBOL-61扩展规格所取代,该规范介绍了作者设施和报告作者设施。霍尼韦尔(Honeywell)在1959年底在致短期委员会的一封信中纠正了霍尼韦尔(Honeywell)确定的缺陷。 1965年,Cobol Edition对规格进行了进一步的澄清,并引入了处理大众存储文件和表的设施。
COBOL-68
努力开始标准化COBOL以克服版本之间的不兼容。 1962年底,ISO和美国标准研究所(现为ANSI )组成了制定标准的团体。 ANSI于1968年8月生产了美国标准COBOL X3.23 ,成为后来版本的基石。该版本被称为美国国家标准(ANS)COBOL,并在1972年被ISO采用。
COBOL-74
到1970年,COBOL已成为世界上使用最广泛的编程语言。
Codasyl编程语言委员会独立于ANSI委员会,正在努力改善该语言。他们描述了1968年,1969年,1970年和1973年的新版本,包括新的程序间通信,调试和档案合并设施以及改进的弦乐处理和图书馆包含功能。
尽管Codasyl独立于ANSI委员会,但ANSI使用了Codasyl开发杂志来识别足够受欢迎以保证实施的功能。编程语言委员会还与ECMA和日本COBOL标准委员会联络。
但是,编程语言委员会并不是众所周知。副总统威廉·莱恩霍尔斯(William Rinehuls)抱怨说,科博尔社区的三分之二不知道该委员会的存在。它还缺乏提供公开文件的资金,例如会议记录会议和更改建议,可以免费提供。
1974年,ANSI发布了(ANS)COBOL的修订版,其中包含新功能,例如文件组织,DELETE
语句和细分模块。删除的功能包括NOTE
声明,EXAMINE
声明(被取代INSPECT
)和实现者定义的随机访问模块(由新的顺序和相对I/O模块取代)。这些构成了44个更改,这使现有声明与新标准不符。报告作者计划将其从COBOL中删除,但在发布该标准之前已恢复。 ISO后来采用了1978年更新的标准。
COBOL-85
1978年6月,开始修改COBOL-74。拟议的标准(通常称为COBOL-80)与上一张标准有很大差异,这引起了人们对不兼容和转换成本的担忧。 1981年1月,旅行者保险的高级副总裁约瑟夫·布罗菲(Joseph T. Brophy)威胁要起诉标准委员会,因为它与COBOL-74不兼容。 Brophy先生将其4000万代码基础的先前转换描述为“非生产性”和“完全浪费我们的程序员资源”。那年晚些时候,数据处理管理协会(DPMA)表示,它“强烈反对”新标准,理由是“强制性”的转换成本和“强迫用户”的增强。
在第一个公开审查期间,委员会收到了2,200份答复,其中1,700个是负面的表格。其他响应是对COBOL-80对其系统的影响的详细分析。预计每行代码至少将至少50美分。不到十二个响应都支持拟议的标准。
ISO TC97-SC5于1979年安装了Wim Ebbinkhuijsen的倡议,于1979年安装了国际COBOL专家集团。该小组由来自包括美国在内的许多国家的COBOL专家组成。它的目标是就新的COBOL特征的需求,在ANSI与世界其他地区之间相互理解和尊重。三年后,ISO将小组的状态更改为正式工作组: WG 4 COBOL 。该集团获得了COBOL标准的主要所有权和开发,ANSI在此提出了大多数建议。
1983年,DPMA以委员会对公众关注的响应能力为由,撤回了对标准的反对。同年,一项国家标准局的研究得出结论,拟议的标准几乎没有问题。一年后, DEC发布了VAX/VMS COBOL-80,并指出COBOL-74程序的转换构成了很少的问题。新的EVALUATE
声明和内联PERFORM
得益于简化的控制流和调试,受到尤其好的接收和提高的生产率。
第二次公开审查又引起了1,000次(主要是负面)的回应,而最后一份则仅引起了25次的回应,到那时已经解决了许多担忧。
1985年,ISO工作组4接受了ANSI拟议的标准的当时转换,进行了几次更改,并将其设置为新的ISO标准COBOL85。它于1985年底发布。
更改或弃用了60个功能,并添加了115个功能,例如:
- 范围终结者(
END-IF
,END-PERFORM
,END-READ
, ETC。) - 嵌套子程序
-
CONTINUE
,无操作声明 -
EVALUATE
,一个开关语句 -
INITIALIZE
,可以将数据组设置为其默认值的语句 - 排队
PERFORM
循环主体 - 以前,必须在单独的过程中指定循环主体 - 参考修改,允许访问子字符串
- I/O状态代码。
新标准均由包括ANSI在内的所有国家标准机构采用。
在1989年和1993年进行了两项修正案,这是第一个引入内在功能的第一个修正案,而另一个提供了校正。
COBOL 2002和面向对象的COBOL
1997年,加特纳集团(Gartner Group)估计,存在共有2000亿行的COBOL,占所有业务计划的80%。
在1990年代初期,在COBOL的下一个完整修订中开始添加对象取向。面向对象的特征是从C ++和SmallTalk中获取的。
最初的估计是在1997年完成此修订,并在1997年获得ISO委员会草案(CD)。一些供应商(包括Micro Focus , Fujitsu和IBM )基于完整修订的草案引入了面向对象的语法。最终批准的ISO标准已于2002年底批准并发布。
Fujitsu/gtsoftware,Micro Focus和Rain Code引入了针对.NET框架的面向对象的COBOL编译器。
自1978年以来,还有许多其他新功能,其中许多是在Codasyl Cobol开发杂志上,并且错过了将COBOL-85纳入的机会。这些其他功能包括:
- 自由形式代码
- 用户定义的功能
- 递回
- 基于语言环境的处理
- 支持扩展字符集,例如Unicode
- 浮点和二进制数据类型(直到那时,二进制项目都根据声明的Base-10规范截断了)
- 便携式算术结果
- 位和布尔数据类型
- 用于获取和释放存储的指针和语法
- 这
SCREEN SECTION
用于基于文本的用户界面 - 这
VALIDATE
设施 - 改善了与其他编程语言和框架环境(例如.NET和Java)的互操作性。
为该标准出版了三个Crrigenda :2006年的两个Corrigenda,2009年发表了一个。
COBOL 2014
在2003年至2009年之间,制作了三份技术报告,描述了COBOL的对象最终化, XML处理和收集类。
COBOL 2002的支持不佳:没有编译器完全支持该标准。 Micro Focus发现,这是由于缺乏对新功能的用户需求以及废除NIST测试套件的需求,该套件已用于测试编译器的符合性。还发现标准化过程缓慢且资源不足。
COBOL 2014包括以下更改:
COBOL 2023
COBOL 2023标准添加了一些新功能:
- 异步消息语法使用
SEND
和RECEIVE
语句 - 交易处理设施与
COMMIT
和ROLLBACK
-
XOR
逻辑操作员 - 这
CONTINUE
可以扩展语句以在指定的持续时间内暂停该程序 - A
DELETE FILE
陈述 -
LINE SEQUENTIAL
文件组织 - 定义的无限循环
PERFORM UNTIL EXIT
-
SUBSTITUTE
内在功能允许替代不同长度 -
CONVERT
基础转换的功能 - 布尔转移操作员
目前尚无该标准的完整实施。
遗产
COBOL计划在政府和企业中用于全球,并在Z/OS , Z/VSE , VME ,UNIX, UNIX , NONSTOP OS, OPENVMS和WINDOWS等各种操作系统上运行。 1997年, Gartner Group报告说,全球80%的业务在COBOL上运行,每年编写超过2000亿行的代码和50亿行。
在20世纪末, 2000年的问题(Y2K)是COBOL编程工作的重点,有时是数十年来设计系统的同一程序员。纠正COBOL代码所需的特定努力归因于大量面向业务的COBOL,因为业务应用程序大量使用日期和固定的数据字段。一些研究将“ Y2K软件维修成本的24%”归因于COBOL。在为Y2K进行这些计划的清理工作之后,2003年的一项调查发现,许多人仍在使用。作者说,调查数据表明“在[以后] 10年中,COBOL在应用程序开发中的重要性逐渐下降,除非...与其他语言和技术集成,可以采用”。
在2006年和2012年,计算机世界调查(352名读者)发现,超过60%的组织使用COBOL(超过C ++和Visual Basic .NET ),并且对于其中一半的组织,COBOL用于大多数内部软件。 36%的经理表示,他们计划从COBOL迁移,而25%的经理说,如果不是为了重写旧版代码,他们将这样做。另外,一些企业将其COBOL计划从大型机迁移到更便宜,更快的硬件。
众议院在2016年之前的证词表明,许多联邦机构仍在使用COBOL。路透社在2017年报告说,有43%的银行系统仍使用了使用超过2200亿行的COBOL代码的COBOL。
到2019年,由于退休的退休,COBOL程序员的数量正在迅速缩小,这导致商业和政府组织中即将到来的技能差距,这些技能仍在使用大型货机进行高量交易处理。与代码维护的外包一样,用新语言重写系统的努力已被证明是昂贵且有问题的,因此,提倡培训更多COBOL的人的建议。
在Covid-19的大流行和随之而来的失业激增期间,美国几个州报告说,熟练的COBOL程序员短缺,无法支持用于失业福利管理的传统系统。这些系统中的许多系统都在大流行之前转换为更现代的编程语言,但是该过程被搁置了。同样,美国国税局急于修补其基于COBOL的单个主文件,以便为《冠状病毒援助,救济和经济安全法》规定的数千万付款。
特征
句法
Cobol具有类似英语的语法,用于描述程序中几乎所有内容。例如,条件可以表示为x IS GREATER THAN y
或更简洁x GREATER y
或者x > y
。可以通过删除重复的条件和变量来“缩写”更复杂的条件。例如,a > b AND a > c OR a = d
可以缩短到a > b AND c OR = d
。为了支持此语法,COBOL具有300多个关键字。某些关键字是同一单词的简单替代或多个拼写,它提供了更为适当的语句和从句。例如,IN
和OF
关键字可以互换使用,TIME
和TIMES
, 和VALUE
和VALUES
.
每个COBOL程序都由四个基本词汇项目组成:单词,文字,图片字符串(请参阅§图片条款)和分离器。单词包括保留的单词和用户定义的标识符。它们长31个字符,可能包括字母,数字,连字符和下划线。文字包括数字(例如12
)和弦(例如'Hello!'
)。分离器包括空间特征和逗号和半彩色,然后是空间。
COBOL计划分为四个部门:标识部,环境部,数据部和程序部。标识部指定源元素的名称和类型,是指定类和接口的位置。环境部指定取决于运行系统的任何程序功能,例如文件和字符集。数据除法用于声明变量和参数。该过程部门包含该程序的语句。每个部门都分为由段落组成的部分。
金属语言
COBOL的语法通常用牙套,支架,条和下划线的独特金属语言来描述。为原始COBOL规范开发了术语。尽管当时确实存在Backus -Naur形式,但委员会尚未听说过。
元素 | 外貌 | 功能 |
---|---|---|
所有首都 | 例子 | 保留的单词 |
下划线 | 例子 | 保留的单词是强制性的 |
牙套 | { } | 只能选择一个选项 |
括号 | [] | 可以选择零或一个选项 |
省略 | ... | 可以重复上述元素 |
酒吧 | {| |} | 可以选择一个或多个选项。任何选项只能选择一次。 |
[| |] | 可以选择零或更多选项。任何选项只能选择一次。 |
例如,请考虑以下描述ADD
陈述:
此描述允许以下变体:
ADD 1 TO x
ADD 1, a, b TO x ROUNDED, y, z ROUNDED
ADD a, b TO c
ON SIZE ERROR
DISPLAY "Error"
END-ADD
ADD a TO b
NOT SIZE ERROR
DISPLAY "No error"
ON SIZE ERROR
DISPLAY "Error"
代码格式
Cobol的受欢迎程度与关键机器和打孔卡时代相吻合。该程序本身被写入打孔卡上,然后阅读并编译,并且馈入该程序的数据有时也在卡片上。
COBOL可以以两种格式写:固定(默认)或免费。在固定格式中,必须对代码进行对齐以适合某些区域(使用打孔卡的持有)。直到Cobol 2002,这些都是:
姓名 | 列) | 用法 |
---|---|---|
序列编号区域 | 1–6 | 最初用于卡/线号(促进机械打孔卡排序以确保手动编辑/处理后预期的程序代码序列),该区域被编译器忽略 |
指示区域 | 7 | 这里允许以下字符:
|
区域 | 8–11 | 这包含:DIVISION ,SECTION 和程序标头; 01和77级数和文件/报告描述符 |
区域b | 12–72 | 区域中不允许其他任何其他代码 |
程序名称区域 | 73– | 从历史上讲,最多可用于打孔卡的80列,用于识别该卡属于的程序或序列 |
在COBOL 2002中,A和B区域合并以形成程序文本区域,该区域现在以实施者定义的列结束。
COBOL 2002还引入了自由格式代码。自由格式代码可以将其放置在文件的任何列中,例如在较新的编程语言中。使用的评论是使用*>
,可以将其放置在任何地方,也可以在固定格式源代码中使用。延续线不存在,>>PAGE
指令代替/
指标。
识别师
标识部门标识以下代码实体,并包含类或接口的定义。
面向对象的编程
自2002年以来,类和接口就一直在COBOL中。类具有工厂对象,其中包含类方法和变量以及包含实例方法和变量的实例对象。继承和接口提供多态性。通过参数化类提供了对通用编程的支持,可以将其实例化以使用任何类或接口。对像被存储为可能仅限于某种类型的参考。有两种调用方法的方法:INVOKE
声明,行动与CALL
,或通过内联方法调用,类似于使用函数。
*> These are equivalent.
INVOKE my-class "foo" RETURNING var
MOVE my-class::"foo" TO var *> Inline method invocation
COBOL不提供隐藏方法的方法。但是,可以通过在没有一个的情况下声明该类别的类数据PROPERTY
子句,这使外部代码无法访问它。在COBOL 2014中添加了方法过载。
环境部
环境部门包含配置部分和输入输出部分。配置部分用于指定变量功能,例如货币标志,位置和字符集。输入输出部分包含与文件相关的信息。
文件
COBOL支持三种文件格式或组织:顺序,索引和相对。在顺序文件中,记录是连续的,必须依次对链接列表进行顺序遍历。索引文件具有一个或多个索引,可以随机访问记录,并且可以对其进行排序。每个记录必须具有唯一的钥匙,而其他备用的备用键则不必是唯一的。供应商之间的索引文件的实现不同,尽管C-ISAM和VSAM等共同的实现基于IBM的ISAM 。其他实现是OpenVM上的记录管理服务,并在HPE NONSTOP (TANDEM)上进行订阅。相对文件,例如索引文件,具有唯一的记录密钥,但它们没有其他键。相对记录的关键是其序地位置;例如,第10个记录的键为10。这意味着创建具有5个键的记录可能需要创建(空的)先前记录。相对文件还允许顺序和随机访问。
常见的非标准扩展名是线顺序组织,用于处理文本文件。文件中的记录由newline终止,可能长度不同。
数据部门
数据部门分为六个部分,这些部分声明不同的项目:文件部分,用于文件记录;用于静态变量的工作存储部分;本地存储部分,用于自动变量;链接部分,用于参数和返回值;报告部分和屏幕部分,用于基于文本的用户界面。
汇总数据
COBOL中的数据项通过使用级别数字来层次声明,该级别数字指示数据项是否是另一个数据项。一个具有较高级别数的项目从属于一个较低的项目。顶级数据项,级别数为1,称为记录。具有从属汇总数据的项目称为组项目;那些不称为基本项目。用于描述标准数据项的水平数在1到49之间。
01 some-record. *> Aggregate group record item
05 num PIC 9(10). *> Elementary item
05 the-date. *> Aggregate (sub)group record item
10 the-year PIC 9(4). *> Elementary item
10 the-month PIC 99. *> Elementary item
10 the-day PIC 99. *> Elementary item
在上面的示例中,基本项目num
和小组项目the-date
从属记录some-record
,而基本项目the-year
,the-month
, 和the-day
是小组项目的一部分the-date
.
下属项目可以与IN
(或者OF
)关键字。例如,考虑上面的示例代码以及以下示例:
01 sale-date.
05 the-year PIC 9(4).
05 the-month PIC 99.
05 the-day PIC 99.
名字the-year
,the-month
, 和the-day
本身是模棱两可的,因为用这些名称定义了多个数据项。要指定特定数据项,例如,sale-date
组,程序员将使用the-year IN sale-date
(或等效的the-year OF sale-date
)。该语法类似于大多数当代语言支持的“点符号”。
其他数据水平
不管这些项目的结构如何,使用66的水平数字来声明对先前定义的项目的重新组合。此数据级别,也是由关联的RENAMES
条款很少使用,大约在1988年,通常在旧程序中找到。它忽略层次结构和逻辑结构数据的能力意味着不建议使用其使用,并且许多安装禁止其使用。
01 customer-record.
05 cust-key PIC X(10).
05 cust-name.
10 cust-first-name PIC X(30).
10 cust-last-name PIC X(30).
05 cust-dob PIC 9(8).
05 cust-balance PIC 9(7)V99.
66 cust-personal-details RENAMES cust-name THRU cust-dob.
66 cust-all-details RENAMES cust-name THRU cust-balance.
一个77级数表示该项目是独立的,在这种情况下,等效于级别数量01。例如,以下代码声明两个77级数据项,property-name
和sales-region
,是独立于(不下属)任何其他数据项的非小组数据项:
77 property-name PIC X(80).
77 sales-region PIC 9(5).
一个88级数声明条件名称(所谓的88级),当它的父数据项包含其在其中指定的值之一时,它是正确的VALUE
条款。例如,以下代码定义了两个88级条件名称项,这些项目是真或错误的,具体取决于当前字符数据值wage-type
数据项。当数据项包含一个值时'H'
,条件名称wage-is-hourly
是真的,而当它包含一个值时'S'
或者'Y'
,条件名称wage-is-yearly
是真的。如果数据项包含其他一些值,则两个条件名称都是错误的。
01 wage-type PIC X.
88 wage-is-hourly VALUE "H".
88 wage-is-yearly VALUE "S", "Y".
数据类型
标准COBOL提供以下数据类型:
数据类型 | 样本声明 | 笔记 |
---|---|---|
字母 |
PIC A(30)
|
可能只包含字母或空间。 |
字母数字 |
PIC X(30)
|
可能包含任何字符。 |
布尔 |
PIC 1 USAGE BIT
|
数据以0s和1s的形式存储为二进制编号。 |
指数 |
USAGE INDEX
|
用于参考表元素。 |
国家的 |
PIC N(30)
|
类似于字母数字,但使用扩展字符集,例如UTF-8 。 |
数字 |
PIC 9(5)V9(2)
|
完全包含7位数字(7 = 5+2)。 'v'将隐式小数定位在固定点号中。 |
目的 |
USAGE OBJECT REFERENCE
|
可以参考对像或NULL . |
指针 |
USAGE POINTER
|
类型安全性在COBOL中是可变的。数字数据在不同表示形式和尺寸之间转换,并且可以将字母数字数据放置在可以存储为字符串的任何数据项中,包括数字和组数据。相反,对象引用和指针只能从相同类型的项目中分配,其值可能仅限于某种类型。
图片条款
APICTURE
(或者PIC
)子句是一串字符,每个字符代表数据项的一部分及其可能包含的内容。一些图片字符指定项目的类型以及它在内存中占有多少个字符或数字。例如,9
表示十进制数字,一个S
表示该项目已签名。其他图片字符(称为插入和编辑字符)指定应该如何格式化项目。例如,一系列+
字符定义字符位置以及如何将领先的符号字符定义在最终字符数据中;最右的非数字字符将包含项目的符号,而其他字符位置对应于+
该位置的左侧将包含一个空间。可以通过在图片字符之后括号中指定一个数字来更简洁地指定重复字符;例如,9(7)
等同于9999999
。仅包含数字的图片规格(9
)和签名(S
)字符定义纯数字数据项,而图片规格包含字母(A
)或字母数字(X
)字符定义字母数字数据项。其他格式字符的存在定义了编辑的数字或编辑字母数字数据项。
PICTURE 条款 |
价值 | 价值 |
---|---|---|
PIC 9(5)
|
100
|
00100
|
"Hello"
|
"Hello" (这是合法的,但导致不确定的行为) |
|
PIC +++++
|
-10
|
" -10" (注意领先空间) |
PIC 99/99/9(4)
|
30042003
|
"30/04/2003"
|
PIC *(4)9.99
|
100.50
|
"**100.50"
|
0
|
"****0.00"
|
|
PIC X(3)BX(3)BX(3)
|
"ABCDEFGHI"
|
"ABC DEF GHI"
|
用法条款
这USAGE
子句声明存储数据的格式。根据数据类型,它可以补充或使用,而不是PICTURE
条款。虽然它可用于声明指针和对象引用,但主要旨在指定数字类型。这些数字格式是:
- 二进制,其中最小尺寸由
PICTURE
条款或通过USAGE
条款如BINARY-LONG
-
USAGE COMPUTATIONAL
,可以以实施提供的任何格式存储数据的地方;通常等同于USAGE BINARY
-
USAGE DISPLAY
,默认格式,其中数据存储为字符串 - 浮点,以实现依赖性格式或根据IEEE 754
-
USAGE NATIONAL
,使用扩展字符集将数据作为字符串存储 -
USAGE PACKED-DECIMAL
,数据以最小可能的小数格式存储(通常是包装的二进制十进制)
报告作者
报告作者是用于创建报告的声明性设施。程序员只需要指定报告布局及其生产所需的数据,从而使他们不得不编写代码来处理页面断路,数据格式以及标题和基础等内容。
报告与报告文件相关联,这些文件是只能通过报告作者语句写入的文件。
FD report-out REPORT sales-report.
每个报告都在数据部的报告部分中定义。报告分为报告组,以定义报告的标题,基础和细节。报告围绕分层控制断裂工作。当关键变量更改IT值时,就会发生控制断裂;例如,在创建详细介绍客户订单的报告时,当程序达到不同客户的订单时,可能会发生控制休息。这是报告的示例报告说明,该报告提供了销售人员的销售以及哪些无效记录的警告:
RD sales-report
PAGE LIMITS 60 LINES
FIRST DETAIL 3
CONTROLS seller-name.
01 TYPE PAGE HEADING.
03 COL 1 VALUE "Sales Report".
03 COL 74 VALUE "Page".
03 COL 79 PIC Z9 SOURCE PAGE-COUNTER.
01 sales-on-day TYPE DETAIL, LINE + 1.
03 COL 3 VALUE "Sales on".
03 COL 12 PIC 99/99/9999 SOURCE sales-date.
03 COL 21 VALUE "were".
03 COL 26 PIC $$$$9.99 SOURCE sales-amount.
01 invalid-sales TYPE DETAIL, LINE + 1.
03 COL 3 VALUE "INVALID RECORD:".
03 COL 19 PIC X(34) SOURCE sales-record.
01 TYPE CONTROL HEADING seller-name, LINE + 2.
03 COL 1 VALUE "Seller:".
03 COL 9 PIC X(30) SOURCE seller-name.
以上报告说明描述了以下布局:
Sales Report Page 1 Seller: Howard Bromberg Sales on 10/12/2008 were $1000.00 Sales on 12/12/2008 were $0.00 Sales on 13/12/2008 were $31.47 INVALID RECORD: Howard Bromberg XXXXYY Seller: Howard Discount ... Sales Report Page 12 Sales on 08/05/2014 were $543.98 INVALID RECORD: William Selden 12O52014FOOFOO Sales on 30/05/2014 were $0.00
四个语句控制报告作者:INITIATE
,这为报告作者准备打印;GENERATE
,打印报告组;SUPPRESS
,抑制了报告小组的打印;和TERMINATE
,终止报告处理。对于上述销售报告示例,过程部门可能看起来像这样:
OPEN INPUT sales, OUTPUT report-out
INITIATE sales-report
PERFORM UNTIL 1 <> 1
READ sales
AT END
EXIT PERFORM
END-READ
VALIDATE sales-record
IF valid-record
GENERATE sales-on-day
ELSE
GENERATE invalid-sales
END-IF
END-PERFORM
TERMINATE sales-report
CLOSE sales, report-out
.
报告作者设施的使用往往差异很大;一些组织广泛使用它,有些根本不使用。此外,报告作者的实现范围质量范围,下端有时会在运行时使用过多的内存。
程序部门
程式
程序部中的部分和段落(统称为程序)可以用作标签和简单的子例程。与其他部门不同,段落不需要段落。
执行通过程序的过程进行下降,直到终止为止。要使用程序作为子例程,PERFORM
动词被使用。
APERFORM
语句在某种意义上以一种新语言的方式与一个过程调用,因为执行将返回到遵循的代码PERFORM
在称为代码末尾的语句;但是,它不提供参数传递或返回结果值的机制。如果使用一个简单的语句来调用子例程PERFORM subroutine
,然后控制在调用过程的末尾返回。然而,PERFORM
不寻常的是,它可以用来调用跨越几个相邻过程的序列的范围。这是通过PERFORM sub-1 THRU sub-n
构造:
PROCEDURE so-and-so.
PERFORM ALPHA
PERFORM ALPHA THRU GAMMA
STOP RUN.
ALPHA.
DISPLAY 'A'.
BETA.
DISPLAY 'B'.
GAMMA.
DISPLAY 'C'.
该程序的输出将是:“ AABC”。
PERFORM
与传统程序呼叫的不同之处在于,至少传统上没有呼叫堆栈的概念。结果,可能是嵌套的调用(一系列代码为PERFORM
'ed可以执行PERFORM
语句本身),但如果通过两个调用执行相同代码的一部分,则需要额外注意。当内部调用中的代码到达外部调用的出口点时,就会出现问题。更正式地,如果控制通过PERFORM
提前调用但尚未完成的调用,COBOL 2002标准标准规定了行为不确定。
原因是COBOL而不是“返回地址”,可以用所谓的延续地址运行。当控制流达到任何过程的末尾时,持续地址会查找并将控制转移到该地址。在程序运行之前,将每个过程的连续地址初始化为程序文本中下一步的开始地址,以便如果没有PERFORM
语句发生,控制通过程序从上到下流动。但是当PERFORM
语句执行,它修改了所谓的过程的延续地址(或称为范围的最后一个过程,如果PERFORM THRU
使用),以便在末尾返回呼叫站点。原始值被保存并随后恢复,但是只有一个存储位置。如果两个嵌套的调用在重叠的代码上运行,则它们可能会以多种方式干扰彼此对延续地址的管理。
以下示例(取自Veerman&Verhoeven 2006 )说明了问题:
LABEL1.
DISPLAY '1'
PERFORM LABEL2 THRU LABEL3
STOP RUN.
LABEL2.
DISPLAY '2'
PERFORM LABEL3 THRU LABEL4.
LABEL3.
DISPLAY '3'.
LABEL4.
DISPLAY '4'.
人们可能会期望该程序的输出将为“ 1 2 3 4 3”:显示“ 2”后,第二个PERFORM
引起“ 3”和“ 4”的原因,然后以“ 3”继续进行第一个调用。在传统的COBOL实施中,情况并非如此。相反,第一个PERFORM
声明将延续地址设置在末尾LABEL3
这样它将跳回内部的呼叫网站LABEL1
。第二PERFORM
声明将回报设置在末尾LABEL4
但没有修改LABEL3
,期望它是默认的延续。因此,当内部调用到达末尾LABEL3
,它跳回外部PERFORM
声明,程序停止仅打印“ 1 2 3”。另一方面,在某些COBOL实现中,例如开源tinycobol编译器,两个PERFORM
语句不会彼此干扰,并且输出确实是“ 1 2 3 4 3”。因此,在这种情况下的行为不仅(也许)令人惊讶,而且也不是便携式的。
这种限制的特殊结果是PERFORM
不能用来编写递归代码。另一个简单的例子来说明这一点(略微简化了Veerman&Verhoeven 2006 ):
MOVE 1 TO A
PERFORM LABEL
STOP RUN.
LABEL.
DISPLAY A
IF A < 3
ADD 1 TO A
PERFORM LABEL
END-IF
DISPLAY 'END'.
人们可能会期望输出是“ 1 2 3端端”,实际上,这就是某些COBOL编译器会产生的。但是,其他编译器(例如IBM COBOL)将产生打印“ 1 2 3端端端端...”的代码,等等,在无尽的循环中一遍又一遍地打印“端”。由于存储备份延续地址的空间有限,因此在递归调用过程中,备份被覆盖DISPLAY 'END'
.
语句
COBOL 2014具有47个语句(也称为动词),可以将其分为以下广泛类别:控制流,I/O,数据操纵和报告作者。报告作者的报表在报告作者部分中介绍。
控制流
COBOL的有条件陈述是IF
和EVALUATE
.EVALUATE
是一个类似开关的语句,具有评估多个值和条件的附加功能。这可以用于实现决策表。例如,可以使用以下来控制CNC车床:
EVALUATE TRUE ALSO desired-speed ALSO current-speed
WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed
PERFORM speed-up-machine
WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed
PERFORM slow-down-machine
WHEN lid-open ALSO ANY ALSO NOT ZERO
PERFORM emergency-stop
WHEN OTHER
CONTINUE
END-EVALUATE
这PERFORM
语句用于定义循环,该循环是执行的,直到条件为真(不正确,在其他语言中更常见)。它也用于调用程序或过程范围(有关更多详细信息,请参见程序部分)。CALL
和INVOKE
分别调用子程序和方法。子程序/方法的名称包含在字符串中,该字符串可能是文字或数据项。参数可以通过参考,content(通过参考传递)或值(但仅在可用的原型时)传递。CANCEL
从内存卸载子程序。GO TO
使程序跳到指定的过程。
这GOBACK
语句是返回语句,STOP
声明停止程序。这EXIT
语句具有六种不同的格式:可以用作返回语句,中断语句,继续语句,结束标记或离开过程。
一个例外是由RAISE
陈述并被处理程序或声明性捕获DECLARATIVES
程序部的一部分。申报人士是从USE
声明指定要处理的错误。例外可以是名称或对象。RESUME
在声明的陈述中使用,在提出异常或在外面的程序之后跳到声明DECLARATIVES
。与其他语言不同,未被职的例外可能不会终止该程序,并且该程序可能不受影响。
I/O。
文件I/O由自称来处理OPEN
,CLOSE
,READ
, 和WRITE
陈述以及另外三个:REWRITE
,更新记录;START
,通过找到具有特定键的记录来选择以访问的后续记录;和UNLOCK
,它发布了最后访问的记录上的锁定。
用户互动是使用ACCEPT
和DISPLAY
.
数据操纵
以下动词操纵数据:
-
INITIALIZE
,将数据项设置为其默认值。 -
MOVE
,将值分配给数据项;移动相应的分配相应的类似命名字段。 -
SET
,具有15个格式:它可以修改索引,分配对象引用和更改表容器以及其他功能。 -
ADD
,SUBTRACT
,MULTIPLY
,DIVIDE
, 和COMPUTE
,处理算术(带有COMPUTE
将公式的结果分配给变量)。 -
ALLOCATE
和FREE
,哪个处理动态内存。 -
VALIDATE
,它根据项目分类中项目描述中指定的数据验证和分发数据。 -
STRING
和UNSTRING
,分别连接和拆分字符串。 -
INSPECT
,该,该字符串在字符串中替代指定子字符串的实例。 -
SEARCH
,搜索表格以满足条件的第一个条目。
文件和表使用SORT
和MERGE
动词合并和分类文件。这RELEASE
动词提供了分类的记录,RETURN
取回排序记录。
范围终止
一些陈述,例如IF
和READ
,可能包含语句。此类语句可以通过两种方式终止:通过一个期限(隐式终止),该陈述终止包含的所有未终止语句,或者由示波器终结者终止,该声明终止了最近的匹配开放语句。
*> Terminator period ("implicit termination")
IF invalid-record
IF no-more-records
NEXT SENTENCE
ELSE
READ record-file
AT END SET no-more-records TO TRUE.
*> Scope terminators ("explicit termination")
IF invalid-record
IF no-more-records
CONTINUE
ELSE
READ record-file
AT END SET no-more-records TO TRUE
END-READ
END-IF
END-IF
用一段时间终止的嵌套语句是错误的常见来源。例如,检查以下代码:
IF x
DISPLAY y.
DISPLAY z.
在这里,意图是显示y
和z
如果条件x
是真的。然而,z
将显示什么价值x
因为IF
声明被错误的时期终止DISPLAY y
.
另一个错误是悬而未决的问题的结果IF
语句可以与ELSE
.
IF x
IF y
DISPLAY a
ELSE
DISPLAY b.
在上面的片段中ELSE
与IF y
声明而不是IF x
语句,导致错误。在引入显式示波器终止器之前,请防止它需要ELSE NEXT SENTENCE
要放在内部IF
.
自修改代码
原始COBOL规范(1959)支持了臭名昭著的ALTER X TO PROCEED TO Y
声明,许多编译器生成了自修改代码。X
和Y
是过程标签,单个GO TO
过程中的声明X
这样的ALTER
陈述是指GO TO Y
反而。许多编译器仍然支持它,但在1985年的COBOL标准中被认为已过时,并于2002年被删除。
这ALTER
陈述之所以受到评价,是因为它破坏了“上下文的局部性”,并使程序的整体逻辑难以理解。正如教科书作者丹尼尔·D·麦克拉肯(Daniel D.声明本身在段落中,在整个程序中未知位置的一定数量的变更陈述的存在时,就会发出声明,这使最勇敢的程序员的心脏震惊。”
你好世界
COBOL中的“ Hello,World ”计划:
IDENTIFICATION DIVISION.
PROGRAM-ID. hello-world.
PROCEDURE DIVISION.
DISPLAY "Hello, world!"
.
现在著名的“你好,世界!” C编程语言中的程序示例于1978年首次发布,将通过JCL提交类似的大型机COBOL程序样本,很可能使用打孔卡读卡器和80列拳头卡。下面的列表使用Linux和System/370 Hercules模拟器运行MVS 3.8J测试了下面的清单。 JCL于2015年7月撰写,源自Jay Moseley主持的Hercules教程和样品。为了与那个时代的COBOL编程保持一致,Hello,所有大写字母都显示了世界。
//COBUCLG JOB (001),'COBOL BASE TEST', 00010000
// CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1) 00020000
//BASETEST EXEC COBUCLG 00030000
//COB.SYSIN DD * 00040000
00000* VALIDATION OF BASE COBOL INSTALL 00050000
01000 IDENTIFICATION DIVISION. 00060000
01100 PROGRAM-ID. 'HELLO'. 00070000
02000 ENVIRONMENT DIVISION. 00080000
02100 CONFIGURATION SECTION. 00090000
02110 SOURCE-COMPUTER. GNULINUX. 00100000
02120 OBJECT-COMPUTER. HERCULES. 00110000
02200 SPECIAL-NAMES. 00120000
02210 CONSOLE IS CONSL. 00130000
03000 DATA DIVISION. 00140000
04000 PROCEDURE DIVISION. 00150000
04100 00-MAIN. 00160000
04110 DISPLAY 'HELLO, WORLD' UPON CONSL. 00170000
04900 STOP RUN. 00180000
//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR 00190000
// DD DSNAME=SYS1.LINKLIB,DISP=SHR 00200000
//GO.SYSPRINT DD SYSOUT=A 00210000
// 00220000
提交JCL后,显示了MVS控制台:
19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST
19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED
19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1
19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING
19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING
19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING
19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode
19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000
19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000
19.52.48 JOB 3 +HELLO, WORLD
19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000
19.52.48 JOB 3 $HASP395 COBUCLG ENDED
上面列表的第10行是为了效果突出显示,突出显示不是实际控制台输出的一部分。
相关的编译器列表在技术细节和工作运行信息的四页上生成的列表,对于14行COBOL的单行输出行。
接待
缺乏结构
在1970年代,采用结构化编程范式越来越广泛。杰出的计算机科学家埃德斯格·迪克斯特(Edsger Dijkstra)在1975年发表了一封信给ACM通讯的编辑,题为“我们如何说出可能受伤的真相?”,他对Cobol和其他几种现代语言持批评态度;指出“使用Cobol会削弱思想”。
在对Dijkstra的言论的发表不同意的情况下,计算机科学家霍华德·E·汤普金斯(Howard E. Tompkins)声称,非结构化的COBOL倾向于“由从未有结构化COBOL受益的程序员撰写,认为该问题主要是培训之一。
意大利面条代码的原因之一是GO TO
陈述。尝试删除GO TO
但是,从COBOL代码中导致了复杂的程序并降低了代码质量。GO TO
S很大程度上被PERFORM
声明和程序,促进了模块化编程,并轻松访问了强大的循环设施。然而,PERFORM
只能与程序一起使用,因此循环体不在使用的位置,从而使程序更难理解。
COBOL计划臭名昭著,因为它是整体的,并且缺乏模块化。 COBOL代码只能通过程序进行模块化,而这些程序被认为是大型系统不足的。不可能限制对数据的访问,这意味着一个过程可以访问和修改任何数据项。此外,没有办法将参数传递给程序,一个遗漏的让·萨米特(Jean Sammet)被视为委员会最大的错误。
另一个并发症源于能力PERFORM THRU
指定的程序序列。这意味着控制可以跳到任何过程中并返回任何过程,创建复杂的控制流,并允许程序员打破单一输入的单外面规则。
随着COBOL采用更多功能,这种情况得到了改善。 COBOL-74添加了子程序,使程序员能够控制程序的每个部分都可以访问数据。然后,COBOL-85添加了嵌套子程序,使程序员可以隐藏子程序。对数据和代码的进一步控制在2002年,当时包括面向对象的编程,用户定义的功能和用户定义的数据类型。
然而,许多重要的旧版COBOL软件使用非结构化代码,这实际上已经无法实现。即使修改代码的一个简单的部分也可能太冒险和昂贵,因为它可以以未知的方式从未知的地方使用。
兼容性问题
COBOL旨在是一种高度便携式的“通用”语言。但是,到2001年,已经创建了大约300个方言。方言的一种来源是标准本身:1974年的标准由一个强制性核和11个功能模块组成,每个模块都包含两个或三个级别的支持。这允许104,976种可能的变体。
COBOL-85与早期版本并不完全兼容,并且其发展是有争议的。旅行者保险的CIO Joseph T. Brophy率先努力将实施新标准的重新编程成本告知COBOL用户。结果,ANSI COBOL委员会收到了2200多封公众的信,其中大部分为负,要求委员会进行更改。另一方面,人们认为转换为COBOL-85会提高未来几年的生产率,从而证明了转换成本是合理的。
详细语法
Cobol语法经常因其冗长而受到批评。支持者说,这旨在使代码自我记录,简化程序维护。 COBOL还旨在让程序员易于学习和使用,同时仍然对经理等非技术人员可读。
对可读性的渴望导致了使用类似英语的语法和结构元素,例如名词,动词,从句,句子,部分和分裂。然而,到1984年,COBOL计划的维护者正在努力处理“难以理解的”守则,而COBOL-85的主要变化是有助于缓解维护的。
短期委员会成员让·萨米特(Jean Sammet)指出:“几乎没有尝试迎合专业程序员,实际上,主要兴趣是编程的人们往往对Cobol非常不满意”,她将其归因于Cobol的冗长语法。
与计算机科学界的隔离
COBOL社区一直与计算机科学界隔离。没有学术计算机科学家参加COBOL的设计:委员会上的所有人员均来自商业或政府。当时的计算机科学家对数值分析,物理和系统编程等领域更感兴趣,而COBOL开发解决了的商业文件处理问题。 Jean Sammet将Cobol的不受欢迎归因于最初的“势利反应”,因为它的不高度,缺乏参与设计过程的有影响力的计算机科学家,并且对业务数据处理的不屑一顾。 COBOL规范使用独特的“符号”或属语言来定义其语法,而不是委员会不知道的新的Backus -Naur形式。这导致了“严重”的批评。
学术界倾向于将COBOL视为冗长,笨拙且毫无意义的,并且试图忽略它,尽管世界上可能有更多的COBOL计划和程序员多于Fortran,Algol和PL/I合并。在大多数情况下,只有具有直接职业目标的学校才能在COBOL中提供指导。
后来,Cobol缺乏覆盖材料的短缺;直到1963年才出现介绍书(理查德·D·欧文(Richard D. Irwin)于1966年出版了一本关于COBOL的大学教科书)。到1985年,关于Fortran的书籍的两倍,而在国会图书馆中的Cobol上有四倍。大学教授教授了更现代,最先进的语言和技术,而不是COBOL,据说具有“贸易学校”性质。 Codasyl Cobol委员会主席唐纳德·纳尔逊(Donald Nelson)在1984年表示,“学者...仇恨Cobol”,计算机科学毕业生''Hate Hate Cobol'向他们钻了'。
到1980年代中期,从其他语言的用户(例如Fortran或Assoundbler)对COBOL的COBOL也有明显的屈尊,这意味着COBOL只能用于非挑战性问题。
2003年,COBOL在美国80%的信息系统课程中介绍,与C ++和Java相同。十年后, Micro Focus的一项民意调查发现,有20%的大学学者认为Cobol已经过时或死亡,而55%的学生认为他们的学生认为Cobol已经过时或死亡。同一民意调查还发现,尽管有60%的学者认为他们应该教它,但只有25%的学者在其课程上进行了COBOL编程。
对设计过程的关注
对标准委员会的能力提出了疑问。短期委员会成员霍华德·布罗姆伯格(Howard Bromberg)说,对发展过程几乎没有“控制”,并且“由于缺乏人才和缺乏才能而困扰”。让·萨米特(Jean Sammet)和杰罗姆·加芬克尔(Jerome Garfunkel)还指出,在下一个标准的修订中引入的变化将在下一项修订中得到恢复,这是由于标准委员会中谁是客观证据的变化。
COBOL标准一再遭受延迟:COBOL-85比希望晚了五年,Cobol 2002迟到了五年,Cobol 2014迟到了六年。为了打击延迟,标准委员会允许创建可选的附录,该附录将比等待下一个标准修订更快地增加功能。但是,一些委员会成员对实施和频繁修改标准之间的不兼容表示担忧。
对其他语言的影响
COBOL的数据结构影响了随后的编程语言。它的记录和文件结构影响了PL/I和Pascal ,以及REDEFINES
条款是帕斯卡(Pascal)变体记录的前身。在数据库管理系统的开发之前,明确的文件结构定义和汇总数据是福特兰阵列的重大进步。
PICTURE
数据声明已纳入PL/I,并进行了较小的更改。
COBOL的COPY
设施虽然被认为是“原始”,但影响了包括指令的发展。
对可移植性和标准化的关注意味着用COBOL编写的程序可能是可移植的,并促进了语言传播到各种硬件平台和操作系统。此外,定义明确的部门结构限制了对环境部门的外部引用的定义,这简化了平台的特殊变化。