COBOL에 본질적으로 Y2K 문제에 취약하게 만드는 것이 있습니까?

StackOverflow https://stackoverflow.com/questions/1463434

  •  13-09-2019
  •  | 
  •  

문제

나는 많은 Y2K의 노력/겁이 어떻게 든 COBOL을 중심으로했는지 알고 있거나 그렇지 않다는 것을 알고 있습니다. (도대체, 나는 2000 년 1 월 1 일에 파산 한 Perl 스크립트에서 작은 Y2K 버그를 보았다)

내가 관심있는 것은 COBOL에 대해 Y2K 문제에 취약한 언어로 특정한 것이 있습니까?

즉, 구식 하드웨어에 의해 구동되는 메모리/디스크 사용에 대해 스키를 타야 할 대부분의 프로그램의 나이와 달리, 그 프로그램이 30 년 동안 생존 할 것으로 예상하지 않았다는 사실은 무엇입니까?

대답이 "나이가 아닌 코볼에만 국한된 것은 없다"라면 완벽하게 행복합니다.

도움이 되었습니까?

해결책

예와 아니요. COBOL에서는 실제로 숫자에 몇 자릿수가 몇 자리인지 말해야 할 변수를 선언해야했습니다. YEAR PIC 99 변수를 선언했습니다 YEAR 두 십수 자릿수 만 담을 수 있도록. 그렇습니다. C보다 실수를 저지르는 것이 더 쉬웠습니다. int 또는 short 또는 char 올해는 99 년보다 몇 년 동안 충분한 공간을 가지고 있습니다. 물론 당신을 보호하지 않습니다. printf19%d C에서는 여전히 출력에 문제가 있거나 연도를 생각하여 다른 내부 계산을하는 것은 99보다 작거나 동일합니다.

다른 팁

스토리지 용량은 80%, 순수하고 단순했습니다.

사람들은 오늘날 노트북 하드 드라이브의 용량이 비용이 필요하다는 것을 깨닫지 못합니다. 수백만 1980 년에 두 바이트를 절약하는 것이 바보라고 생각하십니까? 냉장고 크기의 10 만 고객 기록과 하드 드라이브가있을 때는 20 메가 바이트를 들고 시원하게 유지하기 위해 특별한 방이 필요했습니다.

코드가 얼마나 오래 사용되는지 알지 못하는 사람들이 더 문제가 된 것처럼 보였으므로 2 자리를 사용하기로 결정했습니다.

따라서 COBOL에 대한 특정한 것은 없으며 COBOL 프로그램이 비판적이고 오래된 경향이 있으므로 영향을받을 가능성이 더 높습니다.

COBOL에 본질적으로 Y2K 문제에 취약하게 만드는 것이 있습니까?

프로그래머1. COBOL 프로그램이 실행되는 시스템2.


1 : 그들은 30 년을 보지 못했습니다. 나는 그들을 정말로 비난 할 수 없다. 메모리 제약이 있다면 날짜당 2 바이트를 짜는 것과 30 년 후에 작동하게하는 것 사이에서 같은 결정을 내릴 것입니다.

2 : 하드웨어가 연도를 두 자리로 저장하면 시스템이 동일한 문제를 겪을 수 있습니다.

매혹적인 질문. 본질적으로 Y2K 문제는 무엇입니까? 그것은 문제입니다 당신의 우주를 충분히 정의하지 않습니다. 공간이 더 중요했기 때문에 모든 날짜를 모델링하려는 심각한 시도는 없었습니다 (그리고 그 당시 앱이 대체 될 것입니다). 따라서 모든 수준의 COBOL에서는 중요합니다. 효율적이고 매장과 프로그램 수준 모두에서 필요한 메모리를 과도하게 설명하는 것이 중요합니다.

효율성이 중요한 경우, 우리는 y2kish 오류를 저지른다 ... 우리는 시간대없이 DB에 날짜를 저장할 때마다 이것을한다. 따라서 현대적인 스토리지는 분명히 Y2Kish 오류의 영향을받습니다. 왜냐하면 우리는 사용되는 공간에 효율적이기도 노력하기 때문입니다 (특히 기업 과잉 수준에서 많은 경우에 과도하게 최적화 할 것입니다).

반면에, 우리는 응용 프로그램 수준에서 Y2KISH 오류를 피합니다. 예를 들어 날짜 (Java에서는 말하면)와 함께 일할 때마다 항상 수하물 (시간대와 같은 수하물) 주위에 탑승하기 때문입니다. 왜요? 날짜 (및 다른 많은 개념)는 이제 OS의 일부이기 때문에 OS 제작 스마트 친구들은 완전한 날짜 개념을 모델링하려고합니다. 우리는 그들의 날짜 개념에 의존하기 때문에 그것을 망칠 수 없습니다 ... 그리고 모듈 식적이고 교체 가능합니다!

날짜와 같은 많은 것들에 대한 데이터 타입 (및 시설)이 내장 된 최신 언어와 함께 플레이 할 수있는 엄청난 메모리는 많은 잠재적 인 y2kish 문제를 피하는 데 도움이됩니다.

그것은 두 부분이었습니다. 1- COBOL 소프트웨어의 연령/장수 및 2- 데이터 레코드의 80 문자 한계.

첫 번째- 그 나이의 대부분의 소프트웨어는 연도 저장에 2 자리 숫자 만 사용했습니다. 아무도 소프트웨어가 그렇게 오래 지속될 것이라고 생각하지 않았기 때문입니다! 코볼은 코드를 버리지 않는 것으로 유명한 은행 업계에 의해 채택되었습니다. 대부분의 다른 소프트웨어는 버려졌지만 은행은하지 않았습니다!

둘째, COBOL은 데이터 레코드 당 80 자로 제한되었으며 (펀치 카드의 크기로 인해!) 개발자는 필드 크기를 제한 해야하는 압력이 훨씬 높았습니다. 그들은 "2000 년은 길고 은퇴 할 때까지 여기에 없을 것이라고 생각했기 때문입니다!" 저장된 데이터의 2자는 엄청났습니다!

0에서 99까지의 값 (또는 두 십수 자릿수 또는 단일 바이트) 만 보유 할 수있는 데이터 항목에 연도를 저장하는 것과 훨씬 더 관련이있었습니다. 연도 가치에 대해 비슷한 가정을 만든 계산.

Cobol 특이 적 일은 거의 아니 었습니다. 많은 프로그램이 영향을 받았습니다.

몇 가지 사항이있었습니다 COBOL 그것은 상황을 악화시켰다.

  • 오래되었고 도서관 코드 사용이 적고, 더 집단적으로 자란 모든 것
  • 그것은 오래되고, 이에 전, 사전 사회적 네트워킹, 더 많은 NIH, 더 적은 프레임 워크, 더 많은 맞춤형 물건
  • 오래되었고, 덜 추상적이며, 개방형 솔루션을 가질 가능성이 높습니다.
  • 늙었으므로, 충분히 멀리 돌아가서 2 바이트를 저장하는 것은 일종의 중요했을 수도 있습니다.
  • 오래되었으므로 SQL이 사전입니다. 레거시 운영 소프트웨어는 레코드 지향 디스크 파일을 색인화하여 롤링-다이타베이스에 대한 프로그램을 조금 더 쉽게 만들었습니다.
  • "printf"형식 문자열과 데이터 유형 선언은 동일한 것이 었습니다. N 숫자

나는 실제 서브 루틴이없는 거대한 Fortran 프로그램을 보았습니다. 실제로, 하나의 비 생물 서브 루틴이 아닌 3,000 줄의 메인 프로그램은 그게 그랬습니다. 나는 이것이 코볼 세계에서 일어 났을지도 모른다고 생각하므로 이제 날짜 처리를 찾으려면 모든 줄을 읽어야합니다.

COBOL은 표준 날짜 처리 라이브러리와 함께 제공되지 않았습니다.

그래서 모두가 자신의 솔루션을 코딩했습니다.

일부 솔루션은 밀레니엄에 비해 매우 나빴습니다. 이러한 나쁜 솔루션의 대부분은 응용 프로그램이 40 년 이상 살지 않았기 때문에 중요하지 않았습니다. 소수의 나쁜 솔루션은 비즈니스 세계에서 잘 알려진 Y2K 문제를 일으 킵니다.

(일부 솔루션은 더 좋았습니다. 저는 1950 년대에 2027 년까지 날짜 형식으로 코딩 된 COBOL 시스템을 알고 있습니다. 당시에는 영원히 보였을 것입니다. 그리고 1970 년대에 2079 년까지 좋은 시스템을 설계했습니다).

그러나 코볼에는 표준 날짜 유형이 있었습니까 ....

03 ORDER-DATE     PIC DATE.

.... 산업 넓은 솔루션은 컴파일러 수준에서 제공되어 필요한 모든 치료의 복잡성을 줄였습니다.

도덕 : 표준 라이브러리와 함께 언어를 사용합니다.

COBOL 85 (1985 표준) 및 이전 버전에는 현재 세기를 얻는 방법이 없었습니다. 이슈.

** 특정 구현은이 목적을 위해 비 표준 확장을 가졌을 수 있습니다.

COBOL의 유일한 고유 한 문제는 현재 시스템 날짜를 검색하기위한 원래 (1960 년대 후반) 표준 진술 이었다는 것입니다.

ACCEPT todays-date FROM DATE

이것은 날짜가 yymmdd 형식으로 6 자리 숫자를 반환했습니다.

그러나 90 년대 에이 진술을 사용하여 90 년대에 코드를 썼기 때문에 이것은 반드시 문제가되지는 않았으며,이 명령문을 사용하여 연도 부분이 70 미만인 지 확인했으며 날짜가 20yy라고 가정하여 Y2K070 문제로 만들었을 것입니다. :-)

표준은 나중에 연장되었으므로 (COBOL-85, 생각합니다) : 날짜를 다른 형식으로 요청할 수 있습니다.

ACCEPT todays-date FROM CENTURY-DATE

날짜가 ccyymmdd로 8 자리 번호를 제공했습니다.

당신과 다른 사람들이 지적했듯이, 많은 다른 컴퓨터 프로그래밍 언어로 인해 날짜/년의 '손실'표현이 허용되었습니다.

문제는 실제로 70 년대 후반 80 년대 초의 메모리와 스토리지 제약에 관한 것이 었습니다.

백만 달러 컴퓨터의 1/4에 총 128k 및 4 개의 디스크가 약 6 메가 바이트를 가졌을 때 12 Meg의 디스크 스토리지가있는 256k 기계에 대해 다른 분기 밀을 요청하거나 공간에 대해 매우 효율적 일 수 있습니다.

따라서 모든 종류의 공간 절약 트릭을 사용했습니다. 내가 가장 좋아하는 것은 yymmdd 날짜를 포장 된 10 진수 필드 x'9912310c '에 991231로 저장 한 다음 마지막 바이트를 노크하고'991231 '으로 보관하는 것이 었습니다. 따라서 6 바이트 대신 3 바이트 만 가져갔습니다.

다른 트릭에는 가격에 대한 인코딩 인 Hokey Hooky 유형 (코드 12-> $ 19.99)이 포함되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top