Черновик: Пошаговое создание форта на java

Страница 1 из 2 1, 2  Следующий

Перейти вниз

Черновик: Пошаговое создание форта на java Empty Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Чт Мар 28, 2019 6:36 pm

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

Итак.
Самое начало
В директории, в котором будет проект создаем файл HelloWorld.java.
В ней же создаем поддиректорию forth
В forth создаем два файла STACK.java и fas.java

в STACK.java  пишем
Код:

package  forth;

public class STACK {

 public int [] stack = null;  //
 
 public int sp;

 public void push(int v) {stack[sp++] = v; }

 public int pop()        {return stack[--sp];} // --sp

 public int peek() { return stack[sp - 1];}  // неразрушающее чтение стека

 public int peek2() {   return stack[sp - 2];   }

 public void drop(int i) {sp -= i;      }

 public int getDepth() {        return sp; }
В fas.java пишем
Код:

package forth;
/*
форт ассемблер
*/  
import java.util.*;
import java.lang.*;

public class fas {

public   static int here;  // адрес переменной HERE в массиве memory

 public short[] memory = new short[1000];  //выделяем память из 16 битных целых размером в 1000

 public STACK ST;  
Дальше определяем векторы. О векторах подробнее позже
Код:

public  Vector StringVector;

public Vector initVirtualMem(int i) {
 Vector v = new Vector();
 Integer I = new Integer(i);  // тип Integer, это объектное представление типа int
 v.addElement(I);  
 return v;
}

 
public int appendData(Vector v,Object obj) {
 
  //  Integer Ind = // new Integer(); Ind=
     //  (Integer)v.elementAt(0);   // получить значение начального элемента вектора как Integer
    int ind = 0; // 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 cre0 (String s, boolean immediate) { // временная вспомогательная ф-ция. создающая упрощенную запись в словаре
  short tmp = memory[here]; //получить here
  memory[tmp]=memory[latest];
  memory[latest]=tmp;
  tmp++;
  int i = s.length();    // получаем длинну строки
  if (immediate)  i=0-i; // если immediate , число отрицательно, (временно для простоты)
  memory[tmp]= (short)i;
  tmp++;  
  i=appendData(StringVector, s);
  memory[tmp]= (short)i;  
  tmp++;
  memory[here]=tmp;  //устанавливается новое значение here
}
Код:

public int find( String s) { // 0 - не найдено ; иначе адрес в словаре, если отрицательно то immediate
 int ret=0;
 boolean bool=false;
 boolean immediate=false;
 int tmp=memory[latest];
 while (tmp != 0 && ! bool) {
 
 int len = memory[tmp+1];
 if (len<0) {immediate=true;
             len=0-len;
             }
 int ind = memory[tmp+2]; // получаем инд в векторе          
 String si = (String)StringVector.elementAt(ind);
 if ( s.compareTo(si)==0) {
    bool = true;
    if  (immediate ) ind=0-ind;
    ret=ind;
    }                    
   else
   tmp=memory[tmp];
 }//while  

 return ret;
}  //тут find находит не cfa а индекс в векторе
Код:

////////////////////////////////реализация WORD//////////////////////////////////////////
public static   int _IN=0;       // !!!!to memory

public  int number(String s) { // тут возвращает 0 и на стеке число или -1
  int ret = 0;
  int ii;
  try {ii = Integer.parseInt(s);
      ST.push(ii);
      } catch (Exception e) {ret=-1;}
  return ret;
}

static  boolean ifblank(char ch) {
   boolean ret=false;
   if(ch == ' ' || ch == '\n' || ch == '\t' || ch=='\r') ret = true;
 return ret;  
 }
Код:

 static  private int skipBlank(String s, int _in) {
      int position;
      position=_in;
      boolean log=true;
      while (log)  
      if ( (position)==s.length() ) {position= -1; log = false; }  // достигнут конец потока возвращает -1
       else
       {
         if  ( ifblank( s.charAt(position))  ) position++;  else log=false;
         }  //else
 return position;
} //end
Код:

 static    private int skipUntilBlank(String s, int _in) {
      int position;
      position=_in;
      boolean log=true;
      while (log)  
      if ( (position)==s.length() ) {  log = false; }  // достигнут конец  
       else
       {
         if  ( ! ifblank( s.charAt(position))  ) position++;  else log=false; //если не бланк
         }  //else
 return position;
} //endfunk
Код:

public static  String WORD( String s ) {
  String w = null;
  int start, ends;
  start=skipBlank(s, _IN);  
  if (start==-1) w=""; // достигнут конец потока, возвращает слово нулевой длинны
     else {
     ends=skipUntilBlank(s, start);  
     _IN=ends;
      w=s.substring(start,ends);  
      }
return w;    
}  
Код:
}  //all

В HelloWorld.java
Код:

 import java.util.*;
import forth.*;


public class HelloWorld {
 
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        String test="aa";
        System.out.println(" введите строку или end для выхода");
 
  STACK ST;   // стеки данных      
  ST=new STACK();
  int[] stackarray = new int [20];
  ST.stack=stackarray;
Код:

    fas as = new fas();
 // memory инициировать здесь
      as.ST=ST;
      as.here=  2;
      as.  latest=3;
      as.  memory[as.here]=6; //взято от балды
      as.  memory[as.latest]=0;// записи в словари еще не создавались

    Vector V=null;
     V = as.initVirtualMem(0);
    as.StringVector=V;
Код:

        while (test.compareTo("end")!=0) {
           test=null;
           test=in.nextLine();

           as._IN=0;
           boolean log = true;
           while ( log ) {  
             String st;
             st = as.WORD(test);
 
             int ind = as.find(st);
Код:

             if (ind==0) {
                          if (as.number(st) != 0) { //если не нуль  // если равно 0 то на стеки число
                              System.out.println("слово " +st+" не обнаружено, добавляется в словарь");
                              boolean b=false;
                              if (st!="")
                                if (st.charAt(0)=='i') b=true; //если 1 буква слова "i" то immediate
                              as.cre0(st,b);
                             }//if
                          }//if
             boolean im=false;
             String mes;
             if (ind < 0) {im=true;ind=0-ind;
                           mes=" исполняется ";
                           System.out.println( as.StringVector.elementAt(ind) + mes);
                            }
            
            else                  
                          
             if (ind>0) {mes= " компилируется ";
                      System.out.println( as.StringVector.elementAt(ind) + mes);
                      }  
//           System.out.println(" вектор = " + as.StringVector.size() )
 
             if (st=="") log = false;
            }
        }//while
Код:

          int iii=ST.getDepth();
          for (int k=0; k<iii; k++)   System.out.println( as.ST.pop()+""); // печать стека

for (int k=0;k<39;k++) System.out.print(as.memory[k]+" "); System.out.println("# \n");  // дамп первых 40 слов памяти

        as.memory[as.here]=4;
        as.memory[as.latest]=0;
 
    }//main
  
}//all
откомментирую потом
скачать можно https://anonfile.com/A2S1T8U0m2/hello_tar
Компилировать
javac  HelloWorld.java
запустить
java HelloWorld
 Программа выбирает слова,
если число, кладет на стек
иначе - пытается найти в словаре
 если находит то
  если начинается с i то пишет исполняется
   иначе пишет компилируется
если не находит то добавляет в словарь, создавая цепной список
также после ввода каждой строки, находит в словаре пустое слово "" и выводит сообщение

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Пт Мар 29, 2019 10:10 pm

Код, реализованный  на первом шаге, может быть полезен, например при отладке строковых процедур, если заменить Vector чем-нибудь более подходящим.

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

Выкладывать исходники удобнее было бы на гитхаб, но как-то неловко выкладывать
недоделанный проект, на который гугл будет вываливать ссылки и люди будут
тратить свое время. По этому буду просто вываливать на файлообменник и
комментировать здесь изменения с прошлой версии.

Файл fas.java
Добавляем переменные
Код:

 public int exit_addr;  //адрес процедуры выхода из виртуальной машины
 public FVM VM;  // добавление виртуальной машины
Убираем ф-цию find, вместо нее создаем процедуру find_ (String s)
Код:

public void find_( String s) { //поле кода   n 0 - не найдено  если не отрицательно то immediate
 int ret=0;
 boolean bool=false;
 boolean immediate=false;
 int tmp=memory[latest];
 while (tmp != 0 && ! bool) {
 
 int len = memory[tmp+1];
 if (len<0) {immediate=true;} // если длинна слова отрицательна  - immediate=true;
 
 int ind = memory[tmp+2]; // получаем инд в векторе      
 String si = (String)StringVector.elementAt(ind);
 if ( s.compareTo(si)==0) {
    bool = true;
    
    ret=memory[tmp+3];
    }                    
   else
   tmp=memory[tmp];  
 }//while  
 
 ST.push(ret);
 if (ret==0) ST.push(0);
         else ST.push(-1);
}  
 
Она оставляет на стеке cfa, и 1 / -1 (immediate) или 0 0 если не найдено

Добавляется процедура exec(addr)
Код:

public void exec(int addr) {
 VM.adrStack.push(exit_addr-1);  // положить на стек возвратов адрес процедуры exit
 VM.processImage(addr);          // -1 тут особенность данной вирт машины,
                                                // надо протестировать
}
Тут на стек возвратов кладется адрес процедуры exit,  и запускается
ВМ с адреса, который найдет команда find

Добавляем процедуру cre1
Код:

public void cre1(String s, boolean immediate, short[] code )  {
   cre0(s,immediate);
   short h = memory[here];
   memory[h]=(short)(h+1);
   h++;
//  
  for( int k=0; k<code.length ; k++ ) {memory[h]=code[k];h++;  }
  memory[here]=h;
}
Вызывает cre0 и добавляет значение cfa (просто адрес, на который указывает переменная here)
затем впечатывает содержимое массива code

добавляется строка с форт словами и параметрами  opcode immediate
Код:

public String initwords =
  " NOP 0  -1      LIT  1 -1      DUP  2  -1    DROP  3  -1  SWAP  4  -1 "+
 "     PUSH  5  -1    POP  6 -1      CALL  7  -1    JUMP  8 -1   ;  9 1 " +
   "  GT_JUMP   10 -1 LT_JUMP  11 -1  NE_JUMP  12  -1     EQ_JUMP  13  -1 " +
   "  FETCH  14  -1   STORE  15  -1      " +
  "   +  16  -1   -  17 -1   *  18  -1 DIVMOD  19  -1 " +
  "   AND  20   -1   OR  21 -1   XOR  22  -1 SHL  23  -1  SHR  24 -1 "+
  "   ZERO_EXIT  25 -1    INC  26  -1   DEC  27 -1 "+
  "   IN  28  -1  OUT  29 -1    WAIT  30  -1 "+
 "    LIT32  31 -1 "+
"end_ "
;  


Файл FVM.java надо положить в папку forth
Лучше взять файл с файлообменника, ссылку на который приложу, а не копировать с форума,
так как внес в файл изменения.
Пустая ф-ция callService(int port, int y) заменяется
Код:

 private void callService(int port, int y) { // вызывается во время записи в порт (out)
        // зависит от реализации
  
   if (port != 0) System.out.println("нетот порт "+ port);
     else
     {
     switch (y) {
       case 0 : _HALT=true; break;   // остановка виртуальной машины
       case 1 : System.out.println("stack "+stack.pop() ); _HALT=true; break;  // печатать число на вершине стека "."
 
      } //switch
   }//else
 }

файл STACK.java остается без изменений

В HelloWorld.java

В секции, где инициируются стеки надо добавить инициацию стека возвратов
Код:

  STACK ST,STa;   // стеки данных и адресный      
  ST=new STACK();
  STa=new STACK();
  int[] stackarray = new int [20];
  int[] adrstackarray = new int [20];
  
int[] ports = new int[20];

  ST.stack=stackarray;
  STa.stack=adrstackarray;  
за одно добавили создание массива портов

инициируем ФВМ
Код:

   FVM VM=new FVM();
   VM.stack=as.ST;
   VM.adrStack=STa;
   VM.image=as.memory;
   VM.ports=ports;
   as.VM=VM;

   VM.as=as;

Загрузка форт слов
Код:

////////////////////////////////// загрузка форт слов
  String ini = as.initwords;
  as._IN=0;
  boolean enddo=false; //для выхода из цикла
  do {
    String    name    = as.WORD(ini);
    
//  System.out.print(name);  
    if (name.compareTo("end_") != 0) {
      String codeString = as.WORD(ini);
      String immString  = as.WORD(ini);
      int code=0;
      try { code=Integer.parseInt(codeString);} catch (Exception e){ System.out.print("huynia code");}  
      int imm=0;
      try {imm=Integer.parseInt(immString);} catch (Exception e){ System.out.print("huynia imme");}  
      boolean bool =  imm>0;

      short[] arrays={0,9};// "nop" ";"  {0,1,0,1,0,29};// последовательность " nop  lit 0 lit 0 out " для exit
      arrays[0]=(short)code;              // нулевой элемент заменяется кодом операции
      as.cre1(name,bool,arrays);

//  System.out.print(name+code + " " +imm);
      }
       else enddo = true;
     } while (! enddo) ;

Определяем процедуру останова ВМ и "."
то что выполнится в callServices в FVM
Код:

       short[] araa={1,1,1,0,29}; //lit 1 lit 0 , out   определение точки
       as.cre1(".",false,araa);

       short[] araaex={1,0,1,0,29}; // lit 0 lit 0 out  -- exit
       as.cre1("EXIT",false,araaex);
       as.find_("EXIT");    // найти свежеопределенный exit
       ST.pop(); //
       as.exit_addr=ST.pop(); //сохранить точску входа в exit,чтобы положить на стек возвратов

Главный цикл заменяем на
Код:

      
       test=null;test="aa";
        while (test.compareTo("end")!=0) {
           test=null;
           test=in.nextLine();

           as._IN=0;
   boolean log = true;
   while ( log ) {  
             String st = as.WORD(test);
     if (st=="") log = false;
        else {
                   as.find_(st);
           int n = ST.pop();
           int val = ST.pop();
                   if (n != 0 )
      as.exec( val );
 /*
       if (as.memory[as.state]==0) as.exec( val );
         else
    as.comp(val);
                 */
             else
                      if (as.number(st) != 0) //не число , иначе число на стеке
          
         { // test=null; test="end";
          System.out.println("ошибка " + st + "  не существует");
          log=false;
          }
          }//else    
   }//while
        }//while

Скачать
https://anonfile.com/J70299V4m5/hello1_tar
форт слова набирать большими буквами
end для выхода - маленькими.
При выходе ругнется ошибкой.
При исчерпании стека вылетает.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty шаг 1

Сообщение автор vikt144 в Вс Сен 29, 2019 8:39 am

На свежий взгляд - то, что написано выше, плохо читаемо.
Начну сначала.

Введение к статье напишу позже.

Шаг 1: hello World.  
Тут все просто
https://pastebin.com/gUwmgCFu

 Читает строки и выделяет слова, ограниченные разделителями,
пока не наткнется на  "end".

На процедуру printm в самом низу, пока не надо обращать внимание

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Ср Ноя 13, 2019 3:05 am

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

шаг второй
Создаем каталог forth а в нем файл  fas.java

Копируем текст
https://pastebin.com/V9i4Fk5D

Сюда переписал ф-цию world_ с первого шага.

Так же добавил  хранилище строк, тут используется тип данных java.util.Vector
ранее в соседней теме комментировал.
Хранить строки можно многими способами, собственно этот шаг служит
для того, что бы протестировать реализацию хранилища строк.

Еще здесь появляется "оперативная память", размер байта которой 16 бит (short).
public short[] memory = new short[1000];
процедура cre0 создает в этой памяти структуру

link  
length    длинна строки
index     что бы найти строку в хранилище
666        на месте будущего cfa - чтобы различать статьи визуально, при просмотре памяти dump



Файл  HelloWorld.java  (в каталог forth не входит)
https://pastebin.com/NEpEBG6v
тут добавляются команды
printv - для печати введеных слов
printm - для dump памяти
del <n>  удаление строки с определенным номером из хранилища
    (структура, созданная cre0 остается)

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Сб Дек 07, 2019 9:26 pm

шаг 3usesStack
тут добавляем стек и переписываем ф-ции в стековой нотации.
Так же добавляется Find.
Это может пригодится для совместного тестирования create  и find
при реализации словаря.

Главный файл теперь называется usesStack.java
https://pastebin.com/2ByneN3z

file    forth/fas.java
https://pastebin.com/0rAMsDv1

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

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Чт Янв 23, 2020 8:05 pm

Продолжаю вываливать черновую реализацию проекта.

Виртуальная машина.
https://pastebin.com/jQUVB8d7

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

Код:

int MagicNum = 100;

switch(op) {
 
    case VM_NOP:
      break;
    case VM_LIT:    ip++;stack.push(image[ip]); // положить 16 битное значение на стек
      break;
  default:
      if (op > MagicNum) ip=op;// если опкод больше некоторого числа
    break;                                // этот число интерпретируется
  }//end switch                     // как адрес, куда надо перейти

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

  Смысл использовать байт код вместо шитого кода - мне так нравится.
Еще, в команды такого вида, насколько я знаю, превращается программа
на любом языке, после грамматического разбора. Следовательно, если
бы гипотетически,  разрабатывали компилятор с этого байт кода, в машинный
код так же тщательно, как компилятор си, то он бы вероятно был бы
такой же быстрый, как си.
 Говорят, что форт намного медленней си.

http://fforum.winglion.ru/viewtopic.php?p=46895&sid=838ab76c3538ee88f16567fddd64d11b#p46895

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Gudleifr в Чт Янв 23, 2020 8:18 pm

vikt144 пишет:Смысл использовать байт код вместо шитого кода - мне так нравится
Точно?

vikt144 пишет:Еще, в команды такого вида, насколько я знаю, превращается программа на любом языке, после грамматического разбора.
Тут две ошибки: 1) не "на любом", 2) грамматический разбор - не последняя фаза компилятора.

vikt144 пишет:Говорят, что форт намного медленней си.
Только, если речь не идет о тех местах, где быстродействие важно.

Извините, что влез в Ваши рассуждения (если надо, потру, или перенесу в другое место), но смысл "черновиков", обычно, в постижении теории путем практики, а не в оправдывании заранее еще не совершенных ошибок.
Gudleifr
Gudleifr
Admin

Сообщения : 1203
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Чт Янв 23, 2020 8:36 pm

Извините, что влез в Ваши рассуждения пишет:

Наоборот, другая точка зрения очень важна.

А по поводу байт кода - это я взял из ретрофорт, вожусь с ним уже лет 15 наверное,
лень что-то менять.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Пн Янв 27, 2020 1:18 pm

Код в основном предназначен для тестирования виртуальной  машины.
Так же реализован  прототип execute.

Сначала загружается текст из строковой переменной initwords

как это работает - описано выше.
Выглядит довольно невнятно, но мало вероятно, что кто то это читает,
а если читают, то могут спросить. Это черновик.

main
https://pastebin.com/XmqKMGCi
фортасcемблер
https://pastebin.com/dEWNLk1a
fvm
https://pastebin.com/tu2hSiMM

скачать
https://anonfile.com/N9l1LeQ3n7/vm_7z

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Пн Фев 03, 2020 4:41 pm

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

Случай, когда create вызывается в процессе интерпретации текста  
Код:
create name
 создает статью name, значение cfa должно интерпретироваться
1)   в процессе интерпретации слова name, на стек кладется адрес поля параметров статьи name.
 2)  в процессе компиляции текста, где вызывается name, генерируется код, который кладет на стек
   адрес поля параметров статьи name.
 В этой реализации  cfa=0, и генерируется код виртуальной машины lit <адрес поля параметров name>

cfa=1 в этой реализации присваивается статьям, которые являются обертками для опкодов виртуальной машины,
таких как dup + - ! @ итд.
поле параметров в этом случае состоит из двух слов и выглядит например для dup так,
opcode dup
opcode ret    - опкод для возврата из подпрограммы

В процессе компиляции какой-нибудь словарной статьи, в случае ссылки на dup, просто скопирует
opcode в поле параметров новой статьи.

Слова, определенные через : (двоеточия), это вообще процедура.
Здесь для таких слов cfa=2.
Если в процессе компиляции встретится ссылка на такое слово, то будет
сгенерирован код call <адрес поля параметров >

Слова, определенные через create does> в процессе выполнения оставляют на стеке
адрес поля параметров, и выполняют код, который расположен после does>.

Здесь cfa=-<адрес кода после does> , отрицательное значение используется,
что бы различить от других случаев.
В процессе компиляции генерируется  код
lit <адрес поля параметров>  call <abs(cfa)>

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Gudleifr в Пн Фев 03, 2020 5:34 pm

vikt144 пишет:у меня вызвало трудности - разное исполнение слов...
...
значение cfa должно интерпретироваться...
...
генерируется код виртуальной машины...
...
Т.к. у Вас просто switch, то вся эта псевдо-FORTH-обфускация совершенно избыточна. Из-за нее - и трудности.
Gudleifr
Gudleifr
Admin

Сообщения : 1203
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Вт Фев 04, 2020 12:17 am

Но такой подход имеет свои плюшки.
1) Модуль, скомпилированный в байт код, более автономен, требует только таблицы привязки адресов, своих и внешних, что похоже на целевую компиляцию.
2) Раньше у меня так и реализовывался фортоподобный язык, соответственно
мне ничего изобретать не нужно.
3) В системах, где есть возможность программировать на ассемблере,
байт код можно компилировать и оптимизировать дальше, что для меня
впрочем не актуально.

 ps Надо отладить предыдущее мое сообщение и скопировать на Winglion.
Там эта тема кажется не раскрыта, как и у Баранова Ноздрунова.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Вт Фев 04, 2020 12:59 am

Выкладываю теперь последнюю часть проекта.
Это еще не форт, это код для тестирования компонентов форта.
Откомментирую, если кто-нибудь попросит, этот код буду переписывать.

Сейчас он выполняет все примеры из  Баранова Ноздрунова, кроме
<do loop> - видимо какая-то ошибка.

forth words
Вставлю сюда

: <     - 0< ;
: =     - 0= ;
: >     - 0> ;

: >mark here 1 allot ;

: if compile ?branch  >mark ; immediate

: then >resolve ; immediate

: else   compile branch  >mark swap >resolve ; immediate

: <mark here ;

: begin <mark ; immediate

: until compile ?branch <resolve ; immediate

: while  compile ?branch  >mark   ; immediate
               
: repeat  compile branch  swap <resolve  >resolve ; immediate
             
: var   create 2 allot   ;
: const create , does> @ ;

var tmpregistr0
var tmpregistr1
var tmpregistr2

: over swap dup  tmpregistr0 ! swap tmpregistr0 @ ;  
: rot  tmpregistr0 ! tmpregistr1 !  tmpregistr2 !       tmpregistr1 @  tmpregistr0 @ tmpregistr2 @ ;
: ?DUP ( A -> A,A/0 )  DUP  IF DUP THEN ;
: R@ R> dup >R ;

:  /   /mod swap drop ;
: mod  /mod drop ;
 
: 2+ 1+ 1+ ;
: 2- 1- 1- ;
: 2/ 2 /mod swap drop ;
: negate 0 swap - ;
: ABS ( A --->абс A ) DUP 0< IF NEGATE THEN ;

: 2dup    tmpregistr0 ! tmpregistr1 !     tmpregistr1 @ tmpregistr0 @    tmpregistr1 @ tmpregistr0 @  ;
: 2drop  drop drop ;

FVM

fort assembler

main

Весь проект
https://anonfile.com/ncif2aU6n0/crtDoes_7z

Сейчас займусь андроид программой, которая будет контейнером, для внедрения в нее форта.
По итогам внесу изменения в предыдущие части проекта.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Gudleifr в Вт Фев 04, 2020 1:10 am

vikt144 пишет:Но такой подход имеет свои плюшки.
Дык, речь не о минусах подхода (байт-кода), а о том, что вместо того, чтобы его "просто применить" (помните, всего-то надо научиться "вызывать функцию по номеру", "упаковывать процедуры в слова, а слова - в процедуры" и "научиться забегать вперед"?), Вы все пытаетесь привязать его к несуществующей в дикой природе "виртуальной машине".
Gudleifr
Gudleifr
Admin

Сообщения : 1203
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Вт Фев 04, 2020 10:23 pm

Не понял эту мысль. Есть JVM для java. Тоже стековая.
Есть parrot не помню для чего.
Есть LVM для Lua.

При этом, со своей виртуальной машиной я знаю как работать,
как вызвать ява ф-цию из FVM или наоборот. У меня в голове имеется
хоть какая-то модель, как это все будет работать в прикладной программе,
и практический опыт такой работы.

  Да и задача ставится так, чтобы после получения основы проекта,
клонировать эти решения, адаптировать их к своим задачам при этом
не делая никакой творческой работы. Только рутину.
 Творческая работа будет после, при написании и редактировании
скриптов, чтобы автоматизировать программы по максимому.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Gudleifr в Вт Фев 04, 2020 11:08 pm

vikt144 пишет:Не понял эту мысль.
Это что, я, вообще, не понимаю, что и зачем Вы делаете. Поэтому и прошу постоянно лирику. Каков план работ? Что нужно делать с файлами, которые Вы выкладываете? Зачем это делать? Что в них нужно искать? Какие альтернативы рассматривались и почему? Каких вопросов Вы ждете?..

vikt144 пишет:Есть JVM для java... Есть parrot... Есть LVM...
Это все для совместимости. Стандарты для написания на разном железе совершенно разных компиляторов/интерпретаторов, понимающих примерно одинаковые языки. FORTH совместимость ни к чему, т.к. он не живет долее одного проекта. Именно поэтому все попытки его стандартизации успешно проваливаются.

vikt144 пишет:У меня в голове имеется хоть какая-то модель, как это все будет работать в прикладной программе, и практический опыт такой работы.
Вот и опишите, пожалуйста, эту модель по-людски. Без отсылок к чужой косноязычной терминологии. Люди, которые сюда заходят, хотят, наверное, найти у Вас решения своих проблем, а не заценить, насколько Ваше решение вписывается в ожидания FORTH-бомонда.

vikt144 пишет:Да и задача ставится так, чтобы после получения основы проекта, клонировать эти решения, адаптировать их к своим задачам при этом не делая никакой творческой работы.
Творческая работа в Вашем случае - запустить "производственный цикл скриптов", а не не создать "всепогодный интерпретатор". Не свести к "рутине", а "автоматизировать ее".

vikt144 пишет:Творческая работа будет после, при написании и редактировании скриптов, чтобы автоматизировать программы по максимому.
Красиво, но совершенно непонятно. Как Вы собираетесь редактировать скрипты, имея только кривейшее средство в мире - FORTH-язык, и не разобравшись, при чем тут Ведроид? Что значит "автоматизировать программы"?

Очевидно, большая часть моих вопросов - от того, что я смотрю на Ваш проект с неправильной стороны. Так, что Вам проще будет либо завести отдельную тему-блог, описывающую Вашу проблему литературно, либо как-то оформлять Ваши вопросы и решения в независимой от Вашего проекта форме.
Gudleifr
Gudleifr
Admin

Сообщения : 1203
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Вт Фев 04, 2020 11:48 pm

Что нужно делать с файлами, которые Вы выкладываете? пишет:
Они предназначены для тестирования компонентов будущего форта, виртуальной машины, хранилища строк итд. А так же чтобы впоследствии, когда работа с черновиком закончится, вычитать снова и привести в более читабельное состояние.

Стандарты для написания на разном железе совершенно разных компиляторов/интерпретаторов, понимающих примерно одинаковые языки. FORTH совместимость ни к чему, т.к. он не живет долее одного проекта. пишет:

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

Про скрипты. Скрипты нужны для реализации своих хотелок.
И роль такая же, как роль bash в nix'ах.

Так, что Вам проще будет либо завести отдельную тему-блог пишет:
Да вроде есть соседняя тема для философий, или это намек валить куда-нибудь в
фейсбук?


vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Gudleifr в Ср Фев 05, 2020 1:24 am

vikt144 пишет:Они предназначены для тестирования компонентов будущего форта, виртуальной машины, хранилища строк итд.  А так же чтобы впоследствии, когда работа с черновиком закончится, вычитать снова и привести в более читабельное состояние.
Это не оправдывает их выкладывания без описания тестируемых компонентов, стратегии вычитывания и т.д. Т.е. "дураку пол-работы не показывают".

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

vikt144 пишет:Отсутствие стандартов - ущербность.
Для некоторых методов программирования - плюс, для других - минус. FORTH стандарты противопоказаны. Это подтверждается историей его развития.

vikt144 пишет:Потом, когда закончу черновик, а если кто-то интересуется, пусть себя хотя бы проявит, я с удовольствием все распишу.
Так, заинтересуйте! Как иначе "они" захотят проявиться?

vikt144 пишет:Про скрипты. Скрипты нужны для реализации своих хотелок.
И роль такая же, как роль bash в nix'ах.
Именно! Как раз этой роли "командного интерпретатора, гоняющего главный цикл системы", пока в Вашем проекте и не просматривается.

vikt144 пишет:Да вроде есть соседняя тема для философий, или это намек валить куда-нибудь в фейсбук?
Скорее, организовать "фейсбук" здесь.
Gudleifr
Gudleifr
Admin

Сообщения : 1203
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Ср Фев 05, 2020 1:45 am

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

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

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

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Gudleifr в Ср Фев 05, 2020 10:43 am

vikt144 пишет:По мере ее осуществления, будут и ответы на все вопросы.
Ну, если Вы обещаете ответы, то может сформулируете и вопросы?

vikt144 пишет:К тому же вываливание тяжелых трудно понимаемых текстов вряд ли помогло бы делу.
Выкладывайте легко понимаемые. Я, конечно, сам пишу непонятно, но у кого-то должно получиться же...

vikt144 пишет:Уже завтра...
Давайте. Чтобы не путать читателя, наверное надо тут немного почистить? Смотрите сами.
Gudleifr
Gudleifr
Admin

Сообщения : 1203
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Пт Фев 07, 2020 10:25 pm

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

Впрочем последнюю часть надо откомментировать.
После старта программы надо набрать
1 load
Тогда загрузится порция форт текста которая указана.
Можно создать свою порцию текста,
назвать файл <number>.f, например 3.f
и поместить его туда же, где находится файл 1.f
Тогда его можно будет загрузит командой
3 load

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Пт Фев 07, 2020 10:57 pm

Организация рабочего места для программирования под android.
Сейчас официальное средство считается android studio.
У него недостаток - требует мощной машины.
Я не нашел способа просто скомпилировать apk файл,
обязательно требует эмуляцию самого androida,
причем на уровне процессора arm. У меня едва хватило терпения
дождаться загрузки заставки, после чего я плюнул и снес эту хрень
к черту. Тем более, что мелькнувший на форуме Winlion'а longer
подсказал чудесную альтернативу.
AIDE- IDE for Android Java
для компиляции программ прямо на android.
Создает сразу apk-файл, не требует наличия разных сред,
необходимых для запуска готового приложения
https://play.google.com/store/apps/details?id=com.aide.ui&hl=ru
Кроме нее я ничем другим не пользовался.

 Можно редактировать ява программы прямо на телефоне, но это не очень
удобно.

Лучше создавать новую программу на телефоне с помощью aide,
затем выгрузить полученный проект на компьютер.
Отредактированный на компьютере проект загрузить обратно на
телефон, компилировать запускать...
Для этого можно использовать популярный ES проводник,
ипользуя удаленный доступ. Es проводник сделает телефон ftp сервером.
Теперь на компьютере с телефоном можно работать с помощью ftp клиента.
Внимание, es проводник не вполне безопасен, отправил без спроса
мои фотографии в облако, что с учетом того, что многие не выносят фотографироваться...
 Можно использовать другие, более простые файл менеджеры для
телефона, MIX например, они тоже могут делать из android  ftp сервер.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Сб Фев 08, 2020 12:40 am

Установили aide на телефон, создаем программу, называем less0
Выгружаем на компьютер каталог
<некий путь>less0
там будет подкаталог
/app
и 2 файла
build.gradle
settings.gradle
В подкаталоге /app будут еще каталоги
/build
/src
и еще один файл
build.gradle ( не путать с файлом каталогом выше)
Его содержимое
-----------------------------------------------------
apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
applicationId "com.virf.less"
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
---------------------------------------------------------------------------
тут интересна строчка minSdkVersion 9
это минимальная версия платформы, для которой будет скомпилирован проект.
sdkversion 9 соответствует android 2.3
sdkversion 14 android 4.0
соответсвия sdk и платформы можно посмотреть тут.
https://developer.android.com/studio/releases/platforms
В aide, если планируется использовать платформу до 4.0
править этот файл обязательно

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Пн Фев 10, 2020 11:39 pm

Исходные тексты  отредактированы, возвращаем проект обратно в планшет
по wifiFTP, компилируем, нажимая на белый треугольничек вверху,
если нет ошибок, aide предложит установить и запустить
только что скомпилированное приложение.
 Теперь осталось извлечь APK файл, чтобы установить его на другие смартфоны.
Как это сделать с помощью ESпроводника
https://gadgetmir.org/faq/kak-izvlech-apk-fajly-iz-android-ustrojstva-poshagovaya-instruktsiya.html
Другие способы
https://www.google.com/search?q=как+извлечь+apk+файл
В общем ничего сложного.

ps. Возможно в настройках усройства может понадобится включить опцию
"установка программ не из надежных источников"
Это позволит устройству загружать программы не только с гугломаркета.
Так же возможно придется включить эту опцию и на устройстве с aide.

Дальше программирование.

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор vikt144 в Вт Фев 11, 2020 2:24 pm

Список уроков программирования для андроид можно посмотреть здесь
https://startandroid.ru/ru/uroki/vse-uroki-spiskom.html
Они актуальны и для androidstudio, и для eclipse, и для aide.

Сначала разметка экрана
Идем в каталог ../src/main/res/layout/
Там находятся xml - файлы разметки экранов.
Пока работаем с одним экраном, поэтому там только один файл
main.xml
 В aide, файлы разметки должны называться маленькими буквами,
не знаю, общее ли это правило или особенность aide.
Подробно о размещение элементов можно посмотреть тут.
https://startandroid.ru/ru/uroki/vse-uroki-spiskom/38-urok-7-layout-parametry-dlja-view-elementov.html
 Но поскольку движком нашего нашего проекта будут скрипты,
запускаемые событиями и кнопок нужно минимум, воспользуемся
простейшими структурами. Тем, кому нужны красивости, может читать
ссылки выше и ковырятся.
(тут  // это не комментарий xml, это пояснение)
В aide вообще комментарий   <!--    comment  --> лучше добавлять в конец файла
в середине файла это кажется мутно работает.


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    //базовый Layout
   android:orientation="vertical"                                                                            // все элементы расположены                                                      
   android:layout_width="match_parent"                                                             // по вертикали
   android:layout_height="match_parent"
   android:gravity="center">

элемент 1
элемент 2
.....

        <LinearLayout                                              // вложенный layout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal">            // элементы расположатся по горизонтали
       элемент
        элемент
        элемент
        </LinearLayout>                           // конец вложенного layout
элемент
элемент
</LinearLayout>                 // конец базового  layout

отобразит примерно следущее
-----------------------------------------------------
      элемент 1
      элемент  2
 элемент   элемент   элемент
       элемент
       элемент
---------------------------------------------------

vikt144

Сообщения : 88
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Черновик: Пошаговое создание форта на java Empty Re: Черновик: Пошаговое создание форта на java

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Страница 1 из 2 1, 2  Следующий

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения