Forth http://fforum.winglion.ru/ |
|
Блог программиста любителя http://fforum.winglion.ru/viewtopic.php?f=12&t=3103 |
Страница 2 из 8 |
Автор: | vikt [ Вс сен 16, 2018 03:38 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Продолжаю выкладывать черновой вариант форта. О работе с памятью и вызове процедур на языке высокого уровня. Именно тут, помимо стека и происходит взаимодействие виртуальной машины форта и программой, в которую ФВМ внедрена. Память может быть реализованна по разному, например с помощью связных списков. Тогда число, представляющее элемент из связанного списка будет физическим адресом этого элемента. Про добавление, удаление и прочего элементов связного списка информации полно. В java "память" можно реализовать так же с помощью вектора. Код: import java.utils.*; -------------- Vector V; public void initData(Vector V) { V=new Vector(); Integer I = new Integer(0); // тип Integer, это объектное представление типа int V.addElement(I); // чтобы его можно было положить в вектор } // начальный элемент вектора инициализируется 0 Объекты ( массивы, строки, структуры и тд ) добавляются в вектор Код: public int appendData(Vector v,Object obj) { Integer Ind=(Integer)v.elementAt(0); // получить значение начального элемента вектора как Integer int ind = Ind.intValue(); // преобразовать в нормальный int if ( ind == 0) { // если равен 0, то свободных элементов нет v.addElement(obj); // тогда добавляем объект к вектору ind=v.size()-1; } else { Integer I =( Integer)V.elementAt(ind); // иначе ind указывает на свободный элемент (СЭ) int i = I.intValue(); //там хранится предыдущий (СЭ) который получаем v.setElementAt(obj, ind); // Замещаем элемент вектора с номером ind объектом obj v.setElementAt(I, 0); // в начальный элемент вектора пишем предыдущий СЭ } return ind; // возвращаем индекс объекта в векторе } удаление объектов из вектора Код: public void removeData (Vector v, int ind){ Integer IndOld=(Integer)v.elementAt(0); // получить знач 0 элемента v.setElementAt(IndOld, ind); // заместить им объект, который на удаление Integer IndNew = new Integer(ind); // преобразрвать ind в тип Integer v.setElementAt(IndNew, 0); // записать в начальный элемент вектора // 0 элемент указывает на новый } из удаленых объектов образуется связный список Тут, если например, выделить сразу 1000 объектов, а затем сразу удалить, то размер вектора все равно останется равным 1000. Тут надо додумать и удалять крайний элемент получить тип объекта в виде строки Код: public String getTypeData( Vector v, int ind){ return v.elementAt(ind) . getClass().getName() ; } тип "cтрока" вернет как "java.lang.String" массив целых как "[I" двухмерный массив "[[I" итд тут есть над чем подумать, возможно строку лучше парсировать и типы данных представлять числами. Функции на java могут использовать в качестве параметров элементы вектора, присвоить результат выполнения функции элементу вектора и вернуть этот элемент на стек или в порт. Форт ВМ может обращаться к вектору через порты, обработка записи и чтение портов индивидуально для каждой задачи. В следующей записи будут примеры работы со строками и массивами. После начну наконец то написание самого форта. |
Автор: | vikt [ Чт окт 04, 2018 01:47 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Вызов функции, написанной на java из виртуальной машины форта Пусть ф-ция на java использует в качестве параметров массив байт, строку и целое, и возвращает массив байт Код: byte [] funct( byte[] b, String s, int i) { byte[] ret=null; //-- реализация ф-ции return ret; } Пусть она привязана к пятому порту и имеет номер 10. пусть параметры на стеке расположенны следующим образом: На вершине: целое, указывающий на расположение массива байт в векторе. далее целое, указывающее на строку далее, просто целое тогда вызов функции на ява может быть написана так Код: private void callService(int number_port, int value) { вызывается во время записи в порт (out) switch (number_port) { case 1 //---------------- breake; //----------------------------- case 5 : //5 порт switch(value) { case 1 : // --------------- breake; //--------------------------------------------------- case 10 : // наша функция stack.push( // индекс на масссив байт в векторе, который вернула наша ф-ция кладется на стек V.appendData( V, // возвращаемый функцией массив байт добавляется в вектор funct( (byte[]) V.elementAt( stack.pop() ) , // первый параметр (String) V.elementAt( stack.pop() ) , //второй stack.pop() //третий ) ) ); breake; //------------------------------------ }//switch //----------------------------------------- breake; }//switch }//callsevice вызов ( стек для вызова ф-ции уже подготовлен. ) 10 5 out ( на стеке - индекс массива в векторе ) |
Автор: | vikt [ Ср окт 24, 2018 02:02 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Работа с массивами. Пусть работа с массивом байт осуществляется через 6 порт. Пусть подфункции имеют следующие номера 0 - создание массива 1 - чтение элемента массива 2 - запись элемента массива 3 - удаление массива константы ind - индекс массива в векторе i - адрес элемента массива size - размер массива val - значение size 0 6 out \ создание массива размером size байт \ на стек возвращается ind i ind 1 6 out \ положить на стек значение из массива по адресу i val i ind 2 6 out \ поместить val в массив по адресу i ind 3 6 out \ удалить массив из вектора Код: private void callService(int number_port, int value) { вызывается во время записи в порт (out) switch (number_port) { case 1 //---------------- breake; //----------------------------- case 5 : //5 порт //----------тут обработка вызова функций breake; //------------------------------------ case 6 : //6 порт switch(value) { case 0 : int sizeArray=stack.pop(); byte [] BB = new byte[sizeArray]; stack.push( appendData(V,BB) ); breake; case 1 : int ind = stack.pop(); int i = stack.pop(); int val =( (byte[]) V.elementAt( ind ) ) [i]; stack.push(val); breake; case 2 : ind = stack.pop(); i = stack.pop(); val = stack.pop(); ( (byte[]) V.elementAt( ind ) ) [i]=val; breake; case 3 : ind = stack.pop(); removeData (V , ind); breake; breake; //----------------------------------------- breake; }//switch }//callsevice Завтра, если будет время, напишу работу со строками, затем можно начинать писать форт. |
Автор: | Hishnik [ Чт окт 25, 2018 00:56 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
vikt писал(а): Пусть работа с массивом байт осуществляется через 6 порт. 0 6 out можно обернуть в функцию, и все. Зачем какие-то порты? |
Автор: | vikt [ Вт окт 30, 2018 02:51 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Hishnik писал(а): vikt писал(а): Пусть работа с массивом байт осуществляется через 6 порт. 0 6 out можно обернуть в функцию, и все. Зачем какие-то порты? Это пока только виртуальная машина. Тут еще нет функций, словарей... Но обдумал на выходных. Возможно, каждому модулю, реализуемым на языке высокого уровня, добавлять реализацию словаря в фортовском стиле, где "экспортировать" нужные функции. Но это надо опробывать. Подозреваю, что все равно нужен будет какой-то код, реализующий вызов из инструкций ФВМ кода, реализуемого на языке высокого уровня. Вообще, готов принять любую идею, способствующую простоте, ясности разработки. |
Автор: | vikt [ Чт ноя 08, 2018 23:36 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Строки, черновой набросок. После того, как разобрались с вызовом функций и передачей параметров, реализовать нужную строковую функцию можно за пять минут. Код: void StringLib() { int nf = stack.pop(); // получение номера ф-ции int ind; // String str = null; switch (nf) { case 0 : // 0 - создать строку int sf = stack.pop(); // получение номера подфункции switch (sf) { case 7 : // создать копию строки, которая имеет индекс ind ind = stack.pop(); str = new String( (String) V.elementAt( ind ) ); stack.push( // положить елемент вектора со строкой на стек appendData( V, str) //добавление новой строки в вектор ); breake; case 11 : // создать строку другим способом breake; }//switch 2 breake; case 1 : // сравнить строки, равны - на стеке 0 // на стеке ind1, ind0 --> 0 если равны String s0 = (String) V.elementAt( stack.pop() ) ; String s1 = (String) V.elementAt( stack.pop() ) ; stack.push( s0.compareTo(s1) ); breake; ///-- другие функции .../// }//switch } Теперь самая мутная часть, написание самого форта. Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще. |
Автор: | Victor__v [ Пт ноя 09, 2018 16:59 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Цитата: Теперь самая мутная часть, написание самого форта. Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще. С примитивов DUP DROP и пр |
Автор: | Hishnik [ Пт ноя 09, 2018 22:49 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Нужна тестовая задачка, на которой можно пробовать получившееся. |
Автор: | vikt [ Сб ноя 10, 2018 01:50 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Victor__v писал(а): С примитивов DUP DROP и пр dup drop - здесь это команды виртуальной форт машины, их надо только пихнуть в словарь. Hishnik писал(а): Нужна тестовая задачка, на которой можно пробовать получившееся. Часть кода взял со своих разработок. Он путанный и странный. В java можно написать так Код: class myclass() { public int aa; //----------------------------- public myclass mc; } и создавать классические цепные списки. Но сколько не смотрел исходники java программ, никто так не пишет. Вот и приходится создавать векторы - выглядят чудовищно, хотя вроде работают быстро. Вообще, это черновик - хочется быстрее получить цельную систему, а потом должна получится методичка по написанию и внедрению форта в программу на языке высокого уровня, что бы в ней писать скрипты. Даже мои предыдущие корявые эксперименты с псевдо-фортом более чем успешны. |
Автор: | vikt [ Вт апр 27, 2021 22:57 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Решил начать создавать методичку по созданию внедренных в приложения фортов на тихом и уютном сайте Гудлейфра. Буду дублировать сюда. Предыдущий черновик был скорее быстрое введение в android программирование, а не в форт. Тут буду делать все компактнее, удачные абзацы буду переносить со старого черновика - сюда. Итак, задача первая, создать методичку по написанию форт-системы. Задача созрела давно, везде же говорится, что надо писать свой форт, и не предлагают ничего, кроме реализации на каких-то ассемблерах. Это установка телеги впереди лошади. Любой школьник, вооружившись справочником, закодирует алгоритм на ассемблере, но не каждый захочет разбирать ассемблерный текст, что бы понять, как это работает. Баранов и Ноздрунов тоже не годятся на сегодняшний день, их книга расчитана на узких специалистов. Буду делать, как получится, хотелось бы, что бы кто-нибудь сделал лучше. Так же буду дублировать на Winglion и если работа окажется удачной, то и на другие форт ресурсы, если они конечно есть. Пока ссылка на предварительный форт https://github.com/vikt144/Forth/blob/main/forth/fas.java - основной файл https://github.com/vikt144/Forth/blob/main/helloForth.java - запускающая часть |
Автор: | Victor__v [ Ср апр 28, 2021 13:54 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Посмотрел основной файл. ИМХО, цикл интерпретации можно сделать проще. У меня сделано так: Код: USER-VECT REFILL \ -- flag
: INTERPRET BEGIN BEGIN STACK? \ проверяем стек на пустоту, если пусто ошибка и выходим из интерпретации в обработчик ошибок PARSE-NAME DUP WHILE \ PARSE-NAME ( --- addr len) дает адрес слова и его длину в буфере. Если слов нету дает 0 SFIND \ addr len --- addr len false | xt flags true IF STATE @ \ тут думаю все понятно IF FFA-COMPILE, ELSE NIP EXECUTE THEN ELSE NOTFOUND-GENERATE \ если слово не было найдено в словаре, то скармливаем его обработчику. Если и это не поможет, то будет ошибка, которую примет обработчик. THEN REPEAT 2DROP REFILL \ если PARSE-NAME дал 0, то пробуем перезагрузить буфер строк. Если не получилось выходим из цикла интерпретации. 0= UNTIL ; |
Автор: | vikt [ Сб май 01, 2021 01:47 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Спасибо, что просмотрели мой файл, к которому я не успел еще написать внятные комментарии. Решил выкладывать как есть, иначе дело стоит, очень легко придумать отмазу, что бы ничего не делать. interpret, насколько я помню, делал по Баранову Ноздрунову. На мой взгляд, inerpret, в силу его простоты, можно рассматрмвать как стартовый скрипт, который можно менять как угодно. В целом, конкретная редакция написана для того, чтобы внедрить в андроид приложение. По итогам экспериментов с этим приложением в fas.java (форт ассемблер) будут внесены изменения. |
Автор: | vikt [ Сб май 01, 2021 02:49 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Андроид приложение https://github.com/vikt144/less0 Файл разметки https://github.com/vikt144/less0/blob/main/app/src/main/res/layout/main.xml java - файл https://github.com/vikt144/less0/blob/main/app/src/main/java/com/virf/less/MainActivity.java Тут скелет простейшей java программы, разметка xml Так же тут Присвоение текста текстовому полю (text0) Присвоение текста кнопкам. Взятие текста из поля редактирования Завтра попробую присоединить к этому форт. |
Автор: | Sotnik [ Вт май 11, 2021 00:51 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
vikt писал(а): Андроид приложение https://github.com/vikt144/less0 apk файл будет?
|
Автор: | vikt [ Вт май 11, 2021 10:39 ] |
Заголовок сообщения: | Re: Блог программиста любителя |
Сделаю. У меня теперь новая версия, теперь с фортом на борту. Застрял на документировании, нету времени. Думаю, выкладывать периодически, как есть, иначе застой. Сегодня вечером выложу. |
Страница 2 из 8 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |