KRIEGSSPIELE!
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Создание простого транслятора forth

Участников: 3

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

Перейти вниз

Создание простого транслятора forth Empty Создание простого транслятора forth

Сообщение автор vikt144 Вт Окт 31, 2017 10:29 pm

Буду дублировать сюда с
http://fforum.winglion.ru/

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вт Окт 31, 2017 10:32 pm

/* from retro forth
http://forthworks.com/retro/
*/
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; }
}

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Ср Ноя 01, 2017 11:24 am

Ага, попались! Добро пожаловать!

А что такое "транслятор FORTH"?
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вс Ноя 05, 2017 2:28 am

Gudleifr пишет:Ага, попались! Добро пожаловать!

А что такое "транслятор FORTH"?

Добрый вечер!
Транслятор с форта, это что то интуитивно понимаемо, данное нам в ощущениях...
(Сам не по понял, что сказал...)

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вс Ноя 05, 2017 9:53 am

vikt144 пишет:Транслятор с форта, это  что то  интуитивно понимаемо, данное нам в ощущениях...
Дык, дело в том, что я это интуитивно отношусь к этой штуке сильно отрицательно (как к искусственному делению FORTH "поперек" на ОК-СИМВОЛ-КОМПИЛИРОВАТЬ и ВЫПОЛНИТЬ-СЛЕДУЮЩИЙ).
А на этом форуме это понятие и вовсе всплыло первый раз, так что, хотелось бы пояснений.

P.S. Т.к. этот раздел Ваш, напоминаю, что Вы можете требовать убрать отсюда любые непонравившиеся посты, в т.ч. мои.
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор _KROL Вс Ноя 05, 2017 12:21 pm

vikt144 пишет:Транслятор с форта, это что-то интуитивно понимаемо, данное нам в ощущениях...
Так это "транслятор Форта" или "транслятор с Форта"?

_KROL

Сообщения : 93
Дата регистрации : 2017-07-28
Возраст : 24
Откуда : Беларусь

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вт Ноя 14, 2017 6:54 pm

_KROL пишет:
vikt144 пишет:Транслятор с форта, это что-то интуитивно понимаемо, данное нам в ощущениях...
Так это "транслятор Форта" или "транслятор с Форта"?
Низнаю Sad


Gudleifr пишет:
А на этом форуме это понятие и вовсе всплыло первый раз, так что, хотелось бы пояснений.

P.S. Т.к. этот раздел Ваш, напоминаю, что Вы можете требовать убрать отсюда любые непонравившиеся посты, в т.ч. мои.
Зачем. Мало вероятно, что кто-то сюда собирается что-то постить, противоречащее законодательству РФ.

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

Как оно там будет называться - без понятия. Чуть позже обдумаю и сформулирую требования к системе.

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вт Ноя 14, 2017 7:36 pm

vikt144 пишет:Форт мне нужен только лишь потому, что на мобильных платформах невозможно реализовать полноценный
Unix Shell...
К сожалению, совершенно не понятно, что, на чем и как Вы пишете, и в чем состоит Ваша проблема.

vikt144 пишет:Но сейчас решил вместо псевдофорта использовать нормальный форт .
Вот об этом и спрашиваю. В моем понимании понятие "FORTH-транслятора" противоречит сути "нормального форта".

P.S. Меня терзают смутные сомнения, что Ваша "система скриптов" уже технологичнее, чем "кубический FORTH в вакууме".
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Ноя 17, 2017 11:12 pm

Gudleifr пишет:
vikt144 пишет:Форт мне нужен только лишь потому, что на мобильных платформах невозможно реализовать полноценный
Unix Shell...
К сожалению, совершенно не понятно, что, на чем и как Вы пишете, и в чем состоит Ваша проблема.

vikt144 пишет:Но сейчас решил вместо псевдофорта использовать нормальный форт .
Вот об этом и спрашиваю. В моем понимании понятие "FORTH-транслятора" противоречит сути "нормального форта".

P.S. Меня терзают смутные сомнения, что Ваша "система скриптов" уже технологичнее, чем "кубический FORTH в вакууме".

На яве. Это единственное средство для программирования дешевых девайсов, не считая девайсов с wince.
А проблема состоит в отсутствие методичек по созданию форт транслятора, расчитанные на дебила.
Не сомниваюсь, что такая методичка возможна.
<<<Меня терзают смутные сомнения, что Ваша "система скриптов" уже технологичнее, чем "кубический FORTH в вакууме>>>>
На декстопе это действительно так, там мне нечего программировать.
На мобильнике много коряво написанного, но полезного кода, создаваемого с начала 2000.
Выбросить его нельзя, исправлять сложно. Думаю перепесать программы,
рассматривая их как расширения электронной таблицы и форта, благо
тот изначально расширяемый. Интуиция подсказывает, что реализовать
это более чем возможно.

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Сб Ноя 18, 2017 12:02 am

vikt144 пишет:А проблема состоит в отсутствие методичек по созданию форт транслятора, расчитанные на дебила.
Задавайте вопросы - отвечу. Что, например, непонятно у Мура, у Баранова и Ноздунова, наконец у меня? Но сначала ответьте, пожалуйста, на вопрос, что такое "FORTH-транслятор"?

vikt144 пишет:На декстопе это действительно так, там мне нечего программировать.
На мобильнике много коряво написанного, но полезного кода, создаваемого с начала 2000.
Я правильно понял, что Вы хотите написать на мобильнике нечто, что позволит писать программы прямо на нем, не подсоединяясь к десктопу?
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вт Мар 13, 2018 2:41 am

Gudleifr пишет: Но сначала ответьте, пожалуйста, на вопрос, что такое "FORTH-транслятор"?

.....

Я правильно понял, что Вы хотите написать на мобильнике нечто, что позволит писать программы прямо на нем, не подсоединяясь к десктопу?

"FORTH-транслятор" - что угодно, которое превращает тексты на форте, в некие действия на вычислительном устройстве.

И да и нет. Это средство скриптинга внутри программы.

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вт Мар 13, 2018 10:46 am

vikt144 пишет:"FORTH-транслятор" - что угодно, которое превращает тексты на форте, в некие действия на вычислительном устройстве.
Спасибо, понятно. Теперь непонятно, зачем оно нужно FORTH, если он (будучи интерпретатором) сам понимает свои тексты?

vikt144 пишет:И да и нет. Это средство скриптинга внутри программы.
Это непонятно. Сама программа пишется на большом компьютере или на устройстве, где она будет выполняться? Скриптинг производится  на большом компьютере или на устройстве, где будут выполняться скрипты? Скриптинг производится средствами указанной программы, или скрипты загружаются в нее извне?
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Чт Фев 07, 2019 4:18 pm

Gudleifr пишет:
vikt144 пишет:"FORTH-транслятор" - что угодно, которое превращает тексты на форте, в некие действия на вычислительном устройстве.
Спасибо, понятно. Теперь непонятно, зачем оно нужно FORTH, если он (будучи интерпретатором) сам понимает свои тексты?

vikt144 пишет:И да и нет. Это средство скриптинга внутри программы.
Это непонятно. Сама программа пишется на большом компьютере или на устройстве, где она будет выполняться? Скриптинг производится  на большом компьютере или на устройстве, где будут выполняться скрипты? Скриптинг производится средствами указанной программы, или скрипты загружаются в нее извне?

Где угодно. Можно редактировать на устройстве, можно на десктопе и затем грузить в устройство.

Форт (транслятор|компилятор|интерпретатор как угодно) должен быть простым,
и однажды написанный, не требовать никакой творческой работы по адаптации
к задаче.
Форт и задачи взаимодействуют друг с другом раз и на всегда единственно прописанным образом.
(разумеется, на практике могут быть нюансы, но их должно быть мало)
Базовая программа на языке высокого уровня, должна быть простой как кувалда,
реализовывать базовый функционал, и давать api для форт-скриптов.
Форт скрипты устанавливают параметры для базового функционала и привязываются к
элементам управления,
Таким образом получаются мощные, специально заточенные под конкретные нужды
программы с минимальным кол-вом элементов управлений, вдобавок легко реконфигурирущиеся.

На практике проверенно на моей фотопрограмме и навигационной программе,
где скрипты запускаются по входу и выходу объекта в окресности определенных
точек.

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Чт Фев 07, 2019 5:22 pm

vikt114 пишет:...
Т.е., я правильно понял:
есть базовая программа устройства, состоящая из трех частей
- "загрузчика FORTH-скриптов, возможно с редактором";
- "исполнятора загруженных FORTH-скриптов"; и
- "библиотеки полезных функций"?

И все уже проверено на практике.

А почему тогда "должна быть"? Чего не хватает?
Полного FORTH-функционала? Возможности полного отказа от модификации базовой программы?
Возможности менять базовую программу, не меняя "исполнятор"?
Реализации на FORTH как можно большей доли "загрузчика", "исполнятора" и "библиотек"?
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Чт Фев 07, 2019 8:41 pm

Совершенно верно.


А почему тогда "должна быть"? Чего не хватает?
Полного FORTH-функционала? Возможности полного отказа от модификации базовой программы?
Возможности менять базовую программу, не меняя "исполнятор"?
Реализации на FORTH как можно большей доли "загрузчика", "исполнятора" и "библиотек"?

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

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Чт Фев 07, 2019 9:46 pm

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

: GO 7 ТАНК БАШНЯ 20. ВПРАВО ; GO

Как Вы это реализуете в текущей версии?
Как прошиваете этот код? Руками в Сишный код? Или, все-таки, уже есть интерпретатор?
Как Вы привязываете вызов GO к программе? Фиксированный адрес/массив? Или есть словарь?

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

В FORTH-библиотеке я выложил перевод статьи Мура. Попробуйте почитать его, особенно, главу 9. Только представляйте себе, что вместо голого железа - у Вас виртуальная машина, образованная Вашей программой. Вместо кнопки RESET у Вас - запуск exe-шника, вместо памяти машины - массив данных, вместо писания в кодах - возможность так "перепаять железо", чтобы появилась новая инструкция процессора, адрес которой можно прописать в массив...
Короче, начинаете с

char s[256]; main() { while(1) gets(s); }

и начинаете думать, что добавить в этот цикл, чтобы получился FORTH.


Последний раз редактировалось: Gudleifr (Пн Дек 09, 2019 11:24 am), всего редактировалось 1 раз(а)
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Фев 08, 2019 7:21 pm


Или, все-таки, уже есть интерпретатор?
Как Вы привязываете вызов GO к программе? Фиксированный адрес/массив? Или есть словарь?
В ныне используемой версии
процедура GO компилируется в байт код, относительный адрес запоминается в таблице.
В местах вызовов процедуры:
call <индекс в таблице на go> относительные местоположения call запоминается в другой таблице.
По окончанию, когда все скомпилированно, осуществляется проход по таблицам и
относительные адреса меняются на реальные.


В FORTH-библиотеке я выложил перевод статьи Мура.
Спасибо. Внимательно изучаю.

Продолжаю переносить сюда с форума WingLion.Ru
стек уже перенес
Код:

/* Part of the project take  from retro forth
http://forthworks.com/retro/
*/

package forth; 

public class FVM {

        public  int IMAGE_SIZE=1024;  // Размер памяти по умолчанию

  private int sp = 0, rsp = 0, ip = 0; // указатели стека, стека возвратов и адрес команды
 
        public STACK stack,adrStack;    //стеки

        public short  [] image;  // 16 битная память

        public int [] ports;  // порты ввода вывода
 

  public static final int
    VM_NOP = 0 ,
    VM_LIT = 1 ,  // положить 16 битное значение на стек
    VM_DUP = 2 ,    VM_DROP = 3 ,  VM_SWAP = 4 ,
    VM_PUSH = 5 ,    VM_POP = 6 ,
    VM_CALL = 7 ,    VM_JUMP = 8 ,    VM_RETURN = 9 , 
    VM_GT_JUMP = 10 ,VM_LT_JUMP = 11 , VM_NE_JUMP = 12 ,  VM_EQ_JUMP = 13 ,  //  >  <  !=  =
    VM_FETCH = 14 ,  VM_STORE = 15 ,  // @  !
    VM_ADD = 16 ,    VM_SUB = 17 ,    VM_MUL = 18 ,  VM_DIVMOD = 19 , // + - *  / 
    VM_AND = 20 , VM_OR = 21 , VM_XOR = 22 ,

    VM_SHL = 23 ,    VM_SHR = 24 ,    VM_ZERO_EXIT = 25 ,
    VM_INC = 26 ,  VM_DEC = 27 ,
    VM_IN = 28 ,  VM_OUT = 29 ,  VM_WAIT = 30, // записсь чтение портов , ожидание
   
    VM_LIT32 = 31. // положить 32 битное значение на стек
    ;

  private void handleDevices() {  // от ретро, // вызывается командой wait
        //зависит от реализации
  }

        private void callService(int x, int y) { вызывается во время записи в порт (out)
        // зависит от реализации
        }


  /**    * Process a single opcode*/ 
  private void process() {

  int x, y, z,tmp,  op;
  op = image[ip];
        switch(op) {

    case VM_NOP:
      break;
    case VM_LIT:    ip++;stack.push(image[ip]); // положить 16 битное значение на стек
      break;
    case VM_DUP:    tmp=stack.pop(); stack.push(tmp);stack.push(tmp);
      break;
    case VM_DROP:  stack.drop(1);
      break;
    case VM_SWAP:  x = stack.pop(); y= stack.pop(); stack.push(x);stack.push(y);
      break;
    case VM_PUSH:  x = stack.pop();  adrStack.push(x); // со стека данных на адресный стек
      break;
    case VM_POP:    x = adrStack.pop(); stack.push(x); // обратно
      break;


    case VM_CALL:  ip++; adrStack.push(ip); ip=image[ip]-1;
      break;
    case VM_JUMP:  ip++;    ip = image[ip]-1;
      break;
    case VM_RETURN:
      ip = adrStack.pop();
      break;
    case VM_GT_JUMP:  ip++;    //
      x = stack.pop(); y= stack.pop(); if (y>x) ip = image[ip] - 1;
      break;
    case VM_LT_JUMP:  ip++;
      x = stack.pop(); y= stack.pop(); if (y<x) ip = image[ip] - 1;
      break;
    case VM_NE_JUMP:  ip++;
      x = stack.pop(); y= stack.pop(); if (y!=x) ip = image[ip] - 1;  // переход если не равно
      break;
    case VM_EQ_JUMP:  ip++;
      x = stack.pop(); y= stack.pop(); if (y==x) ip = image[ip] - 1; // переход если  равно
      break;
   
   
    case VM_FETCH: /// @
      tmp=stack.pop();                        // со стека снимается адрес
      x=image[tmp]; tmp++; y=image[tmp];      // с этого адреса снимаются две соседние
      stack.push(x << 16  | y & 0xffff  );  // 16битные ячейки и с помощью сдвига и AND
      break;              // объединяются в 32 битное значение и кладутся на стек


    case VM_STORE:  //    //  обратная операция 32 битное знач. разлагается
    x = stack.pop(); y= stack.pop(); // на два 16 битных с помощью сдвигов 
    short a=(short)y ,  b = (short) (y >> 16);
    image[x]=b; x++ ;  image[x]=a;
      break;

    case VM_ADD:    x = stack.pop(); y= stack.pop();stack.push(y+x);
      break;
    case VM_SUB:    x = stack.pop(); y= stack.pop();stack.push(y-x);
      break;
    case VM_MUL:    x = stack.pop(); y= stack.pop();stack.push(y*x);/
      break;
    case VM_DIVMOD:    //my relize div 0
      x = stack.pop(); y= stack.pop();   
      stack.push(y % x);  stack.push(y/x); // на стеке остаток и целое
      break;    // иожно добавить проверку /0 если не отлавливаются исключения
    case VM_AND:    x = stack.pop(); y= stack.pop();stack.push(x & y);
      break;
    case VM_OR:      x = stack.pop(); y= stack.pop();stack.push(x | y);
      break;
    case VM_XOR:  x = stack.pop(); y= stack.pop();stack.push(x ^ y);
      break;
    case VM_SHL:    x = stack.pop(); y= stack.pop();stack.push(  y << x );  // сдвиг битов влево
      break; 
    case VM_SHR:  x = stack.pop(); y= stack.pop();stack.push( y >>= x );  //  вправо
      break;
    case VM_ZERO_EXIT:    // выход из подпрограммы, если на стеке 0
      if (stack.peek() == 0)
      {
        stack.drop(1);
        ip = adrStack.pop();
      }
      break;
    case VM_INC:  x = stack.pop(); x++; stack.push(x);
    break;
    case VM_DEC:  x = stack.pop(); x--; stack.push(x);
    break;

  case VM_IN:          // чтение порта
      x = stack.pop();
      y = ports[x];
      stack.push(y);
      ports[x] = 0;
      break;
    case VM_OUT:  // вершина номер порта
      x=stack.pop();
      y=stack.pop();
      ports[x]=y;//
      callService(x,y);  //вызов внешней функции
      break;
    case VM_WAIT:  handleDevices(); // наследство от  ретро
      break;

    case VM_LIT32:  // положить 32 битное значение
      ip++; x=image[ip]; ip++; y=image[ip];  stack.push( x << 16  | y & 0xffff );
      break; //2 16 битные ячейки объединяются в 32 битную с помощью сдвигов

  }
}


  boolean _HALT =  false;  //Переменной Halt присваиваются значение во время выполнения
                                //callService, при исполнении инструкции out

  public void processImage( int startIP ) {
  ip=startIP;
  boolean _HALT=false;
  while  (ip<IMAGE_SIZE  && ! _HALT) {
      process(); 
      ip++;}
  } //void




vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Пт Фев 08, 2019 8:16 pm

Пока все понятно.
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вс Фев 10, 2019 6:28 pm

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

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

В 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;          // возвращаем индекс объекта в векторе
  }
Размещение массива байт byteArray

int ind = appendData(Vect, byteArray );

Получить массив
byte[] newArray = (byte[]) Vect.elementAt( ind ) ;
(внимание, на низовом уровне все передается по ссылке, поэтому, если теперь
модифицировать newArray, то модифицируется также и массив, который храниться в векторе)

удаление объектов из вектора
Код:

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

Все тут написанное, это даже не черновик, а черновик черновика к статье
о cоздание простых форт систем

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вс Фев 10, 2019 7:16 pm

Вы сильно забегаете вперед. Эти механизмы FORTH не нужны и могут быть частью "библиотек"... А "общие блоки" без труда реализуются "там же, где и ALLOT".

Представьте себе, что Вы колдуете себе маленького гоблина, способного помогать Вам программировать. Сначала, надо чтобы он задышал, чтобы смог выполнять Ваши команды, а обучить его высшей математике можно и позже... Сейчас Вы должна разделить всю математику на ту, что внутри у гоблина (и о которой он никогда не узнает), и ту, которую он будет "осознанно" применять в своей работе....
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Ср Фев 27, 2019 3:59 am

Gudleifr пишет:Вы сильно забегаете вперед. Эти механизмы FORTH не нужны и могут быть частью "библиотек"...

Я пока смутно представляю механику форта. Много проясниться, когда будет закончен черновой проект.
Функции, которые нужно вызывать из форта, очень сложны, ассинхронны.
Это навигация для андроид java locations api,
схемы управлением питанием и гашением дисплея,
получение видео и фотографий и иногда при этом гасить звук затвора,
(чтоб фотографировать бапп)
Работать с этим зоопарком нужно здесь и сейчас, не дожидаясь написания форта,
иначе программы будут готовы к следущей зиме, когда будут не нужны.


vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Ср Фев 27, 2019 4:05 am

Вызов функции, написанной на 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
( на стеке - индекс массива в векторе )

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

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

> Я пока смутно представляю механику форта.

Вы немножко переборщили с уровнями рефлексии. Вопросы типа: "Как FORTH будет вызывать функции, если я еще не знаю, как будет вызываться сам FORTH?" - до добра не доведут. Хотя, Вы вполне грамотно изобразили сам вызов.

> Функции, которые нужно вызывать из форта, очень сложны, асинхронны.

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

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

Все не просто, все очень просто. Есть цикл "совершенствования программы":

Создание простого транслятора forth G9b18710

в идеале он весь проходит во время работы программы ("exe-файла"), без выхода в Операционную Систему и вызова других "exe-файлов". Если Вы пишете не на голом железе одной машины, этот идеал недостижим, да и идеалом уже не является... Значит, будет не один такой цикл, а несколько, вложенных один в другой.

Например в DOS-версии FOBOS я что-то делал внутри FORTH-программы, сохраняя код в блоковой памяти; когда мне было лень писать большие куски кода, я вылезал из FORTH и правил его исходники, добавляя нужный функционал; все это было охвачено командным файлом DOS, который умел вызывать сам FORTH, текстовые редакторы, ассемблер и прочие игрушки, чтобы мне не нужно было вылезать наружу во время работы...

Поэтому, начинать надо не с осмысления всего взаимодействия системы в целом, а тупо с рисовании на бумажке приведенного выше рисунка с указанием, что, с чем, какими средствами и на какой машине я НА ДАННЫЙ МОМЕНТ делаю. Затем - добавлять и удалять к этому рисунку петли для приближения к ИДЕАЛУ. Например DOS-FOBOS начинался с цикла: запускаю DEBUG, пишу машинный код, пока не запутаюсь, запускаю с нужного адреса, пытаюсь поймать останов, перезапускаю повисший компьютер...
Gudleifr
Gudleifr
Admin

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Мар 01, 2019 1:23 am

Возможно, я действительно поставил лошадь впереди телеги.
Но это более менее интегрируется со старым, работающим кодом.
Дает возможность экспериментировать с неоднозначно работающих
на разных аппаратах функциях android api,
Например, вызов функции getPictureSize() на htc desire
вызывает зависание программы и не отлавливается никакими try catch.
Подобных глюков в андроид api, касательно работы с мультимедиа
видимо много.
То есть я отделяю мух от котлет, отдельно разрабатывается форт,
отдельно базовый функционал программы.
Но когда уже будет отлаженная форт система, подход конечно поменяется.
Тогда не надо будет искать место, где ошибка, то ли в api, то ли в
обертке на java этого api, то ли в реализации форта, то ли еще где-нибудь.

vikt144

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

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

Создание простого транслятора forth Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Мар 01, 2019 1:26 am

Докопирую материалы с форума.

Работа с массивами.
Пусть работа с массивом байт осуществляется через 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   


vikt144

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

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

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

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

- Похожие темы

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