题
我知道很多 Y2K 努力/恐慌都以 COBOL 为中心,无论是否应得。(哎呀,我在 Perl 脚本中看到了 Y2K 小错误,该错误于 2000 年 1 月 1 日崩溃)
我感兴趣的是,COBOL 作为一种语言是否有一些特定的因素使其容易受到 Y2K 问题的影响?
也就是说,与仅仅用它编写的大多数程序的年龄以及随后需要节省由旧硬件驱动的内存/磁盘使用以及没有人预计这些程序能够存活 30 年的事实相反?
如果答案是“除了年龄之外,COBOL 没有什么特别的”,我会非常高兴 - 只是好奇,对 COBOL 一无所知。
解决方案
是和在COBOL,你不得不声明变量,这样你实际上有说有多少位有一个数,即号,YEAR PIC 99
声明的变量YEAR
,使得它只能容纳两位十进制数。所以,是的,这是比较容易犯类似的错误比C下你会int
或short
或char
为一年,仍然有足够的空间近年来比99当然大于不保护你用C printf
ing 19%d
基于思年将是小于或等于99仍然有问题,在您的输出,或进行其他内部计算。
其他提示
这是80%左右的存储容量,纯粹和简单。
人们没有意识到,他们的笔记本电脑今天的硬盘驱动器的容量将有低成本的数百万的1980年你觉得挽救了两个字节是愚蠢的?而不是当你有10万个客户记录和硬盘驱动器的冰箱的尺寸保持20兆字节,需要专门的房间要保持冷静。
这似乎是更多的人不知道多久,他们的代码将被使用的问题,所以他们选择使用2位数字的年份。
所以,没有什么特定的COBOL,它只是COBOL程序往往是关键老,使他们更容易受到影响。
当时有什么用Cobol本质使其易于Y2K问题?
编程 1 。和系统,其中COBOL程序运行 2
<子> 1:他们并没有设计前瞻性的30年。我不能责怪他们真的。如果我有记忆的限制,挤压每个日期2个字节,使其工作30年后者,很可能我会做出同样的决定之间。
2:该系统可以有同样的问题,如果硬件存储在今年两位数。
有趣的问题。什么是Y2K问题,本质是什么?它的不足以定义你的宇宙中的问题。有没有认真尝试所有日期模式,因为空间是更重要的(和应用程序将被然后被替换)。因此,在Cobol语言在各个层面,这一点很重要:是有效的,而不是overdeclare你所需要的内存,无论是在存储和方案一级
在哪里效率是很重要的,我们犯的错误Y2Kish ......我们该做的,每次我们存储在数据库中的日期没有时区的时间。因此,现代存储绝对服从Y2Kish错误,因为我们尽量高效使用空间的使用(虽然我敢打赌,这是过度优化在许多情况下,特别是在企业过头,一切级)。
在另一方面,我们避免了在应用层Y2Kish错误,因为每次你用,工作时说,一个日期(在Java中,让我们说)它始终围绕着一吨的行李(如时区)的携带。为什么?由于日期(和许多其他概念)现在是操作系统的一部分,所以OS-作出明智的帅哥尝试型号日期的一个全面的概念。因为我们依靠自己的日期的概念,我们不能搞砸了......它的模块化和可更换的!
新的语言带有内置数据类型(和设施)像日期很多事情,以及巨大的内存玩,帮助避免了很多潜在的Y2Kish问题。
这是两个部分。 1-年龄/ COBOL软件的寿命,和2-数据记录的80个字符的限制。
第一 - 这个年龄只用2年的存储位数字,因为没有人想出他们的软件会持续这么久的大多数软件! COBOL已经通过了银行界,谁是臭名昭著的永远扔掉代码。大多数其它软件扔掉,而银行也没有!
其次,COBOL被约束到每个数据的记录80个字符(由于穿孔卡片大小!),开发者在一个更大的压力来限制的字段的大小。因为他们想通“ 2000年一年内不会在这里直到我长和退休!”保存的数据的2个字符是巨大!
这是更相关于存储在数据项目的年,只能从0到99(两个字符,或两个十进制数字,或一个单一的字节)持有的值。那这让约一年价值类似的假设计算。
这是几乎没有一个特定的Cobol-事情。的方案很多受到了影响。
有一些关于 COBOL
这使得局势更加恶化。
- 它很旧,所以很少使用库代码,更多的是本土化的东西
- 它很旧,所以还没有互联网,还没有社交网络,更多的 NIH,更少的框架,更多的自定义内容
- 它很旧,所以不那么抽象,更有可能有开放编码的解决方案
- 它已经很旧了,所以,回到足够远的地方,节省 2 个字节可能有点重要
- 它很旧,所以它早于 SQL。传统的操作软件甚至具有索引的面向记录的磁盘文件,以使在每个程序中滚动您自己的数据库变得更加容易。
- “printf”格式字符串和数据类型声明是同一件事,一切都有 n 数字
我见过没有实际子例程的巨型 Fortran 程序。真的,一个 3000 行的主程序,而不是一个非库子程序,就是这样。我想这可能发生在 COBOL 世界中,所以现在您必须阅读每一行才能找到日期处理。
COBOL从未与任何标准的日期处理库来了。
所以大家编码自己的解决方案。
有些解决方案是非常糟糕的面对面的人千年。大多数那些坏的解决方案并不重要的应用程序没有活40年以上。坏解决方案的不那么一小撮人造成知名的Y2K问题在商业世界。
(有些解决方案是更好的,我知道在20世纪50年代与编码的日期格式良好的,直到2027 COBOL系统 - 必须在当时似乎永远;我的一点都不错,直到2079 20世纪70年代设计的系统)<。 / p>
然而,有COBOL有一个标准的日期类型....
03 ORDER-DATE PIC DATE.
...工业级解决方案将是可在编译器级别,切割所需的任何修复的复杂性。
道德:使用语言与标准库
COBOL 85(1985年标准)和早期版本没有任何的方式来获得当前世纪**,这是一个因素固有COBOL,即使经过2个字节额外的存储空间阻止使用的4位数年不再是一个问题。
**具体实现可能有非标准扩展用于此目的。
使用COBOL唯一的内在问题是它的原始(60年代末)可以获取当前系统日期,这是标准的语句:
ACCEPT todays-date FROM DATE
此返回的6位数字与YYMMDD格式的日期。
然而,即使这不一定是一个问题,因为我们使用它只是检查,如果年份部分小于70假定日期是20YY,这将使它成为Y2K070问题,这一说法在90年代写的代码。 : - )
在标准后来扩展(COBOL-85,我认为),所以你可以要求以不同的格式的日期,如:
ACCEPT todays-date FROM CENTURY-DATE
哪些给你的日期作为一个CCYYMMDD 8位的数字。
当你和其他人指出,允许的日期/年“有损”表示许多其他计算机编程语言。
问题是真正关心在70年代末80年代初的内存和存储限制。
当你的一百万美元电脑的季度有128K和4盘共计约6兆字节,你既可以让你管理一个季度磨一256K机磁盘存储的12兆或非常了解的空间非常有效的。
因此,所有节省空间的招数种类进行usered。我最喜欢的是存储YYMMDD日期在压缩十进制场x'9912310C”再敲的最后一个字节,并将其存储为‘991231’991231。因此,而不是6个字节你只花了3个字节。
其他手段包括对价格形成一定做作逃学型encodeing - 代码12 - > $ 19.99。