Запуск древней программы на Паскале окончился «делением на ноль». Все божились, что эту программу никто не трогал и не перетранслировал уже лет десять. Да и дата EXE-файла это подтверждала.
Какое там еще может быть деление на ноль? Пришлось вооружиться древним же отладчиком и проанализировать действия программы.
Выяснилось две вещи.
Первое. Никакого деления на ноль не было и нет. Срабатывает совсем другое исключение: «непредставимое частное», т.е. при делении значения в паре регистров DX:AX на значение в CX получающееся частное не помещается в 16 разрядов. Совершенно непонятно, почему разработчики x86 не ввели другой номер исключений для такой ситуации, а совместили его с «настоящим» делением на ноль. Это просто вводит в заблуждение, как в данном случае.
Второе. Делением определялась скорость компьютера в самом начале (в прологе) программы, еще до начала выполнения собственно операторов программы. Т.е. программа была вообще ни при чем.
Виновата системная библиотека. А скорость определялась экзотическим способом. В период времени между системными «тиками » (не путать с тактами процессора), выполнялась эталонная последовательность команд и подсчитывалось число раз, которая эта последовательность успела выполниться. Затем полученное число раз делилось на число раз, показанное первой IBM-PC/XT. Таким образом, скорость считалась «в персоналках», т.е. практически действительно «в попугаях».
А закон Мура все эти годы продолжал действовать. И каждые два года скорость персоналок удваивалась. И, наконец, программу, содержащую определение никому не нужной скорости «в XT» запустили всего лишь на ноутбуке ThinkPad A31p. Но его скорость уже превысила скорость XT более чем в 65535 раз, и совершенно бесполезное определение скорости не позволило выполнить старую программу.
Пришлось «выкусывать» прямо в EXE-файле это глупое деление.Кстати, из любопытства я на "калькуляторе" разделил два эти числа и получил ускорение относительно XT в 118351 раз. Т.е. для обычных, доступных всем компьютеров, такое ускорение было достигнуто примерно с 1981 по 2002 год. Неплохо. А скорость «в попугаях» лучше все-таки не мерить.
P.S. Эта проблема древних Паскаль-программ давно известная и давно решенная. Но я заметил, что большинство программистов никогда не задумывалось, почему оно так вышло.
Sly_tom_cat
Ну когда-то давно такие вещи казались актуальным и нужным (помню еще время первых PC).
Просто мир меняется… и порой кажется что мы за ним уже не поспеваем, не то что программы 10+ летней давности…
Fedorkov
Поэтому разработчик системных библиотек должен каждый день задавать себе глупые с виду вопросы:
А что, если компьютер будет работать в миллион раз быстрее?
А что, если программа запущена после 2038 года?
А что, если железо реализует вещественные числа не по IEEE 754?
nerudo
А что если каждые два года начнут клепать новую версию одного и того же языка программирования?
Fedorkov
Тогда разработчик получит ошибку компиляции или deprecation warning.
vladimirad
Два года?
У меня сайтик на Вордпрессе ругается на устаревший РНР 7.3
Sly_tom_cat
Вы просто плохо представляете те времена.
Тогда довольно трудно было представить, что через десять+ лет:
1. вашу программу/библиотеку все еще будут использовать
2. что железо лежащее в кармане будет работать быстрее и обладать гораздо большими ресурсами чем здоровенный ящик с громоздким ЭЛТ монитором.
Ведь вроде ж не дурак был Билли, но про 640Мб, которых хватит всем и навсегда от таки умудрился сказануть…
Dukarav Автор
Эх, если бы про 640Мб, Билли говорил про 640 Кб ((
Sly_tom_cat
Да, давно это было… уже даже трудно представить что про 640Кб была речь а не про 640Мб…
Fedorkov
Билл Гейтс этого не говорил. Про закон Мура слышали все, и всем было очевидно, что мы в течение одной человеческой жизни застанем рост производительности на много порядков.