欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

[译文]PHP千年虫(y2k compliance),

程序员文章站 2022-05-21 13:29:48
...

[译文]PHP千年虫(y2k compliance),

时钟将我们无情地逼近2000年的最后一年,第二年厄运塞耶斯都预言前所未有的电脑故障在每一个可以想象的领域。通常被称为2000年问题,或千年虫,这种 情况很容易解释。程序解释两位在形成XX日期19 XX行为就开始在2000年及以后为下一年。如果你的生日是“2/2/05”,你是在101年101岁,还是一年?

成本估算的修复这个bug到数十亿美元的资金,至少有那么多钱的可能威胁再次发生旷日持久的法律费用由于真实和所谓的赔偿。由于这些毁灭性的成本预测,企业和*日益加大的压力,要求他们使用安全的具有法律约束力的声明,所有的软件是保证2000年兼容。

您 可能猜到,这种压力往往源于lawyer-wary保险公司,相当相当恐惧death-by-litigation甚至超过他们可能实际成本的影响,产生 损失。保卫自己免受法律风险,组织世界各地急于安全,在所有可能的匆忙,宣誓书,如此这般的软件是2000年兼容。他们打算挥舞的某种法律保护不可避免的 混乱来袭时,正直地宣称自己无Y2K污染和重定向诉讼对上述文件的签署者。

记住这一点:如果有人问你保证2000年的软件是免费的缺陷,他们只是找借口告你如果他们滥用你的软件,即使它应该恰好是自己的错。可能他们已经忘记了他们的软件许可证的条款,这可能读而接近以下:

没有作者或分销商概为任何一方直接,间接,特殊,附带的,或间接损害引起的使用这个软件,文档,或任何衍生品,即使作者建议的这种损害的可能性。

作者和经销商特别声明不负任何保证,包括但不限于适销性的隐含保证,健身为特定目的和不侵权。这软件是提供一个“目前的”基础上,作者和经销商没有义务提供维护、支持、更新、改进,或修改。

你有没有停下来想知道只是一个汽车制造商能存活多久*审查这种anti-warranty吗?为什么软件制造商有什么不同?不知为何,不过,他们似乎是。这样的事情是否存活的法院litigational疯狂在几年肯定会接踵而至,仍有待观察。别指望什么。

关 于千年虫的焦虑情况达到日益*程度在大多数大型组织。每隔几天,你看别的东西在大众媒体预测一定的破坏。几乎所有的这些报告都是穿插着模糊 prevarications或技术混淆。这并不是说,这里不是一个真正的问题,,我们可以假装没有什么打扰自己。回答当然是肯定的。但这问题源于什么, 能做些什么,充其量是通常被误解。一般三个重复谎言加剧的情况。

三个流行千年虫的谎言

第一个谎言通常讲述的是千年虫问题历史上来自昂贵的电脑去年的记忆非常亲爱的,程序员维护日期在两个数字的格式控制成本。

这种说法显然是错误的。考虑一下。一个两位数需要存储多少钱?两个字节,16位吗?没有,更不用说:数值型数据很少以文本格式存储,因为一个更紧凑的表示是现成的。两位数的一年将会是一个号码00至99不等。可以在短短7位代表。

如 何使用完整的年,1985年或2010年吗?这些数字可能会在11位代表。那些资深的程序员也老真正兴高采烈地攫取的速度大幅节约成本4整个位/日期吗? 这肯定非常宝贵的硬件可能幸免4位!即使不是,可以使用一个偏移量从一个合理的基础。如果仅使用最后两位数字,而是年日期可能是代表没有绝对值,而是自 1900年以来的年数。如果是这样,这也仍然适合那些提到的7位,至少一段时间。添加另一个点,我们明确到2156年。结束的问题。节省内存不是为什么是 这样做。

虽然那天的用户可以选择非扩展性表示年,一年% 1900年而不是1900年,这并不使其硬件成本的问题。它仍然是一个目光短浅的,柔软的设计错误。

第 二个谎言是这种现象是全新的,在2000年,无数系统会突然失败,这种事情以前从来没有发生过。想想古代老人出生于1895年。一段程序,其读取他们的生 日作为“95”将不会支付他们几个月检查,自1998年以来,他们似乎只有三岁。2000年没有发生在这个方程。所谓的“年- 2000”问题是在没有时尚新,也不局限于那一年。然后它会更明显。

第三,也是目前为止最严重的撒谎千年虫问题,是,你的公司可以通过收购合规的宣誓书,保护自己免受伤害,是否真实或诉讼。它不能。这个信念在法律文件实际上是中空的,危险的。最明智的做法是立即纠正自己的欺骗。

阴险,底层整个问题的根本原因是无论是硬件还是软件。不,那太容易了,我们知道如何修复。应用一个几百美元,你瞧�,一切都照顾。

不幸的是,这并不是它。真正的问题是湿件。这是正确的:缺陷不在于我们的电脑,也没有在他们的编程中,而是在我们自己。

大 多数时候,人们想到的日期,他们只使用的最后两个数字。他们把它写在支票。他们在家庭圣经写。随便你听到有人说,“我记得早在65年,”或“代”98年他 们的集体意识的根基被动摇了美国在加勒比海的惊人的失败,“,你就应该知道他们的意思。只是这65是吗?议长假设生活,它可能为1965。只是这98是 吗?为什么,这不是当年,而是早在1898年,当西班牙失去了剩余的破旧的帝国那些暴发户新的Worlders和随后死于国家反思,弥漫在整个时代的文 学。在这两种情况下,你解决歧义从上下文推断全年,当然可以。但如果你没有上下文,那么你只能猜测。记住:电脑使猜测而“臭名昭著”。

最恐怖的地方就是,即使完全准确和计算机程序工作,显然是“千年虫兼容”,你还麻烦大了。举个例子,著名的Unix卡尔程序。让我们看看当前的月。

  $ cal 2 98
		 February 98
	    Su Mo Tu We Th Fr Sa 
			 1  2  3
	     4  5  6  7  8  9 10
	    11 12 13 14 15 16 17
	    18 19 20 21 22 23 24
	    25 26 27 28

等一等。那是什么?不是情人节应该是星期六,不是星期三,今年?哎呀,错了年!你真正要的类型是:
 $ cal 2 1998
		February 1998
	    Su Mo Tu We Th Fr Sa 
	     1  2  3  4  5  6  7
	     8  9 10 11 12 13 14
	    15 16 17 18 19 20 21
	    22 23 24 25 26 27 28

如你所见,不管程序是否兼容,因为人类用它们不是!修复程序当然是一个必要的步骤,但远远不够。你可以证明每一个程序存在,它仍然是不够安全。直到等时间的数十亿人在这个世界上——甚至只是数百万使用电脑——都是同样的认证,并保证不忘记,就没有安全。这是不会发生的。

寻 求具有法律约束力的声明,一个特定的程序不能有意无意滥用只不过是政治迫害注定要失败的终极目标保护你和你的。你不能帮助,总会有cluefully- challenged用户和程序员,甚至人的线索,他偶尔也会有记忆丧失。你不能找到他们,你不能责怪工具或语言,你不能保护自己。每次一个人想着一年只 有两位数而言,这一问题再次显现出来。和没有人想出了如何解决软件。

Perl

Perl呢?Perl 2000年“兼容”?答案是,Perl是一样Y2K兼容你的铅笔,没有更多的,没有少。安慰你呢?这是不应该的。就像你可以用你的铅笔提交千年虫的过犯, 也可以用Perl——或与任何其他工具,。甚至你真的不需要走很远的路去做;见证完美兼容卡尔的示范项目提供。

Perl提供的日期和时间函数是gmtime()和本地时间()函数,这是源于他们的C编程语言。这些供应充足的信息来确定远远超过2000年。2038发生危机时,只对我们仍然停留在32位机器上,有点不太可能尽管诚然不是完全不可想象的情况。

这 些函数返回的一年(在列表上下文),与流行的误解,而不是定义一个两位数。相反,它仅仅是现在这样的。它实际上是什么,是当前减去一千九百年。多年来在 1900年和1999年之间发生这种情况便是十进制数,但这不会持续太久。为了避免2000年问题,根本不把年便是号码。容易说,容易打破。假设你想要找 出今年似乎在过去5年中,所以你这样编写代码。

   use Time::localtime;
    $then = time() + ( 60 * 60 * 24 * 365 * 5 );  # 5 years from now
    $that_year = localtime($then) -> year;

    printf("It shall be 19%d\n", $that_year);		# WRONG! 19103
    printf("It shall be %d\n", 1900 + $that_year);	# right:  2003

如你所见,在坏人手中,甚至一个名义上的2000年兼容的工具如Perl或卡尔underclued或者仅仅是可以被滥用的健忘。

Perl 没有保修,TPI不支持Perl。此外,Perl是一种语言,语言可以在许多方面被滥用。但这是程序员和用户的责任,不是许多Perl的创造者。然而,作 为Perl spokes-organization免费软件运动,我们觉得有必要指出,Perl是一样Y2K兼容的C语言接口为基础,和Perl编译器和解释器的自 己写。即在Perl接口访问日期信息,当用作设计,Y2K兼容的在每一个意义上的词。

如果让你的律师或经理快乐,为他们好。你仍然有很多担心。

 

原文:http://www.perl.com/pub/1999/01/y2k.html