我知道很多Y2K的努力/恐慌都以某种方式集中在COBOL,当之无愧。 (哎呀,我在2000年1月1日的Perl脚本中看到了轻微的Y2K错误)
我感兴趣的是,COBOL是否有某种特定的语言使其容易受到Y2K问题的影响?
也就是说,与仅仅是大多数程序写入其中的时代相反,以及随后需要减少由旧硬件驱动的内存/磁盘使用量以及没有人预料到这些程序能够存活30年的事实?
如果答案是“除了年龄之外没有COBOL特有的东西”,我感到非常高兴 - 只是好奇,对COBOL一无所知。
答案 0 :(得分:10)
存储容量的80%,纯粹而简单。
人们没有意识到,他们的笔记本电脑硬盘的容量在1980年将花费百万。你认为节省两个字节是愚蠢的吗?不是当你拥有100,000个客户记录和一个冰箱大小为20兆字节的硬盘时,需要一个特殊的房间来保持凉爽。
答案 1 :(得分:6)
是和否。在COBOL中,您必须声明变量,以便您实际上必须说出一个数字中有多少位数,即YEAR PIC 99
声明变量YEAR
以便它只能保留两位小数。所以,是的,犯下这个错误比在C中更容易,如果你有int
或short
或char
作为年份,并且仍然有足够的空间可以存在超过99年的年份。当然,这不能保护您免于printf
{C} 19%d
并且仍然在您的输出中出现问题,或者基于对年份的思考进行其他内部计算将小于或等于99. < / p>
答案 2 :(得分:1)
似乎更多的是人们不知道他们的代码会被使用多长时间的问题,所以他们选择使用两位数的年份。
所以,没有什么特别的COBOL,只是COBOL程序往往是关键和旧的,所以他们更有可能受到影响。
答案 3 :(得分:1)
Cobol有什么东西可以让它容易受到Y2K问题的影响吗?
编程 1 。 COBOL程序运行的系统 2 。
<子> 1:他们没有设计前瞻性的30年。我不能真的责备他们。如果我有内存限制,在每个日期压缩2个字节并使其在30年后工作之间,我很可能做出同样的决定。
2:如果硬件以两位数存储年份,系统可能会遇到同样的问题。
答案 4 :(得分:1)
引人入胜的问题。什么是Y2K问题,实质上是什么?这是没有充分定义你的宇宙的问题。没有认真尝试对所有日期进行建模,因为空间更重要(并且应用程序将被当时替换)。因此,在各个级别的Cobol中,重要的是:在商店和程序级别提高效率,而不是过度使用所需的内存。
在效率很重要的情况下,我们会提交Y2Kish错误...我们每次在没有时区的情况下在DB中存储日期时都这样做。因此,现代存储肯定会受到Y2Kish错误的影响,因为我们试图在使用空间时保持高效(尽管我敢打赌它在许多情况下过度优化,特别是在企业过度使用的所有级别)。
另一方面,我们避免在应用程序级别上出现Y2Kish错误,因为每次使用日期时(比如Java),它总是带有大量的行李(如时区)。为什么?因为Date(和许多其他概念)现在是操作系统的一部分,所以制作操作系统的智能家伙试图模拟一个完整的日期概念。由于我们依赖于他们的约会概念,我们无法搞砸......而且它是模块化和可更换的!
具有内置数据类型(和设施)的较新语言可用于许多事情,例如日期,以及可以使用的大量内存,有助于避免许多潜在的Y2Kish问题。
答案 5 :(得分:1)
这是两部分。 1- Cobol软件的年龄/寿命,以及数据记录的80个字符限制。
首先 - 那个年龄段的大多数软件仅使用2位数字进行年度存储,因为没有人认为他们的软件会持续那么长时间! COBOL已被银行业采用,银行业因永不丢弃代码而臭名昭着。大多数其他软件被扔掉了,而银行却没有!
其次,COBOL被限制为每个数据记录80个字符(由于打卡的大小!),开发人员在限制字段大小的压力更大。因为他们认为“2000年不会在这里,直到我长久退休!”保存数据的2个字符很大!
答案 6 :(得分:0)
将年份存储在只能保存0到99(两个字符,或两个十进制数字或单个字节)的数据项中更为相关。这个和计算对年份值做出了类似的假设。
这不是特定于Cobol的事情。许多计划受到影响。
答案 7 :(得分:0)
COBOL
有些事情使情况恶化。
我见过没有实际子程序的巨型Fortran程序。真的,一个3000行的主程序,而不是一个非库子程序,就是这样。我想这可能发生在COBOL世界中,所以现在你必须阅读每一行才能找到日期处理。
答案 8 :(得分:0)
COBOL从未附带任何标准日期处理库。
所以每个人都编写了自己的解决方案。
有些解决方案相对于千禧年而言非常糟糕。大多数这些糟糕的解决方案并不重要,因为应用程序没有超过40年。不那么极少数的不良解决方案会导致商业界众所周知的Y2K问题。
(有些解决方案更好。我知道20世纪50年代编码的COBOL系统的日期格式在2027年之前是好的 - 当时似乎永远都是如此;而且我在20世纪70年代设计的系统在2079年之前一直很好。)< / p>
但是,如果COBOL有标准的日期类型......
03 ORDER-DATE PIC DATE.
....行业广泛的解决方案可以在编译器级别上获得,从而降低了所需补救的复杂性。
道德:使用标准库的语言。
答案 9 :(得分:0)
COBOL 85(1985年标准)及早期版本没有任何方法可以获得当前世纪**,这是COBOL固有的一个因素,即使在2个字节的额外存储空间之后也不鼓励使用4位数年份不再是问题。
**为此目的,特定实现可能有非标准扩展。
答案 10 :(得分:0)
Cobol唯一的内在问题是它(用于检索当前系统日期)的原始(1960年代后期)标准声明,即:
ACCEPT todays-date FROM DATE
这将返回一个6位数的数字,其日期为YYMMDD格式。
但是,即使这并不一定是问题,因为我们在90年代使用此语句编写了代码,该语句仅检查年份部分是否小于70,并假定日期为20YY,这将使其成为Y2K070问题。 :-)
该标准后来进行了扩展(我认为是COBOL-85),因此您可以要求使用其他格式的日期,例如:
ACCEPT todays-date FROM CENTURY-DATE
哪个给了您一个8位数字,日期为CCYYMMDD。
正如您和其他人指出的那样,许多其他计算机编程语言也允许“有损”地表示日期/年份。
答案 11 :(得分:0)
问题确实出在70年代末80年代初。
当一百万美元的四分之一计算机中有128K和4个磁盘,总计约6兆字节时,您可以向管理层要求另一四分之一的工厂来购买256K的计算机,该计算机具有12兆的磁盘存储空间,或者空间效率非常高。 >
因此使用了各种节省空间的技巧。我最喜欢的是将YYMMDD日期作为991231存储在一个压缩的十进制字段x'9912310C'中,然后敲最后一个字节并将其存储为'991231'。因此,您只占用了3个字节,而不是6个字节。
其他技巧还包括一些价格昂贵的Hooky Hooky类型编码-代码12-> $ 19.99。