А.Г. Сурков
директор фирмы "Е.Р.А."
В.В. Урусов
главный инженер фирмы "Е.Р.А."
Введение: суть "Проблемы 2000"
Чтобы отследить корни "Проблемы 2000", нужно вернуться на несколько десятилетий назад к началу развития компьютерных технологий. Память тогда стоила очень дорого, и чтобы сэкономить и без того ограниченные ресурсы, программисты приняли решение использовать только две младшие цифры значения года для записи даты. По этому принципу 1999 год определяется как 99, а 2000 - как 00. Очевидно, что, в отрыве от указания на столетие, логически на временной шкале отметка 00 расположена до отметки 99, а никак не наоборот. При этом исполняемая программа, определив 00 год как 1900, не посчитает его високосным, и именно в этом будет права, потому что 1900 год таковым не является. Однако, при этом в високосном 2000 году компьютер (считая его 1900) не учтет 29 февраля, и счет времени будет отставать на один день. Все это создает определенную проблему для компьютеров, работающих с реальным временем, так что программа может неправильно обработать данные о дате и тем самым вызвать сбой в работе системы.
Варианты решения проблемы
Казалось бы решить проблему несложно, но массовость ее проявления, особенно в прикладных программах, и, следовательно, большой объем работы делает эту задачу чрезвычайно затруднительной - требующей значительных затрат времени и финансов.
Рассмотрим возможные методы решения проблемы на концептуальном уровне.
1. Метод расширения (раздвижки)
Данный метод предполагает осуществить изменение формата представления даты, произведя расширение двузначной записи года до четырехзначной и изменив соответствующие приложения. Таким образом, проблема решается раз и навсегда - по крайней мере до 9999 года. Однако, такое расширение требует изменения во всех существующих записях баз данных полей, хранящих значения дат, что является весьма дорогостоящей задачей, особенно если речь идет об обширных объемах хранимых данных.
Также необходимо изменить все приложения, работающие с датами, с тем, чтобы разместить четырехзначное значение года. Это подразумевает увеличение хранимой в память информации. В ходе работы по осуществлению этих задач неизбежно возникает ситуация, когда часть приложений будет способна оперировать четырехзначными датами, в то время как другая часть все еще будет ожидать необходимых изменений.
Если начать с изменения не данных, а приложений, то можно ввести программу-переходник, которая позволит осуществлять перевод из одного формата в другой. Например, программа-переходник может быть помешена между введенными двузначными данными даты и каким-либо (четырехзначным) приложением с целью расширения формата даты до четырехзначного прежде, чем данные будут представлены приложению. Архивы данных содержат только даты, относящиеся к 20 столетию, так что программы-переходники должны быть не слишком сложными конвертерами. Все новые вводимые данные предлагается вводить в расширенном формате, так что они не будут нуждаться в конвертировании.
Альтернативным вариантом раздвижки является внедрение в операции чтения/записи алгоритма, позволяющего осуществить расширение формата, так что даты прочитываются и записываются как четырехзначные, но при этом кодирование выполняется внутри приложения, а не отдельным шагом на уровне управления заданиями. Описания данных требуют изменения, как, возможно, и некоторые приложения, с тем, чтобы увеличить четырехзначные записи года.
2. Метод "Окна"
Приложениям сообщается логическая способность распознавания, к которому столетию относятся две цифры года. Концепция "окно" определяется в определенном рассмотрении линии времени, предполагающем, что все данные размешены в промежутке (или окне) 100 лет. Например, если допустить, что даты не простираются в прошлое дальше, предположим, 1950 года, то можно внести в приложения логическую схему, которая позволит интерпретировать годы 50-99 как 1950-1999, а годы 00-49 как 2000-2049.
Такое решение требует несколько более сложного кодирования, чем простое расширение, но зато не возникает необходимости какого-либо изменения существующих данных. Очевидно, что подобный метод не будет работать после 2049 года (для приведенного выше примера), а также в ситуации работы с данными, охватывающими период времени больший, нежели 100 лет.
3. Метод инкапсуляции
При реализации этого метода разрабатывается специальная программа (оболочка), в которую "вкладывается" приложение. Оболочка (капсула) занимается тем, что сдвигает все вводимые данные на 28 лет назад, а все выводимые - на 28 лет вперед. Сдвиг на 28 лет дает точное соответствие дня недели календарной дате. Таким образом, вокруг приложения создается статичная временная оболочка. У данного метода есть преимущество - он не требует изменения данных и приложений (за исключением определения "сегодняшней" даты). Очевидно, что данный метод можно рассматривать лишь как временное средство для отсрочки более фундаментального решения.
4. Метод сжатия (компрессии)
Если отказаться от привычного способа отображения десятичного числа и представить его в двоичном коде (так сказать некорректно, да?), то два 8-битных байта позволяют записать число до 65535. Таким образом, мы можем без увеличения затрат на память записать все четыре цифры года в тех же 2 байтах. Слабая сторона такого метода заключается в необходимости модификации всех приложений, с тем чтобы они могли правильно оперировать датами в нестандартной кодировке.
Описание подхода, реализуемого фирмой "Е.Р.А." для решения "Проблемы 2000"
Анализируя описанные методы, можно видеть, что все они в той или иной мере требуют модификации существующих программ. Учитывая, что к настоящему времени в каждом ведомстве (организации) написаны сотни тысяч и миллионы строк текстов прикладных программ, становится заманчивым разработать метод, позволяющий осуществить решение "Проблемы 2000" без изменения существующих прикладных программ.
Наиболее актуально такое решение "Проблемы 2000" для тех организаций и ведомств, которые используют наработанные в 70-80 годах программы, функционирующие в среде ЕС ЭВМ. Характерной особенностью многих из этих программ является полное или частичное отсутствие как исходных текстов, распад или перепрофилирование коллективов разработчиков. Т.е. практически модифицировать программы невозможно, а писать новые - дорого. Для разрешения возникшей коллизии, специалистами фир-мы "Е.Р.А." разработан программный эмулятор, реализую-щий на ПЭВМ систему команд ЕС ЭВМ в полном объеме и, кроме того, обеспечивающий корректную обработку зна-чений даты до, во время и после 2000 года. Это достига-ется использованием оригинального метода манипулиро-вания данными, содержащими значения даты.
В поле даты под запись значения года отведено два байта. Каждая цифра представлена двумя шестнадцатеричными цифрами в кодировке EBCDIC. Например, 1975 год записан как F7F5. Однако, отступив от общепринятого способа кодировки, можно использовать также и цифры FA - FF, расширив, таким образом, принятую арифметику. При этом имеется возможность записать значение года до 2059, получая таким образом запас времени для поисков фундаментального решения. Следуя этому принципу, например, 1999 год будет записан как F9F9, а 2000 - уже как FAFO. FO - представление цифры 0, a FA - цифры 10. При преобразовании в бинарный вид такого числа оно будет преобразовано в 100, что, при суммировании с 1900 (на-пример, при получении астрономической даты) даст нормальную дату - 2000.
Такой способ представления информации о дате не является стандартным для существующих процессов, а потому для того, чтобы данная информация могла быть корректно обработана, необходимо принять дополнительные меры, в противном случае может произойти сбой в выполнении программы-обработчика, так как "кодами команд арифметики предусмотрен трап для чисел, не соответствующих установленному формату даты.
Чтобы избежать этого, необходимо изменить алгоритм выполнения команд десятичной арифметики для операций с датами, использующий расширенную арифметику. Аля этого в эмуляторе реализовано пространство тэгов, в котором для каждого полуслова в определенной памяти, содержащего дату, с тем же смешением относительно начала пространства находится дополнительная информация о данных оперативной памяти - тэг. Т.е., для каждой записи даты в оперативной памяти в тэговом пространстве существует указание, что в данной ячейке памяти лежит именно дата. При перемещении или копировании данных происходит обязательная миграция соответствующего тэга. Переключение алгоритмики программы выполняется внутри кода команды на основании значения определенного бита данного тэга. Таким образом, мы получаем возможность по факту наличия определенного нами признака ( в данном случае даты) изменить алгоритм выполнения обработки данных.
Информация о дате попадает в оперативную память из нескольких источников и, в зависимости от того, откуда берутся данные, тем или иным способом осуществляется тегирование. Разберем возможные варианты.
1. Часы реального времени.
Часы реального времени хранят дату в ячейке памяти длиной 8 байт в виде числа в двоичном коде, которое представляет собой количество долей секунды, прошедшее от условной даты. Специальная программа обрабатывает это число, преобразуя его в двухбайтовую двузначную запись года, при этом присваивая данной ячейке памяти тэг, индексирующий ее как запись даты.
2. Предварительно проинициализированные поля оперативной памяти.
В определенных ячейках памяти операционная система располагает дату, получая ее значение из часов реального времени. Механизм тэгирования при этом тот же, что и в предыдущем случае.
3. Ввод/вывод.
При вводе с внешнего носителя для файла, содержащего дату, на диске хост-машины создается соответствующий тэговый файл. Поскольку структура исходного файла известна пользователю, протэгировать записи даты не представляется сложной задачей. На эмулируемый диск ЕС ЭВМ помешаются оба файла, так что каждая запись даты соответствующим образом проиндексирована.
При выводе на внешний носитель дата помешается в оперативную память, а затем специальная программа проверяет наличие в предшествующей ячейке памяти записи F1F9, являющейся частью шаблона выполняемого приложения. Если такая запись присутствует, то в тэговом пространстве инициализируется соответствующий бит /дополнительно к биту признака даты/, по наличию которого производится десятичная операция сложения, и последовательность цифр, например, "F1 F9 FA FO" преобразуется в " F2 FO FO FO".
Заключение
Предлагаемый нами метод решения "Проблемы 2000" не требует изменения исходных текстов программ или данных. Для его практической реализации достаточно про-извести изменение микрокода используемых команд с целью сообщения возможности отключения механизма проверки числа на соответствие установленному формату по факту инициализации определенного бита в тэге.
Несмотря на то, что данный метод, безусловно, является временной "заплаткой", он представляется нам наиболее удачным, поскольку дает возможность изящно решить проблему на данном этапе, не прибегая к изменению хранимых данных и сложному перекодированию существующих приложений.