Язык программирования для самоизменяющегося кода? - PullRequest
31 голосов
/ 17 июня 2010
  • Я недавно думаю о написании самоизменяющихся программ , я думаю, что это может быть мощно и весело.Поэтому в настоящее время я ищу язык, который позволяет легко изменять собственный код программы.
  • Я прочитал о C # (в качестве альтернативы) и возможности компилировать и выполнять код во время выполнения,но это слишком больно.
  • Я также думаю о сборке .Там легче изменить исполняемый код, но он не очень мощный (очень сырой).

Можете ли вы предложить мощный язык или функцию, которая поддерживает изменение кода во время выполнения?

Пример

Это то, что я имею в виду, изменяя код во время выполнения:

  Start:
  a=10,b=20,c=0;
  label1: c=a+b;
  ....
  label1= c=a*b;
  goto label1;

и, возможно, строит список инструкций:

  code1.add(c=a+b);
  code1.add(c=c*(c-1));
  code1. execute();

Ответы [ 14 ]

1 голос
/ 17 июня 2010

Вы можете сделать это в Maple (язык компьютерной алгебры). В отличие от многих приведенных выше ответов, в которых используются скомпилированные языки, которые позволяют создавать и ссылаться только на новый код во время выполнения, здесь вы можете честно изменить код работающей в данный момент программы. (Ruby и Lisp, как указывают другие авторы, также позволяют вам делать это; возможно, также Smalltalk).

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

Как указали другие: для достижения этой цели вам нужен устный перевод с сильными возможностями для размышлений и овеществления.

Я написал автоматический нормализатор / упрощитель для кода Maple, который я начал выполнять для всей библиотеки (включая ее); и поскольку я не был слишком осторожен во всем своем коде, нормализатор изменил сам себя. Я также написал Partial Evaluator (недавно принятый SCP) под названием MapleMIX - доступный на sourceforge - но не мог полностью применить его к себе (это не было целью проектирования).

0 голосов
/ 09 января 2019

В MICGBF он изменяет интерпретатор при каждом его запуске.

Также очень интересно * программировать.

* Отказ от ответственности: Это может быть не таквесело программировать.

0 голосов
/ 19 июня 2010

В Lua вы можете «зацепить» существующий код, что позволяет вам присоединять произвольный код к вызовам функций. Это выглядит примерно так:

local oldMyFunction = myFunction
myFunction = function(arg)
    if arg.blah then return oldMyFunction(arg) end
    else
        --do whatever
    end
end

Вы также можете просто переключать функции, что дает вам самоизменяющийся код.

0 голосов
/ 17 июня 2010

Вы смотрели на Java?Java 6 имеет API компилятора , поэтому вы можете писать код и компилировать его в Java VM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...