Варианты использования для самоизменения кода? - PullRequest
4 голосов
/ 03 января 2012

В архитектуре Von Neumann программа и данные хранятся в памяти, поэтому программа может изменять себя. Это полезно для программиста? Не могли бы вы привести несколько примеров?

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Метаморфизм

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

Прыжки на батуте

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

JIT-компиляция

Наиболее распространенное использование динамического генерирования кода, о котором я могу думать, это JIT (оперативная) компиляция .Современные языки, такие как .NET или Java, компилируются не в машинный код, а в некоторый промежуточный язык (называемый байт-кодом).Этот байт-код затем интерпретируется при выполнении программы (виртуальной машиной, написанной для целевой архитектуры).В то же время фоновый процесс проверяет, какие части кода выполняются очень часто.Эти части имеют хорошую возможность динамически компилироваться в машинный язык для максимальной производительности.Все это происходит во время выполнения программы!

Последствия для безопасности

Следует иметь в виду, что возможность интерпретировать данные как код полезна для использованиядыры в безопасности в компьютерном программном обеспечении, поэтому тенденция в современных аппаратных и операционных системах состоит в том, чтобы включать и, если возможно, даже обеспечивать разделение кода и данных (см. также NX bit и DEP ).

1 голос
/ 03 января 2012

Лучше всего я могу ответить на этот вопрос, направив вас к ответу на аналогичный (исключительно хорошо написанный и отвеченный) вопрос, также по StackOverflow - Гомоиконичный и «неограниченный» самоизменяющийся код + Действительно ли лисп самодифицируется? . Ответ сфокусирован на Лиспе, семейном языке, известном тем, что он выводит «код - данные» на следующий уровень, и исследует использование этого в AI.

...