Самомодифицирующийся код [Re: Поднял свой уровень на полступ..]
каким образом?
на вскидку: загрузка/сохранение, регулярные выражения, доступ к базе (иногда прокси всякие, около-скриптовые фишки.
ps
В большей степени, конечно, речь идет о самогенерации кода, чем о самомодификации, но, в общем случае, цикл - сгенерили код, повыполняли, выгрузили, сгенерили новый, повыполняли еще - можно рассматривать как самомодификацию.
регулярные выражения, доступ к базе (иногда прокси всякие, около-скриптовые фишкиа что там с регулярными выражениями? да и с доступом к базе?
в общем случае, цикл - сгенерили код, повыполняли, выгрузили, сгенерили новый, повыполняли еще - можно рассматривать как самомодификацию.а по-моему нельзя... всё-таки разные вещи.
Ты пишешь регулярное выражение, а при компиляции по нему генерится код, который эффективно парсит входящие строки.
> да и с доступом к базе?
Здесь все тоже самое - в зависимости от базы, и от запроса - на лету генерится код, который эти данные разбирает и представляет.
ps
Да, сейчас пошла мода еще генерить код для запросов Xpath/XQuery, бегующих поверх объектов или БД.
pps
Да, всякие Application server-ы (как похожий случай - IIS) используют самомодифицирующиеся идеи - отслеживают изменения версий, используемых dll-ек, грузят новые версии - и начинают все новые запросы перекидывать на новые версии, как только все старые запросы выполнились - выгружается старая версия.
И этот код (тело sql-запроса) часто генерят(модифицируют) взависимости от того, что ввел пользователь, причем модификации бывают как простые (добавляется/убавляется еще одно 'and условие т.к и сложные - когда запрос перестраивается полностью.
а при чём тут модификация кода? тем более самомодификация.
в общем, не убедил.
самомодификацией я называю вот что: например, ввёл пользователь программы регулярное выражение, а программа по нему сгенерила функцию и передала управление ей. вот это да... а компилятор... это не то.
Ты неправильно понял 'я. Именно так все и работает - выражения компилируются в код в Runtime.
И как это писалось? На ассемблере java-машины? Или компилятор встраивался в программу?
на лиспе, наверное
Стандартная возможность Perl. Используется наверняка в куче программ.
Тоже мне сказал! Perl! Я на sh(и даже на batch)-скриптах и не такое могу.
Компилятор как Java-ы, так и c# идет вместе с Java/.net-framework-ами, и соответственно ставится и на клиентские машины.
Соответственно компилятор всегда есть под рукой.
Компилятор как Java-ы, так и c# идет вместе с Java/.net-framework-амиНеужели?
Чем тогда *RE от *SDK отличается? Может компилятор и на мобильные телефоны запихивают?
Могу за .Net точно сказать, в Java-е я слабее разбираюсь.
.Net-ов есть следующие поставки:
1. .Net Framework
2. .Net SDK
3. .Net compact framework
4. .Net compact framework sdk
1 ставится на сервера и desktop
3 ставится на КПК
2 отличается от 1 - рядом вспомогательных утилит, sample-ами, наличие отладочной информации
Компилятор входит в 1 и 2
в 3, компилятор, соответственно, не входит.
при при написании жава и С-диез программ нельзя рассчитывать на наличие компилятора на машине.
Генерировать байт-код или CIL можно и без компилятора.
а csc.exe занимает 49к, потому что является парсером командной строки для Microsoft.CSharp.CSharpCodeProvider или чего-нить в этом роде.
Генерировать байт-код или CIL можно и без компилятора.Средствами языка?
Правда, в Compact Framework этот namespace не включен
А какие ещё языки такое поддерживают? Вот тут упоминался Perl.
А Java? Pithon?
О! Ещё есть проект Apache XSLTC - компилятор XSLT в транслеты - java-классы, выполняющие XSLT-преобразования.
Наверняка, там в исходниках можно посмотреть, как делаются эти штуки.
Может и в JRE есть, я плохо Java знаю.
В Python, вроде, тоже можно. Набери в гугле "python eval".
Ну что ж! Тогда действительно, используется самомодифицирующийся код. Это просто чудеса.Про Java уже написали. Естественно, Python, Perl и Ruby тоже.
А какие ещё языки такое поддерживают? Вот тут упоминался Perl.
А Java? Pithon?
В вижуал бейсике тоже наверняка есть эвал.
В VB6 такой возможности нет.
А в бейсике можно "налету" создать новый метод и добавить его какому-нибудь классу?
Типа пишешь object.someMethod и этот метод генерится в момент вызова.
Это в любом динамическом языке можно делать (как минимум в Python, Perl, Ruby). Просто я сильно сомневаюсь, что что-то подобное есть в VB.
Фишка в том, что мне всегда казалось, что именно в ВБ6 есть эвал. Красин, наверное, ВБ знает, так что я ему поверю, что нельзя.
В седьмом, естественно, можно сделать всё то же что и в шарпе (верно и обратное). Потому что .НЕТ.
одного eval имхо мало.
как раз порождает самомодифицирующийся код.
Обещают прирост производительности.
Оставить комментарий
Dasar
> Так же как нельзя писать самомодифицирующийся код, хотя идея тоже офигенно красивая.Самомодифицирующийся код (в простейшем виде) - сейчас активно используется - особенно в языках вида Java или C#, т.к. там ошибки этой самомодификации не так катастрофичны.