Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт окт 23, 2018 03:20

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

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

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

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

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


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

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


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

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


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

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