Варианты использования для самоизменения кода?
В архитектуре фон Неймана программа и данные хранятся в памяти, поэтому программа может изменять себя. Это полезно для программиста? Не могли бы вы привести несколько примеров?
2 ответа
метаморфизм
Один (сомнительный) вариант использования, который приходит мне в голову, - это метаморфические компьютерные вирусы. Это вредоносные программы, которые скрываются от обнаружения на основе сигнатур, переписывая собственный машинный код в семантически эквивалентное представление, которое выглядит иначе.
батуте
Другой (более сложный, но также более распространенный) вариант использования - это трамплин, метод, основанный на динамической генерации кода для решения определенных проблем с вызовами вложенных функций.
JIT сборник
Наиболее распространенное использование динамического генерирования кода, о котором я могу подумать, - это JIT-компиляция. Современные языки, такие как.NET или Java, компилируются не в машинный код, а в некоторый промежуточный язык (называемый байт-кодом). Этот байт-код затем интерпретируется при выполнении программы (виртуальной машиной, написанной для целевой архитектуры). В то же время фоновый процесс проверяет, какие части кода выполняются очень часто. Эти части имеют хорошие шансы быть динамически скомпилированными в машинный язык для максимальной производительности. Все это происходит во время выполнения программы!
Последствия для безопасности
Следует иметь в виду, что возможность интерпретировать данные как код полезна для использования дыр в безопасности в компьютерном программном обеспечении, поэтому тенденция в современных аппаратных и операционных системах состоит в том, чтобы включать и, по возможности, даже обеспечивать разделение кода. и данные (также см. бит NX и DEP).
Я могу лучше всего ответить на это, направив вас на ответ на аналогичный (исключительно хорошо написанный и отвеченный) вопрос, также по Stackru - Homoiconic и "неограниченный" самоизменяющийся код + Действительно ли lisp самоизменяется?, Ответ сфокусирован на Лиспе, семейном языке, известном тем, что он выводит "код - данные" на следующий уровень, и исследует использование этого в AI.