Было ли что-то в Cobol, что делало его восприимчивым к проблемам Y2K?

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

  •  13-09-2019
  •  | 
  •  

Вопрос

Я знаю, что многие усилия / паника Y2K были так или иначе сосредоточены на COBOL, заслуженно или нет.(черт возьми, я видел незначительную ошибку Y2K в Perl-скриптах, которая сломалась 1/1/2000)

Что меня интересует, было ли что-то специфичное для COBOL как языка, которое сделало его восприимчивым к проблемам Y2K?

То есть, в отличие от простого возраста большинства программ, написанных на нем, и последующей необходимости экономить на использовании памяти / диска из-за старого оборудования и того факта, что никто не ожидал, что эти программы просуществуют в течение 30 лет?

Я совершенно счастлив, если ответ будет "ничего специфичного для COBOL, кроме возраста" - просто любопытный, ничего не знающий о COBOL.

Это было полезно?

Решение

Да и Нет.В COBOL вы должны были объявлять переменные таким образом, чтобы вам действительно приходилось указывать, сколько цифр содержится в числе, т. е., YEAR PIC 99 объявленная переменная YEAR таким образом, чтобы он мог содержать только две десятичные цифры.Так что да, было легче совершить эту ошибку, чем в C, если бы вы имели int или short или char как год, и все еще остается достаточно места для лет, превышающих 99.Конечно, это не защищает вас от printfing 19%d в C и все еще испытываете проблему в ваших выходных данных или производите другие внутренние вычисления, основанные на предположении, что год будет меньше или равен 99.

Другие советы

Речь шла на 80% о емкости хранилища, чисто и просто.

Люди не понимают, что емкость жесткого диска их ноутбука сегодня стоила бы миллионы в 1980 году.Вы думаете, что экономить два байта глупо?Не тогда, когда у вас есть записи о 100 000 клиентах, а жесткий диск размером с холодильник вмещает 20 мегабайт и требует специального помещения для сохранения прохлады.

Казалось, что это скорее проблема людей, не знающих, как долго будет использоваться их код, поэтому они решили использовать 2-значные годы.

Итак, ничего специфичного для COBOL, просто программы на COBOL, как правило, критичны и устарели, поэтому они с большей вероятностью пострадали.

Было ли что-то в Cobol, что делало его восприимчивым к проблемам Y2K?

Программисты1.И системы, в которых выполняются программы COBOL2.


1:Они не проектировали, заглядывая на 30 лет вперед.На самом деле я не могу их винить.Если бы у меня были ограничения по памяти, между сжатием 2 байт на дату и тем, чтобы она работала на 30 лет позже, скорее всего, я бы принял то же решение.

2:Системы могли бы столкнуться с той же проблемой, если бы аппаратное обеспечение хранило год в виде двух цифр.

Увлекательный вопрос.В чем, по сути, заключается проблема Y2K?Это проблема того, что недостаточно определяющий вашу вселенную. Не было серьезной попытки смоделировать все даты, потому что пространство было важнее (и приложения к тому времени были бы заменены).Так что в Cobol это важно на каждом уровне:чтобы быть эффективным и не перегружать память, которая вам нужна, как на уровне хранилища, так и на программном уровне.

Там, где важна эффективность, мы совершаем ошибки Y2Kish...Мы делаем это каждый раз, когда сохраняем дату в базе данных без часового пояса.Таким образом, современное хранилище определенно подвержено ошибкам Y2Kish, потому что мы стараемся эффективно использовать пространство (хотя, держу пари, во многих случаях это чрезмерная оптимизация, особенно на корпоративном уровне "переусердствовать во всем").

С другой стороны, мы избегаем ошибок Y2Kish на уровне приложения, потому что каждый раз, когда вы работаете, скажем, с датой (скажем, в Java), она всегда несет с собой тонну багажа (например, часовой пояс).Почему?Потому что дата (и многие другие концепции) теперь являются частью операционной системы, поэтому умники, создающие ОС, пытаются смоделировать полномасштабную концепцию даты.Поскольку мы полагаемся на их концепцию даты, мы не можем все испортить...и это модульно и заменяемо!

Новые языки со встроенными типами данных (и возможностями) для многих вещей, таких как дата, а также огромная память для работы, помогают избежать множества потенциальных проблем с Y2Kish.

Это было две части.1 - возраст / долговечность программного обеспечения Cobol и 2 - ограничение на 80 символов записей данных.

Во-первых, большинство программ того времени использовали только двухзначные числа для хранения в течение года, поскольку никто не предполагал, что их программное обеспечение прослужит так долго!COBOL был принят банковской индустрией, которая известна тем, что никогда не выбрасывает код.Большинство другого программного обеспечения БЫЛО выброшено, в то время как банки этого не сделали!

Во-вторых, поскольку COBOL был ограничен 80 символами на запись данных (из-за размера перфокарт!), разработчики находились под еще большим давлением, требуя ограничить размер полей.Потому что они решили, что "2000 года не будет, пока я не состарюсь надолго и не выйду на пенсию!" - 2 символа сохраненных данных были огромными!

Это было гораздо больше связано с хранением года в элементах данных, которые могли содержать значения только от 0 до 99 (два символа, или две десятичные цифры, или один байт).Это и расчеты, в которых делались аналогичные предположения относительно значений за год.

Вряд ли это было что-то специфичное для Cobol.Это повлияло на многие программы.

Там были некоторые вещи о COBOL это усугубило ситуацию.

  • он старый, поэтому меньше используйте библиотечный код, больше доморощенного всего
  • это старое, то есть до интернета, до социальных сетей, больше NIH, меньше фреймворков, больше пользовательских вещей
  • он старый, поэтому менее абстрактный, с большей вероятностью будет иметь решения с открытым кодом.
  • он старый, так что вернитесь достаточно далеко назад, и экономия 2 байт могла бы, в некотором роде, быть важной
  • он старый, так что, значит, он предшествовал SQL.В устаревшем операционном программном обеспечении даже были проиндексированные файлы на диске, ориентированные на запись, чтобы немного упростить внедрение собственной базы данных в каждую программу.
  • строки формата "printf" и объявление типа данных были одним и тем же, все имело n цифры

Я видел гигантские программы на Fortran без каких-либо реальных подпрограмм.Действительно, одна основная программа из 3000 строк, ни одной небиблиотечной подпрограммы, вот и все.Я предполагаю, что это могло произойти в мире COBOL, так что теперь вам нужно прочитать каждую строку, чтобы найти обработку даты.

COBOL никогда не поставлялся с какой-либо стандартной библиотекой обработки дат.

Таким образом, каждый закодировал свое собственное решение.

Некоторые решения были очень плохими по отношению к тысячелетию.Большинство из этих плохих решений не имели значения, поскольку приложения не прожили более 40 лет.Не столь уж малое число плохих решений является причиной хорошо известной проблемы Y2K в деловом мире.

(Некоторые решения были лучше.Я знаю системы COBOL, закодированные в 1950-х годах с форматом даты, действительным до 2027 года - должно быть, в то время это казалось вечностью;и я разработал системы в 1970-х годах, которые будут работать до 2079 года).

Однако, если бы у COBOL был стандартный тип даты....

03 ORDER-DATE     PIC DATE.

....Общеотраслевые решения были бы доступны на уровне компилятора, что сократило бы сложность любого необходимого исправления.

Моральный:используйте языки со стандартными библиотеками.

В COBOL 85 (стандарт 1985 года) и более ранних версиях не было никакого способа получить текущее значение century **, что было одним из факторов, присущих COBOL, который препятствовал использованию 4-значных years даже после того, как 2 байта дополнительного места для хранения больше не были проблемой.

** Конкретные реализации, возможно, имели нестандартные расширения для этой цели.

Единственной внутренней проблемой с Cobol была его оригинальная (конец 1960-х) стандартная инструкция для получения текущей системной даты, которая была:

ACCEPT todays-date FROM DATE

Это вернуло 6-значное число с датой в формате YYMMDD.

Однако даже это не обязательно было проблемой, поскольку мы писали код в 90-х годах, используя этот оператор, который просто проверял, была ли часть года меньше 70, и предполагал, что дата была 20YY, что сделало бы это проблемой Y2K070.:-)

Стандарт был расширен позже (я думаю, COBOL-85), чтобы вы могли запрашивать дату в разных форматах, например:

ACCEPT todays-date FROM CENTURY-DATE

Который выдал вам 8-значный номер с датой в виде CCYYMMDD.

Как вы и другие отмечали, многие другие языки компьютерного программирования допускали представление дат / лет с потерями.

На самом деле проблема была связана с ограничениями памяти и накопителей в конце 70-х начале 80-х годов.

Когда на вашем компьютере стоимостью в четверть миллиона долларов было 128 КБ и 4 диска общим объемом около 6 мегабайт, вы могли либо попросить у своего руководства еще четверть миллиона для компьютера емкостью 256 КБ с 12 мегабайтами дискового пространства, либо очень, очень экономно расходовать пространство.

Таким образом, были использованы всевозможные приемы экономии места.Моим любимым было сохранить дату YYMMDD как 991231 в упакованном десятичном поле x '9912310C', затем удалить последний байт и сохранить его как '991231'.Таким образом, вместо 6 байт вы заняли всего 3 байта.

Другие трюки включали в себя кодировку типа hokey Hooky по ценам - код 12 - > 19,99 долларов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top