Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 13:00

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Вс сен 16, 2018 03:38 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Продолжаю выкладывать черновой вариант форта.

О работе с памятью и вызове процедур на языке высокого уровня.
Именно тут, помимо стека и происходит взаимодействие
виртуальной машины форта и программой, в которую ФВМ
внедрена.

Память может быть реализованна по разному, например
с помощью связных списков.
Тогда число, представляющее элемент из связанного списка будет
физическим адресом этого элемента.
Про добавление, удаление и прочего элементов связного списка
информации полно.

В 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 могут использовать в качестве параметров элементы вектора,
присвоить результат выполнения функции элементу вектора и вернуть
этот элемент на стек или в порт.
Форт ВМ может обращаться к вектору через порты,
обработка записи и чтение портов индивидуально для каждой задачи.
В следующей записи будут примеры работы со строками и массивами.
После начну наконец то написание самого форта.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Чт окт 04, 2018 01:47 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Вызов функции, написанной на 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
( на стеке - индекс массива в векторе )

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Ср окт 24, 2018 02:02 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Работа с массивами.
Пусть работа с массивом байт осуществляется через 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   
 

Завтра, если будет время, напишу работу со строками, затем можно
начинать писать форт.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Чт окт 25, 2018 00:56 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
vikt писал(а):
Пусть работа с массивом байт осуществляется через 6 порт.

0 6 out можно обернуть в функцию, и все. Зачем какие-то порты?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Вт окт 30, 2018 02:51 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Hishnik писал(а):
vikt писал(а):
Пусть работа с массивом байт осуществляется через 6 порт.

0 6 out можно обернуть в функцию, и все. Зачем какие-то порты?


Это пока только виртуальная машина. Тут еще нет функций, словарей...
Но обдумал на выходных. Возможно, каждому модулю, реализуемым
на языке высокого уровня, добавлять реализацию словаря в фортовском
стиле, где "экспортировать" нужные функции. Но это надо опробывать.
Подозреваю, что все равно нужен будет какой-то код, реализующий
вызов из инструкций ФВМ кода, реализуемого на языке высокого уровня.
Вообще, готов принять любую идею, способствующую простоте, ясности разработки.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Чт ноя 08, 2018 23:36 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Строки, черновой набросок.
После того, как разобрались с вызовом функций и передачей параметров,
реализовать нужную строковую функцию можно за пять минут.

Код:
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

}


Теперь самая мутная часть, написание самого форта.
Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Пт ноя 09, 2018 16:59 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
Теперь самая мутная часть, написание самого форта.
Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще.

С примитивов
DUP DROP и пр

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Пт ноя 09, 2018 22:49 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Нужна тестовая задачка, на которой можно пробовать получившееся.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Сб ноя 10, 2018 01:50 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Victor__v писал(а):

С примитивов
DUP DROP и пр


dup drop - здесь это команды виртуальной форт машины, их надо только пихнуть в словарь.

Hishnik писал(а):
Нужна тестовая задачка, на которой можно пробовать получившееся.

Часть кода взял со своих разработок.
Он путанный и странный.
В java можно написать так
Код:
class myclass() {
  public   int  aa;
//-----------------------------
  public  myclass  mc;
}

и создавать классические цепные списки.
Но сколько не смотрел исходники java программ, никто так не пишет.
Вот и приходится создавать векторы - выглядят чудовищно,
хотя вроде работают быстро.
Вообще, это черновик - хочется быстрее получить цельную систему,
а потом должна получится методичка по написанию и внедрению форта в
программу на языке высокого уровня, что бы в ней писать скрипты.
Даже мои предыдущие корявые эксперименты с псевдо-фортом более чем
успешны.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Вт апр 27, 2021 22:57 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Решил начать создавать методичку по созданию внедренных в приложения фортов на
тихом и уютном сайте Гудлейфра.

Буду дублировать сюда.

Предыдущий черновик был скорее быстрое введение в android программирование,
а не в форт. Тут буду делать все компактнее, удачные абзацы буду переносить со старого
черновика - сюда.

Итак, задача первая, создать методичку по написанию форт-системы.
Задача созрела давно, везде же говорится, что надо писать свой форт,
и не предлагают ничего, кроме реализации на каких-то ассемблерах.
Это установка телеги впереди лошади. Любой школьник, вооружившись
справочником, закодирует алгоритм на ассемблере, но не каждый
захочет разбирать ассемблерный текст, что бы понять, как это
работает.
Баранов и Ноздрунов тоже не годятся на сегодняшний день,
их книга расчитана на узких специалистов.

Буду делать, как получится, хотелось бы, что бы кто-нибудь сделал лучше.
Так же буду дублировать на Winglion и если работа окажется удачной,
то и на другие форт ресурсы, если они конечно есть.

Пока ссылка на предварительный форт

https://github.com/vikt144/Forth/blob/main/forth/fas.java - основной файл
https://github.com/vikt144/Forth/blob/main/helloForth.java - запускающая часть

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Ср апр 28, 2021 13:54 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Посмотрел основной файл.
ИМХО, цикл интерпретации можно сделать проще.

У меня сделано так:

Код:
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   
;


_________________
Цель: сделать 64-битную Нову под Винду



За это сообщение автора Victor__v поблагодарил: vikt
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Сб май 01, 2021 01:47 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Спасибо, что просмотрели мой файл, к которому я не успел еще написать внятные комментарии.
Решил выкладывать как есть, иначе дело стоит, очень легко придумать отмазу,
что бы ничего не делать.

interpret, насколько я помню, делал по Баранову Ноздрунову.
На мой взгляд, inerpret, в силу его простоты, можно рассматрмвать как стартовый
скрипт, который можно менять как угодно.

В целом, конкретная редакция написана для того, чтобы внедрить в андроид приложение.
По итогам экспериментов с этим приложением в fas.java (форт ассемблер) будут
внесены изменения.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Сб май 01, 2021 02:49 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Андроид приложение
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)
Присвоение текста кнопкам.
Взятие текста из поля редактирования
Завтра попробую присоединить к этому форт.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Вт май 11, 2021 00:51 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
vikt писал(а):
Андроид приложение https://github.com/vikt144/less0
apk файл будет?

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Блог программиста любителя
СообщениеДобавлено: Вт май 11, 2021 10:39 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Сделаю.
У меня теперь новая версия, теперь с фортом на борту.
Застрял на документировании, нету времени.
Думаю, выкладывать периодически, как есть,
иначе застой.
Сегодня вечером выложу.

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB