В Интернете есть несколько примеров, демонстрирующих, как написать самомодифицирующийся код. Но это всего лишь примеры. Я бы хотел o знать, существует ли какое-либо реальное приложение, являющееся самомодифицирующимся кодом. Спасибо!
Динамическое время выполнения языка (DLR) использует код самоизменения для оптимизации для общих типов данного сайта вызова.
Скажем, Вы пишете динамически типизированный язык сверху.NET, и у Вас есть исходный код на Вашем языке следующим образом:
x + y
Теперь, на статически типизированном языке, типы x
и y
могут быть определены во время компиляции - говорят x
, и y
int
, с, затем x + y
будет использовать IL, "добавляет" инструкция.
, Но на динамически типизированном языке, это разрешение могло отличаться каждый раз. Следующий раз, x
и y
мог быть строками, в этом случае разрешение значения для этого сайта вызова будет использовать Строку. Concat. Но решая, какой IL использовать склонен быть очень дорогостоящим. На самом деле, если в первом хите сайта вызова x
и y
пара [1 114] с, очень вероятно, что последовательные хиты на этом сайте вызова также будут с парой [1 115] с.
, Таким образом, ДОЛЛАР выполняет итерации следующим образом: скомпилированный код callsite похож на это:
return site.Update(site, x, y);
В первый раз данный набор типов передается в - говорят, пара [1 116] с, метод Обновления обращается к реализации языка для разрешения, какой метод/инструкция должен использоваться с парой [1 117] с и +
. Те правила затем перекомпилированы в callsite; получающийся скомпилированный код выглядит примерно так:
if (x is int x1 && y is int y1) { return x1 + y1; }
return site.Update(site, x, y);
Последовательные вызовы с парами [1 119] с оставляют скомпилированный код без изменений.
, Если с новой парой типа встречаются, код самопереписывает во что-то вроде этого:
if (x is int x1 && y is int y1) { return x1 + y1; }
if (x is string x2 && y is string y2) { return String.Concat(x2, y2); }
return site.Update(site, x, y);
Для получения дополнительной информации о том, как это работает, см. разговор Jim Hugunin в 2008 PDC на динамических языках и проектная документация ДОЛЛАРА в проект .
ДОЛЛАРА