Answers:
TeX的计划寿命会浮现:
“从1977年开始以来,我从事的TeX研究项目就受到两个主要目标的推动。第一个目标是质量:我们希望制作的文档不仅好,而且实际上是最好的。(…)第二个主要目标是存档:创建尽可能不受印刷技术变化影响的系统。当下一代打印设备问世时,我希望能够保持已经获得的相同质量,而不必重新解决所有问题。我想设计一些在100年后仍然可以使用的东西。” –唐纳德·E·努斯:《数字印刷》,第9页。559(引自http://de.wikipedia.org/wiki/TeX)
根据Knuth的有关数字印刷的书籍,甚至有可能完全重新实现TeX和METAFONT。它们包括所有代码的注释和解释。
要求您的结果在几十年内保持稳定,就陷入了一种僵局的困境。一方面,您想轻松地100%复制结果,因此冻结了软件/环境。另一方面,对将来重现您的结果感兴趣的人肯定会在此基础上继续前进。这个人会被非常老的软件所困扰,很难更改任何东西。对于建立在几个外部软件包上的任何东西来说,已经几年就足以使事情几乎不变。
对于TeX,在1990年的文章中宣布冻结
TEX和METAFONT的未来 http://www.ntg.nl/maps/05/34.pdf
“我坚信不变的系统具有很大的价值,尽管可以改进任何复杂的系统都是不言自明的。因此,我认为对称为TEX和METAFONT的系统进行进一步的“改进”是不明智的。让我们考虑一下这些系统作为固定点,从现在开始产生的100年后应该会产生相同的结果。”
理想的系统将可复制性与可变性相结合。尽量做到自成体系,简单且经过充分测试的做法肯定会有所帮助。
如果我偏离了最初的问题,请原谅我。[来自“可再生研究的科学家”的交叉发布,reproducible-research @ googlegroups.com]
存在许多技术挑战,使计算结果的精确逐位再现非常困难。
在软件级别,更改代码或该代码使用的任何库显然会导致产生不同的结果。您会对最终可以链接到典型科学代码的支持库数量感到惊讶。
在较低的级别上,使用新的编译器或打开了不同的编译器优化功能重新编译任何代码或该代码使用的任何库也会导致问题。原因之一是当重新编译代码时,代码中的各种操作可能会以不同的顺序执行。由于浮点加法不是关联的(a + b)+ c <> a +(b + c),因此可以得出不同的结果。
好的,如果我们通过(例如)将其刻录到可运行代码的可启动CD-ROM上来保留整个软件环境(操作系统,库和已编译的代码)怎么办?现在我们可以确定,如果在另一台计算机上运行此代码,我们将获得相同的结果?
令人惊讶的是,某些代码实际上基于它们所运行的特定处理器模型的各个方面而改变了计算顺序。例如,优化的线性代数库通常会分解矩阵乘法,以处理适合缓存的块。当英特尔发布具有更大缓存的新微处理器时,代码可能会动态调整块大小,从而导致以不同顺序执行算术并给出不同结果。如果您在具有更多内存的计算机上运行代码,则其他代码会根据可用内存量动态调整计算顺序,这很可能导致算法以不同顺序执行,从而得出不同的结果。
当您放入多线程代码时,事情变得异常复杂,因为不同线程的确切执行历史通常是不确定的,并且这又可能导致从一次运行到下一次运行以不同的顺序执行算术运算。
在实践中,您真正希望得到的最大结果是一台机器到另一台机器的结果相似,直至所使用算法的精度公差为止。例如,如果我有求根问题,并使用二等分法求出+ -1.0e-10之内的根,那么只要其他机器产生的误差在该公差范围内,我就应该很高兴。
已经进行了许多尝试来实现可再现性,并且有关于该主题的完整文献。我从15年的科学软件中得出的个人看法是,它不切实际,并且不令人满意。问题在于:(i)复杂的软件存在错误,因此无法冻结;(ii)软件永远不会具有完整的功能,因此开发会继续进行;(iii)用纸交付数十万行代码的价值是什么?
就像我说的那样,我发现这个答案并不令人满意。我相信,作为一个领域,计算科学在产生文学作品方面并不是很成功,这使我们相信我们发表的结果是正确的和可再现的。同时,我真的无法提出更好的方法。可以肯定的是,发布论文随附的源代码很有用。同时,每个诚实的人都会同意,论文中的结果通常将由不同版本的代码产生,在大多数情况下,这些代码会包含描述不同边界条件,不同右侧等的内容。带有相同代码的不同版本。首先,这对于读者来说很尴尬,但是,如果代码如此之大(如今天经常发生的那样)绝对是徒劳的-我最近的两篇论文所使用的代码大约是20,000行代码并且是基于交易的.II(600,000行代码)和Trilinos(150万行)代码)。可以为潜在读者提供哪些信息?(我应该说我的代码仍然可用。)
有关此问题的可能解决方案,请参见我的ActivePapers项目。总之,它描述了如何将数据和代码打包在一起,并明确依赖每个软件组件的特定版本。这使得可以精确地重现计算,同时还允许对相同数据运行更新的软件。
我应该补充一点,ActivePapers仅仅是概念的证明,不太可能在不久的将来有任何实际用途。原因是它基于所有可执行代码必须作为JVM字节码存在的原则。目前,这不包括太多的流行科学图书馆。但是,一旦公认可重复性很重要,编程工具中的优先级也可能会发生变化。
我认为,就语言选择而言,使用标准化语言(例如C / Fortran / C ++)将被视为“最佳实践”。如果一个软件包依赖于其他10个lib / package,尤其是那些用晦涩的语言编写的lib / package,那么这显然不利于长寿。一段时间后,许多项目最终被孤立。我不认为BLAS / LAPACK,PETSc,FFTW,MPI等主要库/ API会很快消失。BLAS已经很老了。
以下代码段(从http://www.math.utah.edu/software/c-with-fortran.html窃取)早于Fortran 77,使用Hollerith常数进行char操作,但在40至50年后可以正常编译GNU Fortran编译器:
stali@x61:~$ cat olde.f
CALL S(12HHello, world, 12)
END
SUBROUTINE S(MSG,N)
INTEGER K, N, M
INTEGER MSG(1)
M = (N + 3) / 4
WRITE (6,'(20A4)') (MSG(K), K = 1,M)
END
stali@x61:~$ gfortran -std=legacy olde.f; ./a.out
Hello, world
像googlecode这样的开放源代码/将其放在不太可能很快消失(尽管他们确实关闭了代码搜索)的地方是没有道理的。