답변:
TeX의 계획된 수명은 다음과 같습니다.
“1977 년에 시작된 이래로 제가 시작한 TeX 연구 프로젝트는 두 가지 주요 목표에 의해 주도되었습니다. 첫 번째 목표는 품질이었습니다. 우리는 좋은 것이 아니라 실제로 가장 좋은 문서를 만들고 싶었습니다. (…) 두 번째 주요 목표는 보관 기술이었습니다. 인쇄 기술의 변화와 최대한 독립적 인 시스템을 만드는 것입니다. 차세대 인쇄 장치가 등장했을 때, 나는 모든 문제를 새로 해결하지 않고 이미 달성 한 동일한 품질을 유지할 수 있기를 원했습니다. 100 년 후에도 사용할 수있는 것을 디자인하고 싶었습니다. – Donald E. Knuth : 디지털 타이포그래피, p. 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의 과학가', reproducible-research@googlegroups.com에서 게시 한 크로스]
계산 결과의 비트 단위의 정확한 재현성을 달성하기 매우 어려운 많은 기술적 과제가 있습니다.
소프트웨어 수준에서 코드 또는 코드에서 사용하는 라이브러리를 변경 하면 다른 결과가 생성 될 수 있습니다. 일반적인 과학 코드에 연결될 수있는 지원 라이브러리의 수에 놀랄 것입니다.
하위 수준에서 새 컴파일러 또는 다른 컴파일러 최적화를 설정 한 상태에서 코드 또는 코드에 사용 된 라이브러리를 다시 컴파일하면 문제가 발생할 수 있습니다. 한 가지 이유는 코드를 다시 컴파일 할 때 코드의 다양한 작업이 다른 순서로 수행 될 수 있기 때문입니다. 부동 소수점 덧셈은 연관 (a + b) + c <> a + (b + c)가 아니기 때문에 다른 결과를 얻을 수 있습니다.
예, 코드를 실행할 부팅 가능한 CD-Rom에 레코딩하여 전체 소프트웨어 환경 (OS, 라이브러리 및 컴파일 된 코드)을 보존한다면 어떨까요? 이제이 코드를 다른 컴퓨터에서 실행하면 동일한 결과를 얻을 수 있습니까?
놀랍게도 일부 코드는 실제로 실행중인 특정 프로세서 모델의 측면을 기반으로 계산 순서를 변경합니다. 예를 들어, 최적화 된 선형 대수 라이브러리는 일반적으로 캐시에 적합한 블록에서 작동하도록 행렬 곱셈을 분해합니다. 인텔이 더 큰 캐시를 가진 새로운 마이크로 프로세서를 출시 할 때 코드는 블록 크기를 동적으로 조정하여 산술이 다른 순서로 수행되어 다른 결과를 제공 할 수 있습니다. 다른 코드는 사용 가능한 메모리의 양에 따라 계산 순서를 동적으로 조정합니다. 더 많은 메모리가있는 컴퓨터에서 코드를 실행하면 산술이 다른 순서로 수행되어 결과가 달라질 수 있습니다.
다른 스레드의 정확한 실행 히스토리는 종종 결정적이지 않기 때문에 여러 스레드 코드로 처리 할 때 상황이 놀랍도록 복잡해집니다. 이로 인해 연산마다 다른 순서로 산술 연산이 수행 될 수 있습니다.
실제로 실제로 기대할 수있는 것은 사용 된 알고리즘의 정확도 공차까지 한 시스템에서 다른 시스템으로 유사한 결과입니다. 예를 들어 근본 발견 문제가 있고 이분법을 사용하여 + -1.0e-10 이내의 근을 얻으면 다른 기계가 해당 허용 오차 내에 동의하는 응답을 생성하는 한 행복해야합니다.
재현성을 실현하려는 많은 시도가 있었고이 주제에 대한 전체 문헌이 있습니다. 15 년간의 과학 소프트웨어에 대한 개인적인 견해는 그 답을 찾는 것처럼 비현실적이며 불만족 스럽다는 것입니다. 문제는 (i) 복잡한 소프트웨어에 버그가있어서 동결 될 수 없다는 것입니다. (ii) 소프트웨어는 완전한 기능을 제공하지 않으므로 개발이 계속됩니다. (iii) 수십만 줄의 코드를 종이와 함께 제공하는 것의 가치는 무엇입니까?
내가 말했듯 이이 대답은 불만족 스럽다. 나는 전산 과학이 우리가 출판 한 결과가 정확하고 재현 가능하다는 신뢰를 심어주는 문헌을 만드는 데 성공하지 못했다고 생각합니다. 동시에, 나는 일을 더 잘하는 방법을 생각 해낼 수 없습니다. 확실히, 종이와 함께 제공되는 소스 코드를 공개하는 것이 유용합니다. 동시에, 정직한 모든 사람들은 논문의 결과가 일반적으로 다른 경계 조건, 다른 오른쪽 등을 설명하는 핵을 포함하는 다른 버전의 코드에 의해 생성 될 것이라는 데 동의 할 것입니다. 동일한 코드의 다른 버전과 함께 제공됩니다. 독자가 처음에는 어색합니다. 가장 최근의 두 논문은 약 20,000 줄의 코드를 사용하고 거래에 기반한 코드를 사용했습니다 .II (600,000 줄) 및 Trilinos (1.5M 줄) 코드). 잠재적 인 독자에게 어떤 정보를 제공합니까? 그럼에도 불구하고 내 코드를 사용할 수 있다고 말해야합니다.
이 문제에 대한 가능한 해결책은 ActivePapers 프로젝트를 참조하십시오 . 요약하면, 각 소프트웨어 구성 요소의 특정 버전에 대한 명시 적 종속성과 함께 데이터 및 코드를 패키지하는 방법을 설명합니다. 이를 통해 계산을 정확하게 재현 할 수 있으며 동일한 데이터에서 업데이트 된 소프트웨어를 실행할 수 있습니다.
ActivePapers는 단순한 개념 증명 일뿐 아니라 가까운 시일 내에 실용적이지 않을 것입니다. 그 이유는 모든 실행 코드가 JVM 바이트 코드로 존재해야한다는 원칙에 기반하기 때문입니다. 현재로서는 너무 많은 인기있는 과학 라이브러리가 제외됩니다. 그러나 재현성이 중요한 것으로 인식되면 프로그래밍 도구의 우선 순위도 변경 될 수 있습니다.
언어를 선택하는 한 표준화 된 언어 (예 : C / Fortran / C ++)를 사용하는 것이 "모범 사례"라고 생각합니다. 패키지가 10 개의 다른 라이브러리 / 패키지, 특히 모호한 언어로 작성된 라이브러리에 의존한다면 그것은 장수에 좋지 않습니다. 얼마 후 많은 프로젝트가 고아가됩니다. BLAS / LAPACK, PETSc, FFTW, MPI 등과 같은 주요 라이브러리 / API가 곧 사라질 것이라고 생각하지 않습니다. BLAS는 이미 꽤 오래되었습니다.
다음 코드 조각 ( http://www.math.utah.edu/software/c-with-fortran.html 에서 도난 됨)은 Fortran 77보다 이전 버전이며 Charler 조작에는 Hollerith 상수를 사용하지만 40-50 년 후에는 잘 컴파일됩니다. GNU 포트란 컴파일러 :
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
오픈 소싱 / 구글 코드와 같이 어딘가에 사라질 가능성이 적습니다 (코드 검색을 종료 했음에도 불구하고).