Одна давняя находка под новым углом
Nov. 16th, 2023 09:05 pmПримерно к началу второй половины 1980-х на БЭСМ-6 стало более или менее хватать памяти на внешних носителях, чтобы организовать самый простой вариант управления исходными текстами крупных проектов: "текущая версия" и "стабильная версия", и интенсивность разработки достигла такого уровня, что сравнивать тексты на бумажках глазками стало уже недостаточно производительно.
В связи с этим в составе кросс-системы разработки СПО Эльбруса-Б на БЭСМ-6/СВС появилась программа "Компаратор" - функциональный аналог программы юниксной утилиты diff, двоичный код которой сохранился. Она была найдена, и работоспособность её была проверена несколько лет назад.
Мне ещё в 80-е было известно, что она была написана на Паскале (с некоторыми добавками - в частности, со встроенной в компилятор поддержкой приватной "файловой системы"); но только пару дней назад я обнаружил, что она была скомпилирована в отладочном режиме: с включёнными проверками принадлежности индексов границам массивов, и с сохраненными в сегменте констант именами процедур и имен переменных ради возможности посмертного дампа. Номера строк исходного текста, в которых производились проверки индексов, и номера строк начал процедур тоже сохранились.
Так, например, аналог getchar назывался ДАЙСИ, процедура ввода параметров командной строки - ВВЛЕКСЕМ, а процедура завершения и выхода в интерактивную оболочку - FINITA.
Это даёт нам практически уникальную возможность восстановить исходный текст программы практически до оригинального вида (именах - вплоть до первых 8 символов), исключая разве что комментарии и мелкие детали форматирования.
И вот ещё что интересно: в те далёкие времена сколь-нибудь внимательно смотреть на порождаемый Паскаль-компилятором ассемблерный код с целью увидеть в нём возможности для оптимизации было весьма трудоёмко, потому что компилятор сразу гнал двоичный объектник, а пользоваться дизассемблером, или, вообще, знать о существовании такой фичи умели не все. Код получается весьма рыхлый.
В связи с этим в составе кросс-системы разработки СПО Эльбруса-Б на БЭСМ-6/СВС появилась программа "Компаратор" - функциональный аналог программы юниксной утилиты diff, двоичный код которой сохранился. Она была найдена, и работоспособность её была проверена несколько лет назад.
Мне ещё в 80-е было известно, что она была написана на Паскале (с некоторыми добавками - в частности, со встроенной в компилятор поддержкой приватной "файловой системы"); но только пару дней назад я обнаружил, что она была скомпилирована в отладочном режиме: с включёнными проверками принадлежности индексов границам массивов, и с сохраненными в сегменте констант именами процедур и имен переменных ради возможности посмертного дампа. Номера строк исходного текста, в которых производились проверки индексов, и номера строк начал процедур тоже сохранились.
Так, например, аналог getchar назывался ДАЙСИ, процедура ввода параметров командной строки - ВВЛЕКСЕМ, а процедура завершения и выхода в интерактивную оболочку - FINITA.
Это даёт нам практически уникальную возможность восстановить исходный текст программы практически до оригинального вида (именах - вплоть до первых 8 символов), исключая разве что комментарии и мелкие детали форматирования.
И вот ещё что интересно: в те далёкие времена сколь-нибудь внимательно смотреть на порождаемый Паскаль-компилятором ассемблерный код с целью увидеть в нём возможности для оптимизации было весьма трудоёмко, потому что компилятор сразу гнал двоичный объектник, а пользоваться дизассемблером, или, вообще, знать о существовании такой фичи умели не все. Код получается весьма рыхлый.