Есть ли какое-нибудь реальное приложение, представляющее собой самомодифицирующийся код?

В Интернете есть несколько примеров, демонстрирующих, как написать самомодифицирующийся код. Но это всего лишь примеры. Я бы хотел o знать, существует ли какое-либо реальное приложение, являющееся самомодифицирующимся кодом. Спасибо!

0
задан chenwj 3 October 2011 в 10:24
поделиться

1 ответ

Динамическое время выполнения языка (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 на динамических языках и проектная документация ДОЛЛАРА в проект .

ДОЛЛАРА
0
ответ дан 3 September 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: