Проблемы декомпиляции при плохой оптимизации

9 views
Skip to first unread message

Leo B.

unread,
Aug 22, 2025, 8:41:23 PM (13 days ago) Aug 22
to БЭСМ-6
Рассмотрим тривиальную программу на Фортране:
      program main
      common/D0/D01,D02,D03,D04,D05,D06,D07,D08,D09,D010
      D08 = D09
      D03 = D05
      D06 = D03
      ...  сколько- то там случайных присваиваний туда-сюда
      end
и скомпилируем её Фортраном-ГДР. Получим, как и ожидается  от оптимизирующего компилятора,  нечто вроде
         *D0*:,LС,10
...
         1,VТМ,*D0*
          1,ХТА,8
          1,АТХ,7
          1,ХТА,4
          1,АТХ,2
          1,ХТА,2
          1,АТХ,5
...
(peephole оптимизацию считывания после записи в данном случае не нажили, ну да ладно; хотя в принципе они мне попадались)

А теперь сделаем тривиальное изменение в программе:
      program main
      common/D0/D(10)
      D(8) = D(9)
      D(3) = D(5)
      D(6) = D(3)
...
Внезапно, получим
         ,UТС,*D0*+8
          ,ХТА,
          ,UТС,*D0*+7
          ,АТХ,
          ,UТС,*D0*+4
          ,ХТА,
          ,UТС,*D0*+2
          ,АТХ,
          ,UТС,*D0*+2
          ,ХТА,
          ,UТС,*D0*+5
          ,АТХ,
...
И так для первых 10 операторов присваивания в программе. Потом он спохватывается, устанавливает базу на регистр 1, и становится всё как раньше.

Когда в программе используется несколько common-блоков, то подобрать на основании сочетания UTC  и сдвигов по регистрам при обращении к  разным переменным этих блоков, где в блоках были отдельные переменные, а где массивы, чтобы добиться полного совпадения результата компиляции с оригиналом, оказывается практически невозможно.

Для справки: Фортран-Дубна всё всегда делает с помощью UTC; Форекс  в обоих случаях сразу пользуется базовым регистром,  и peephole оптимизация  тоже в принципе имеется, но в приведенном фрагменте не срабатывает, и для более длинных вариантов программы  эти оптимизации оказываются почему-то разные.

Leo
Reply all
Reply to author
Forward
0 new messages