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

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

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

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

Например в окне пишем 2 в ответе 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.
1 лайк

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

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

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

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

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

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

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

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

1 лайк

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

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

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

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

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

2 лайка