Самомодифицирующийся код [Re: Поднял свой уровень на полступ..]

Dasar

> Так же как нельзя писать самомодифицирующийся код, хотя идея тоже офигенно красивая.
Самомодифицирующийся код (в простейшем виде) - сейчас активно используется - особенно в языках вида Java или C#, т.к. там ошибки этой самомодификации не так катастрофичны.

psihodog

> Самомодифицирующийся код (в простейшем виде) - сейчас активно используется
каким образом?

Dasar

> каким образом?
на вскидку: загрузка/сохранение, регулярные выражения, доступ к базе (иногда прокси всякие, около-скриптовые фишки.
ps
В большей степени, конечно, речь идет о самогенерации кода, чем о самомодификации, но, в общем случае, цикл - сгенерили код, повыполняли, выгрузили, сгенерили новый, повыполняли еще - можно рассматривать как самомодификацию.

psihodog

регулярные выражения, доступ к базе (иногда прокси всякие, около-скриптовые фишки
а что там с регулярными выражениями? да и с доступом к базе?
в общем случае, цикл - сгенерили код, повыполняли, выгрузили, сгенерили новый, повыполняли еще - можно рассматривать как самомодификацию.
а по-моему нельзя... всё-таки разные вещи.

Dasar

> там с регулярными выражениями?
Ты пишешь регулярное выражение, а при компиляции по нему генерится код, который эффективно парсит входящие строки.
> да и с доступом к базе?
Здесь все тоже самое - в зависимости от базы, и от запроса - на лету генерится код, который эти данные разбирает и представляет.
ps
Да, сейчас пошла мода еще генерить код для запросов Xpath/XQuery, бегующих поверх объектов или БД.
pps
Да, всякие Application server-ы (как похожий случай - IIS) используют самомодифицирующиеся идеи - отслеживают изменения версий, используемых dll-ек, грузят новые версии - и начинают все новые запросы перекидывать на новые версии, как только все старые запросы выполнились - выгружается старая версия.

Dasar

Да, как пример, можно вспомнить sql-запросы - это ведь тоже код.
И этот код (тело sql-запроса) часто генерят(модифицируют) взависимости от того, что ввел пользователь, причем модификации бывают как простые (добавляется/убавляется еще одно 'and условие т.к и сложные - когда запрос перестраивается полностью.

psihodog

> Ты пишешь регулярное выражение, а при компиляции по нему генерится код, который эффективно парсит входящие строки.
а при чём тут модификация кода? тем более самомодификация.
в общем, не убедил.
самомодификацией я называю вот что: например, ввёл пользователь программы регулярное выражение, а программа по нему сгенерила функцию и передала управление ей. вот это да... а компилятор... это не то.

sasha79

Ты неправильно понял 'я. Именно так все и работает - выражения компилируются в код в Runtime.

psihodog

И как это писалось? На ассемблере java-машины? Или компилятор встраивался в программу?

a10027

на лиспе, наверное

ava3443

> ввёл пользователь программы регулярное выражение, а программа по нему сгенерила функцию и передала управление ей
Стандартная возможность Perl. Используется наверняка в куче программ.

psihodog

Тоже мне сказал! Perl! Я на sh(и даже на batch)-скриптах и не такое могу.

Dasar

> Или компилятор встраивался в программу?
Компилятор как Java-ы, так и c# идет вместе с Java/.net-framework-ами, и соответственно ставится и на клиентские машины.
Соответственно компилятор всегда есть под рукой.

psihodog

Компилятор как Java-ы, так и c# идет вместе с Java/.net-framework-ами
Неужели?
Чем тогда *RE от *SDK отличается? Может компилятор и на мобильные телефоны запихивают?

Dasar

> Чем тогда *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, компилятор, соответственно, не входит.

psihodog

ну так вот, вывод таков:
при при написании жава и С-диез программ нельзя рассчитывать на наличие компилятора на машине.

sasha79

Мы отклонились от темы. Зачем нам нужен компилятор?
Генерировать байт-код или CIL можно и без компилятора.

bleyman

При написании програм под компактный фреймворк вообще много на что нельзя рассчитывать.
а csc.exe занимает 49к, потому что является парсером командной строки для Microsoft.CSharp.CSharpCodeProvider или чего-нить в этом роде.

psihodog

Генерировать байт-код или CIL можно и без компилятора.
Средствами языка?

Helga87

Да. Например, для .Net есть замечательный namespace System.Reflection.Emit. Включенные в него классы позволяют генерировать динамические сборки "на лету". Именно через Emit работают вышеупомянутые regexp-ы, CompiledXsltTransform и прочие приятные вещи.
Правда, в Compact Framework этот namespace не включен

psihodog

Ну что ж! Тогда действительно, используется самомодифицирующийся код. Это просто чудеса.
А какие ещё языки такое поддерживают? Вот тут упоминался Perl.
А Java? Pithon?

sasha79

В Java точно можно делать такие вещи. См. класс Pattern из JDK.
О! Ещё есть проект Apache XSLTC - компилятор XSLT в транслеты - java-классы, выполняющие XSLT-преобразования.
Наверняка, там в исходниках можно посмотреть, как делаются эти штуки.

Helga87

В Java также есть аналоги .net-овского emit-а, но правда от сторонних производителей.
Может и в JRE есть, я плохо Java знаю.

sasha79

В Python, вроде, тоже можно. Набери в гугле "python eval".

ava3443

Ну что ж! Тогда действительно, используется самомодифицирующийся код. Это просто чудеса.
А какие ещё языки такое поддерживают? Вот тут упоминался Perl.
А Java? Pithon?
Про Java уже написали. Естественно, Python, Perl и Ruby тоже.

bleyman

В вижуал бейсике тоже наверняка есть эвал.

Helga87

В VB6 такой возможности нет.

ava3443

А в бейсике можно "налету" создать новый метод и добавить его какому-нибудь классу?

Julie16

В питоне даже круче фишки можно делать - можно сделать разрешение методов на лету. Например генерить функции по запросу
Типа пишешь object.someMethod и этот метод генерится в момент вызова.

ava3443

Это в любом динамическом языке можно делать (как минимум в Python, Perl, Ruby). Просто я сильно сомневаюсь, что что-то подобное есть в VB.

bleyman

Хм.
Фишка в том, что мне всегда казалось, что именно в ВБ6 есть эвал. Красин, наверное, ВБ знает, так что я ему поверю, что нельзя.
В седьмом, естественно, можно сделать всё то же что и в шарпе (верно и обратное). Потому что .НЕТ.

ava3443

одного eval имхо мало.

Olyalyau

По-моему в MIT'е, есть компилятор 'C, занимается динамической докомпиляцией --
как раз порождает самомодифицирующийся код.
Обещают прирост производительности.
Оставить комментарий
Имя или ник:
Комментарий: