Какие языки программирования позволят мне манипулировать последовательностью инструкций в методе? - PullRequest
3 голосов
/ 10 февраля 2011

У меня есть предстоящий проект, в котором основным требованием будет изменение способа работы метода во время выполнения.Обратите внимание, что я не говорю о концепции ОО более высокого уровня, такой как «затенение одного метода другим», хотя практический эффект будет аналогичным.

Ключевые свойства, которые мне нужны,:

  • Я должен иметь возможность изменить метод таким образом, чтобы я мог добавлять новые выражения, удалять существующие выражения или изменять любые выражения, которые в нем присутствуют.

  • После изменения метода последующие вызовы этого метода вызовут новую последовательность операций.(Или, если язык связывает методы, а не оценивает каждый раз, предоставьте мне способ отсоединить / перепривязать новый метод.)

  • В идеале, я хотел бы манипулировать атомными единицамиязыка (например, «вызвать метод foo для объекта bar»), а не сборку напрямую (например, «вставить эти три параметра в стек»).Другими словами, я бы хотел иметь высокую уверенность в том, что создаваемые мной операции семантически значимы в языке.Но я возьму то, что смогу получить.

Если вы не уверены, соответствует ли язык кандидата этим критериям, вот простой лакмусовый тест:

Можете ли вы написать другой метод с именем clean, который:

  • принимает метод m в качестве ввода

  • возвращает другой метод m2который выполняет те же операции, что и m

  • , так что m2 идентичен m, но не содержит вызовов метода print-to-standard-outна вашем языке (переводит, System.Console.WriteLn, println и т. д.)?

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

Какие варианты доступны для меня?Если возможно, можете ли вы привести пример игрушки на одном или нескольких рекомендованных вами языках или указать на недавний пример?


Обновление: Причина, по которой япосле этого я хотел бы написать программу, которая способна изменять себя во время выполнения в ответ на новую информацию.Эта модификация выходит за рамки простых параметров или настраиваемых данных, но представляет собой полноценные, развитые изменения в поведении.(Нет, я не пишу вирус.;))

Ответы [ 5 ]

1 голос
/ 10 февраля 2011

Я бы сказал, что Groovy может это сделать.

Например

class Foo {
   void bar() {
      println "foobar"
   }
}

Foo.metaClass.bar = {->
    prinltn "barfoo"
}

Или конкретный экземпляр foo без влияния на другие экземпляры

fooInstance.metaClass.bar = {->
    println "instance barfoo"
}

Используя этот подход, я могу изменить, удалить или добавить выражение из методаи последующие звонки будут использовать новый метод.С мета-классом Groovy вы можете многое сделать.

1 голос
/ 10 февраля 2011

Что ж, эти языки с действительно сильной поддержкой макросов (в частности, с Лиспами) могут подходить.

Но вы уверены, что вам действительно нужно углубиться в это? Я не знаю, что вы пытаетесь сделать, но я полагаю, вы могли бы подражать этому, не вдаваясь слишком глубоко в метапрограммирование. Скажем, вместо того, чтобы использовать метод и манипулировать им, используйте набор функций (с некоторым способом совместного использования состояния, например, состоянием объекта, переданным каждому).

1 голос
/ 10 февраля 2011

Ну, вы всегда можете использовать .NET и библиотеки Expression для создания выражений. Я думаю, что это действительно лучший выбор для вас, поскольку вы можете создавать представления команд в памяти, и есть хорошая поддержка библиотек для управления, обхода и т. Д.

0 голосов
/ 10 февраля 2011

Существуют языки / среды, которые допускают реальные изменения во время выполнения - например, Common Lisp, Smalltalk, Forth. Используйте один из них, если вы действительно знаете, что делаете. В противном случае вы можете просто использовать шаблон интерпретатора для развивающейся части вашего кода, это возможно (и тривиально) с любым ОО или функциональным языком.

0 голосов
/ 10 февраля 2011

В Java многие профессиональные фреймворки делают это, используя открытый исходный код ASM фреймворк .
Здесь - список всех известных java-приложений и библиотек, включая ASM.

Несколько лет назад BCEL также очень широко использовался.

...