Реально ли на паскале АБС, сделать программу, которая могла бы на лету дописывать свой код под поставленную задачу?
Чисто теоретически возможно, но по моему легче будет создать самообучающийся ИИ)) Ну а программу делающую всё ещё никому не удалось сделать, никто не может предусмотреть всё. Ну и ИИ ещё не достаточно продвинутые для этого.
суть не в том, чтоб она делала все, мне она нужна под в принципе узкую задачу.
Например в окне пишем 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
под ПКМ есть кнопка Компилировать
:
Значит, паскаль добавляет в реестр данные о том как должна работать эта кнопка… Покопавшись у себя в реестре я нашёл этот ключ: 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.
Ух ты, даже не знал, что паскаль так умеет делать, спасибо Большое, буду разбираться.
Зачем… это будет самообучаемая программа, что-то типа нейросети, но нейросеть это больше биологическая конструкция, где каждый нейрон работает одновременно с остальными. А у нас максимум несколько ядер, или если на видюхе запускать 1000 ядер, раздутая нейросеть все равно работает медленно.
А вот если сделать самообучение не по нейронному (параллельному) принципу для которого комп не очень годиться (обычное условие на нейронах занимает наверно около 300 команд и ответ еще и не точный), а по принципу генерации быстрого кода, то думаю такая программа по сравнению с нейросетями будет просто летать и иметь малые размеры, а обучаемость будет такая же.
Цель - исследования в области биологии.
Вы мне не объясняйте по нейросетям (кстати я во многом не согласен, но то не по теме).
Вот в нейросети самообучение обычно проводят шагами или плавным спуском (это всё легко описывается математически). А какая у вас задумка?
Что касается возможностей паскаля - вроде в System.Reflection
есть всё что нужно чтоб залезть в готовый .exe
или .dll
(если он создан в .Net) и достать из него любые функции/типы.
Вообще всё что возможно в C# возможно и в остальном .Net, а значит и в паскале. Искать что возможно на официальном сайте от майкрософта - msdn-е. А так же можно спрашивать на StackOverflow.com, там люди более компетентные во всём (ну может разве что кроме этого паскаля).
В начале буду идти от простых задач. Сделаю так сказать стандартные шаблонные способы. Например в одном из окнов ввода 2 в окне правильного ответа 4, прога обнаруживает изменения во вводе, считывает правильный ответ. Если это увеличение, уменьшение, запустится шаблон просчитывающий зависимость, т.е. для начала это будет простой коэффициент. Если изменения будут в 2х окнах ввода, если нужно добавится условие. К растущим прогам из подходящих шаблонов будут добавлены информационные метки шаблонов, чтоб при росте (усовершенствовании, обучении) программы вставок более сложных шаблонов, старые ввод-ответ не были нарушены. Пока сумбурно все пишу, извините :), в голове крутится, буду пытаться делать.
Ну что ж, решение конечно топорное, но вроде что то в нём таки есть)))
Как сделаете что то рабочее - залейте на гитхаб (чтоб можно было обновить код на новую версию в любой момент) и отпишитесь сюда. Возможно кому то даже понадобится))
Из-за некоторой коммерческой и научной заинтересованности, сами исходники я выкладывать не буду, слишком долго вынашивал эту идею и вижу, что будет очень много трудностей, которые придется решить, прога получится очень затратной (прогнозирую уйдет слишком много время-денег). Но видео понаснимаю и выложу, как она работать будет. Сама конечная цель у меня очень амбициозная - вот моя группа в вк где я объясняю для чего все это нужно, подробнее. https://vk.com/bio_programming
Если речь о self-modifying code, то на существующих процессорах это не будет корректно работать ввиду известных особенностей микроархитектуры. Если же речь о том, чтобы генерировать интерпретируемые скрипты, решающие определенные классы задач, то, нужно четко определиться с классом задач, которые планируется решать.