Существуют ли современные компиляторы для языков высокого уровня на простых процессорах, которые производят самомодифицирующийся код?

Во времена, когда еще не было кешей и предсказаний ветвлений, создание самомодифицирующегося кода для определенных видов оптимизации было относительно обычным делом, если не поощрять его. Вероятно, это было наиболее распространено в играх и демоверсиях, написанных на ассемблере в эпоху от 8-битной до ранней 32-битной, таких как Amiga.

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

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

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


Есть вопрос с похожим названием: «Есть ли здесь самоулучшающийся компилятор?», но учтите, что он не на ту же тему:

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


person hippietrail    schedule 24.10.2012    source источник
comment
Вероятно, это было гораздо более распространено через глагол COBOL ALTER в 1960-х годах.   -  person user207421    schedule 25.10.2012
comment
Старые компиляторы для 8-битных версий и Amiga / Atari вообще не генерировали очень эффективный код, поэтому я почти уверен, что они не использовали подобные приемы. Также для встроенных систем код часто находится в ПЗУ, поэтому самостоятельная модификация невозможна. Но это интересная техника :)   -  person Ville Krumlinde    schedule 25.10.2012
comment
@VilleKrumlinde: Ой, я забыл о факторе ROM - спасибо за это.   -  person hippietrail    schedule 25.10.2012
comment
Я был бы удивлен, если бы какой-либо компилятор сгенерировал самомодифицирующийся код, даже в качестве опции. Помимо проблемы с ПЗУ, это не прерывание / потокобезопасность.   -  person Martin James    schedule 25.10.2012
comment
@MartinJames: Я тоже, но я уже несколько раз удивлялся - там есть какие-то странные вещи (-:   -  person hippietrail    schedule 25.10.2012
comment
@hippietrail - если вы найдете компилятор, который использует такую ​​отвратительную «оптимизацию», выключите его или найдите другой компилятор :)   -  person Martin James    schedule 25.10.2012


Ответы (1)


Все встроенные системы сегодня используют флэш-ПЗУ. Я считаю, что Amiga и подобные были системами на основе RAM. Единственный способ "самомодификации" существует во встроенных системах, это когда у вас есть загрузчики, которые перепрограммируют определенные части флэш-памяти в зависимости от того, какую программу и / или функциональные возможности следует использовать.

Кроме того, программе не имеет смысла изменять себя во время выполнения. Запуск кода из ОЗУ обычно не рекомендуется из соображений безопасности (возможность случайных модификаций, вызванных ошибками) и по причинам, связанным с электричеством (ОЗУ нестабильно и гораздо более чувствительно к электромагнитной совместимости, чем флэш-память).

person Lundin    schedule 25.10.2012
comment
Что ж, у Amiga было ПЗУ, в котором было больше, чем BIOS ПК, но не вся ОС, большая часть которой была загружена в ОЗУ во время загрузки. Я не помню, как были разделены обязанности. - person hippietrail; 20.12.2012