Программа, сама дописывающая свой код.


#1

Реально ли на паскале АБС, сделать программу, которая могла бы на лету дописывать свой код под поставленную задачу?


#2

Чисто теоретически возможно, но по моему легче будет создать самообучающийся ИИ)) Ну а программу делающую всё ещё никому не удалось сделать, никто не может предусмотреть всё. Ну и ИИ ещё не достаточно продвинутые для этого.


#3

суть не в том, чтоб она делала все, мне она нужна под в принципе узкую задачу.

Например в окне пишем 2 в ответе 4 прога должна сгенерить программный код и дописать его сама в себе. (это если упрощенно).

Нейросеть под эту задачу не годиться - т.к. работает медленно и куча лишних движений. А нужна будет скорость.


#4

Хорошо, значит, для начала, вам нужно запускать файл получая то что он выводит. Вот простенький пример: 0.pas:

begin
  var stdout := System.Console.Out;//хоть и получаем через консоль, но вообще это стандартный поток вывода
  
  stdout.Write('some text');
end.

1.pas:

begin
  var p := new System.Diagnostics.Process;
  p.StartInfo.FileName := '0.exe';//запускать будем 0.exe
  p.StartInfo.UseShellExecute := false;//это надо чтоб разрешило перенаправить вывод
  p.StartInfo.RedirectStandardOutput := true;//перенаправляем вывод
  p.Start;
  
  writeln(p.StandardOutput.ReadToEnd);//читаем вывод запущенного процесса и сразу выводим
end.

Надо откомпилировать 0.pas и запустить 1.pas (поместив их в 1 папку разумеется), должно вывести в 1.pas то что выводит 0.pas.

У вас получается вместо 1.pas будет основная программа, а вместо 0.pas программа которую основная будет переписывать (если программа переписывает себя - надо будет перезапускать основной .exe, а это неудобно).

Теперь надо только заставить паскаль перекомпилировать 0.pas после того как мы его изменим.

У всех файлов .pas под ПКМ есть кнопка Компилировать:

image

Значит, паскаль добавляет в реестр данные о том как должна работать эта кнопка… Покопавшись у себя в реестре я нашёл этот ключ: HKEY_CLASSES_ROOT\PascalABCNET.PascalABCNETParser\shell\compile\command,

со значением

"C:\Program Files (x86)\PascalABC.NET\pabcnetc.exe" "%1"

Значит вот он компилятор, а %1, видимо, значит “файл, для которого выполняется команда”.

Значит переписываем 1.pas:

begin
  
  //Перезаписываем 0.pas
  
  System.IO.File.WriteAllText('0.pas',
    'begin' + #10 +
    '  System.Console.Out.Write(''some text v2'');' + #10 +
    'end.'
  );
  
  //Компилируем 0.pas
  
  var k := new System.Diagnostics.Process;
  k.StartInfo.FileName := 'C:\Program Files (x86)\PascalABC.NET\pabcnetc.exe';//Пусть к компилятору
  k.StartInfo.Arguments := System.IO.Path.GetFileName('0.pas');//Аргументы компилятора, дающие ему знать, какой файл компилировать
  k.StartInfo.UseShellExecute := false;//чтоб не вылазила консоль компилятора
  k.StartInfo.RedirectStandardError := true;//чтоб лог компилятора не писало нам. А ещё если запускать из IDE - без этого выводит ошибку
  k.Start;
  k.StandardError.ReadToEnd;//скипаем лог компилятора
  k.WaitForExit;
  
  //Запускаем 0.exe
  
  var p := new System.Diagnostics.Process;
  p.StartInfo.FileName := '0.exe';
  p.StartInfo.UseShellExecute := false;
  p.StartInfo.RedirectStandardOutput := true;
  p.Start;
  
  writeln(p.StandardOutput.ReadToEnd);
  readln;
end.

Запускайте по Shift+F9, иначе компилятор не пашет, почему то…

Но я всё же спрошу, зачем именно перезаписыванием исходников, что именно вы делаете, если не секрет? И почему нельзя сделать это внутренними переменными сделать? Вы пробовали указатели на подпрограммы?

procedure Write1 := writeln(1);
procedure Write2 := writeln(2);

begin
  var p:procedure;
  p := Write1;
  p();
  p := Write2;
  p();
end.

#5

Ух ты, даже не знал, что паскаль так умеет делать, спасибо Большое, буду разбираться.

Зачем… это будет самообучаемая программа, что-то типа нейросети, но нейросеть это больше биологическая конструкция, где каждый нейрон работает одновременно с остальными. А у нас максимум несколько ядер, или если на видюхе запускать 1000 ядер, раздутая нейросеть все равно работает медленно.

А вот если сделать самообучение не по нейронному (параллельному) принципу для которого комп не очень годиться (обычное условие на нейронах занимает наверно около 300 команд и ответ еще и не точный), а по принципу генерации быстрого кода, то думаю такая программа по сравнению с нейросетями будет просто летать и иметь малые размеры, а обучаемость будет такая же.

Цель - исследования в области биологии.


#6

Вы мне не объясняйте по нейросетям (кстати я во многом не согласен, но то не по теме).

Вот в нейросети самообучение обычно проводят шагами или плавным спуском (это всё легко описывается математически). А какая у вас задумка?


#7

Что касается возможностей паскаля - вроде в System.Reflection есть всё что нужно чтоб залезть в готовый .exe или .dll (если он создан в .Net) и достать из него любые функции/типы.

Вообще всё что возможно в C# возможно и в остальном .Net, а значит и в паскале. Искать что возможно на официальном сайте от майкрософта - msdn-е. А так же можно спрашивать на StackOverflow.com, там люди более компетентные во всём (ну может разве что кроме этого паскаля).


#8

В начале буду идти от простых задач. Сделаю так сказать стандартные шаблонные способы. Например в одном из окнов ввода 2 в окне правильного ответа 4, прога обнаруживает изменения во вводе, считывает правильный ответ. Если это увеличение, уменьшение, запустится шаблон просчитывающий зависимость, т.е. для начала это будет простой коэффициент. Если изменения будут в 2х окнах ввода, если нужно добавится условие. К растущим прогам из подходящих шаблонов будут добавлены информационные метки шаблонов, чтоб при росте (усовершенствовании, обучении) программы вставок более сложных шаблонов, старые ввод-ответ не были нарушены. Пока сумбурно все пишу, извините :), в голове крутится, буду пытаться делать.


#9

Ну что ж, решение конечно топорное, но вроде что то в нём таки есть)))

Как сделаете что то рабочее - залейте на гитхаб (чтоб можно было обновить код на новую версию в любой момент) и отпишитесь сюда. Возможно кому то даже понадобится))


#10

Из-за некоторой коммерческой и научной заинтересованности, сами исходники я выкладывать не буду, слишком долго вынашивал эту идею и вижу, что будет очень много трудностей, которые придется решить, прога получится очень затратной (прогнозирую уйдет слишком много время-денег). Но видео понаснимаю и выложу, как она работать будет. Сама конечная цель у меня очень амбициозная - вот моя группа в вк где я объясняю для чего все это нужно, подробнее. https://vk.com/bio_programming


#11

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