Создание простого транслятора forth
Участников: 3
Страница 1 из 4
Страница 1 из 4 • 1, 2, 3, 4
Создание простого транслятора forth
Буду дублировать сюда с
http://fforum.winglion.ru/
http://fforum.winglion.ru/
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
/* 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; }
}
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
Re: Создание простого транслятора forth
Ага, попались! Добро пожаловать!
А что такое "транслятор FORTH"?
А что такое "транслятор FORTH"?
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Gudleifr пишет:Ага, попались! Добро пожаловать!
А что такое "транслятор FORTH"?
Добрый вечер!
Транслятор с форта, это что то интуитивно понимаемо, данное нам в ощущениях...
(Сам не по понял, что сказал...)
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Дык, дело в том, что я это интуитивно отношусь к этой штуке сильно отрицательно (как к искусственному делению FORTH "поперек" на ОК-СИМВОЛ-КОМПИЛИРОВАТЬ и ВЫПОЛНИТЬ-СЛЕДУЮЩИЙ).vikt144 пишет:Транслятор с форта, это что то интуитивно понимаемо, данное нам в ощущениях...
А на этом форуме это понятие и вовсе всплыло первый раз, так что, хотелось бы пояснений.
P.S. Т.к. этот раздел Ваш, напоминаю, что Вы можете требовать убрать отсюда любые непонравившиеся посты, в т.ч. мои.
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Так это "транслятор Форта" или "транслятор с Форта"?vikt144 пишет:Транслятор с форта, это что-то интуитивно понимаемо, данное нам в ощущениях...
_KROL- Сообщения : 93
Дата регистрации : 2017-07-28
Возраст : 24
Откуда : Беларусь
Re: Создание простого транслятора forth
Низнаю_KROL пишет:Так это "транслятор Форта" или "транслятор с Форта"?vikt144 пишет:Транслятор с форта, это что-то интуитивно понимаемо, данное нам в ощущениях...
Зачем. Мало вероятно, что кто-то сюда собирается что-то постить, противоречащее законодательству РФ.Gudleifr пишет:
А на этом форуме это понятие и вовсе всплыло первый раз, так что, хотелось бы пояснений.
P.S. Т.к. этот раздел Ваш, напоминаю, что Вы можете требовать убрать отсюда любые непонравившиеся посты, в т.ч. мои.
Поясняю. Форт мне нужен только лишь потому, что на мобильных платформах невозможно реализовать полноценный
Unix Shell. То есть реализовать то конечно можно, но только как игрушку. Реально пользоваться ею крайне трудно.
Поэтому я строю небольшое кол-во своих мобильных приложений так: создаю минимально возможный
функционал и расширяю его с помощью скриптов, написанных на языке, напоминающем форт.
Это довольно плодотворный для меня способ, проверенный довольно большим промежутком времени.
И программа получается компактной и быстрозагружаемой, и интерфейс с минимум кнопок и тд..
И еще. Приятно использовать свои навыки в программировании.
Но сейчас решил вместо псевдофорта использовать нормальный форт .
Как оно там будет называться - без понятия. Чуть позже обдумаю и сформулирую требования к системе.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
К сожалению, совершенно не понятно, что, на чем и как Вы пишете, и в чем состоит Ваша проблема.vikt144 пишет:Форт мне нужен только лишь потому, что на мобильных платформах невозможно реализовать полноценный
Unix Shell...
Вот об этом и спрашиваю. В моем понимании понятие "FORTH-транслятора" противоречит сути "нормального форта".vikt144 пишет:Но сейчас решил вместо псевдофорта использовать нормальный форт .
P.S. Меня терзают смутные сомнения, что Ваша "система скриптов" уже технологичнее, чем "кубический FORTH в вакууме".
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Gudleifr пишет:К сожалению, совершенно не понятно, что, на чем и как Вы пишете, и в чем состоит Ваша проблема.vikt144 пишет:Форт мне нужен только лишь потому, что на мобильных платформах невозможно реализовать полноценный
Unix Shell...Вот об этом и спрашиваю. В моем понимании понятие "FORTH-транслятора" противоречит сути "нормального форта".vikt144 пишет:Но сейчас решил вместо псевдофорта использовать нормальный форт .
P.S. Меня терзают смутные сомнения, что Ваша "система скриптов" уже технологичнее, чем "кубический FORTH в вакууме".
На яве. Это единственное средство для программирования дешевых девайсов, не считая девайсов с wince.
А проблема состоит в отсутствие методичек по созданию форт транслятора, расчитанные на дебила.
Не сомниваюсь, что такая методичка возможна.
<<<Меня терзают смутные сомнения, что Ваша "система скриптов" уже технологичнее, чем "кубический FORTH в вакууме>>>>
На декстопе это действительно так, там мне нечего программировать.
На мобильнике много коряво написанного, но полезного кода, создаваемого с начала 2000.
Выбросить его нельзя, исправлять сложно. Думаю перепесать программы,
рассматривая их как расширения электронной таблицы и форта, благо
тот изначально расширяемый. Интуиция подсказывает, что реализовать
это более чем возможно.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Задавайте вопросы - отвечу. Что, например, непонятно у Мура, у Баранова и Ноздунова, наконец у меня? Но сначала ответьте, пожалуйста, на вопрос, что такое "FORTH-транслятор"?vikt144 пишет:А проблема состоит в отсутствие методичек по созданию форт транслятора, расчитанные на дебила.
Я правильно понял, что Вы хотите написать на мобильнике нечто, что позволит писать программы прямо на нем, не подсоединяясь к десктопу?vikt144 пишет:На декстопе это действительно так, там мне нечего программировать.
На мобильнике много коряво написанного, но полезного кода, создаваемого с начала 2000.
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Gudleifr пишет: Но сначала ответьте, пожалуйста, на вопрос, что такое "FORTH-транслятор"?
.....
Я правильно понял, что Вы хотите написать на мобильнике нечто, что позволит писать программы прямо на нем, не подсоединяясь к десктопу?
"FORTH-транслятор" - что угодно, которое превращает тексты на форте, в некие действия на вычислительном устройстве.
И да и нет. Это средство скриптинга внутри программы.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Спасибо, понятно. Теперь непонятно, зачем оно нужно FORTH, если он (будучи интерпретатором) сам понимает свои тексты?vikt144 пишет:"FORTH-транслятор" - что угодно, которое превращает тексты на форте, в некие действия на вычислительном устройстве.
Это непонятно. Сама программа пишется на большом компьютере или на устройстве, где она будет выполняться? Скриптинг производится на большом компьютере или на устройстве, где будут выполняться скрипты? Скриптинг производится средствами указанной программы, или скрипты загружаются в нее извне?vikt144 пишет:И да и нет. Это средство скриптинга внутри программы.
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Gudleifr пишет:Спасибо, понятно. Теперь непонятно, зачем оно нужно FORTH, если он (будучи интерпретатором) сам понимает свои тексты?vikt144 пишет:"FORTH-транслятор" - что угодно, которое превращает тексты на форте, в некие действия на вычислительном устройстве.Это непонятно. Сама программа пишется на большом компьютере или на устройстве, где она будет выполняться? Скриптинг производится на большом компьютере или на устройстве, где будут выполняться скрипты? Скриптинг производится средствами указанной программы, или скрипты загружаются в нее извне?vikt144 пишет:И да и нет. Это средство скриптинга внутри программы.
Где угодно. Можно редактировать на устройстве, можно на десктопе и затем грузить в устройство.
Форт (транслятор|компилятор|интерпретатор как угодно) должен быть простым,
и однажды написанный, не требовать никакой творческой работы по адаптации
к задаче.
Форт и задачи взаимодействуют друг с другом раз и на всегда единственно прописанным образом.
(разумеется, на практике могут быть нюансы, но их должно быть мало)
Базовая программа на языке высокого уровня, должна быть простой как кувалда,
реализовывать базовый функционал, и давать api для форт-скриптов.
Форт скрипты устанавливают параметры для базового функционала и привязываются к
элементам управления,
Таким образом получаются мощные, специально заточенные под конкретные нужды
программы с минимальным кол-вом элементов управлений, вдобавок легко реконфигурирущиеся.
На практике проверенно на моей фотопрограмме и навигационной программе,
где скрипты запускаются по входу и выходу объекта в окресности определенных
точек.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Т.е., я правильно понял:vikt114 пишет:...
есть базовая программа устройства, состоящая из трех частей
- "загрузчика FORTH-скриптов, возможно с редактором";
- "исполнятора загруженных FORTH-скриптов"; и
- "библиотеки полезных функций"?
И все уже проверено на практике.
А почему тогда "должна быть"? Чего не хватает?
Полного FORTH-функционала? Возможности полного отказа от модификации базовой программы?
Возможности менять базовую программу, не меняя "исполнятор"?
Реализации на FORTH как можно большей доли "загрузчика", "исполнятора" и "библиотек"?
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Совершенно верно.
В данный момент форта как такового нет, есть корявый стековый процедурный язык,
без CREATE и других фортовских плюшек.
Есть понимание, что все это придется переписывать. А одно это уже способствует
депресняку. Хочется работать по принципу - сделал, и забыл.
А почему тогда "должна быть"? Чего не хватает?
Полного FORTH-функционала? Возможности полного отказа от модификации базовой программы?
Возможности менять базовую программу, не меняя "исполнятор"?
Реализации на FORTH как можно большей доли "загрузчика", "исполнятора" и "библиотек"?
В данный момент форта как такового нет, есть корявый стековый процедурный язык,
без CREATE и других фортовских плюшек.
Есть понимание, что все это придется переписывать. А одно это уже способствует
депресняку. Хочется работать по принципу - сделал, и забыл.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Не совсем понятно, т.к. главной FORTH-плюшкой я считаю возможность наращивать функционал программы, не выходя из нее. В каком месте этот цикл разрывается? Допустим, я хочу написать что-то вродеvikt144 пишет:В данный момент форта как такового нет, есть корявый стековый процедурный язык, без CREATE и других фортовских плюшек.
: GO 7 ТАНК БАШНЯ 20. ВПРАВО ; GO
Как Вы это реализуете в текущей версии?
Как прошиваете этот код? Руками в Сишный код? Или, все-таки, уже есть интерпретатор?
Как Вы привязываете вызов GO к программе? Фиксированный адрес/массив? Или есть словарь?
Это же FORTH. Если хорошо владеете языком написания и имеете нормальную OS, это две недели.vikt144 пишет:Есть понимание, что все это придется переписывать.
Другое дело, что FORTH начинает работать задолго до того, как станет похожим на что-то готовое. Поэтому желание что-то подправить - это нормальное FORTH-чувство.
В FORTH-библиотеке я выложил перевод статьи Мура. Попробуйте почитать его, особенно, главу 9. Только представляйте себе, что вместо голого железа - у Вас виртуальная машина, образованная Вашей программой. Вместо кнопки RESET у Вас - запуск exe-шника, вместо памяти машины - массив данных, вместо писания в кодах - возможность так "перепаять железо", чтобы появилась новая инструкция процессора, адрес которой можно прописать в массив...
Короче, начинаете с
char s[256]; main() { while(1) gets(s); }
и начинаете думать, что добавить в этот цикл, чтобы получился FORTH.
Последний раз редактировалось: Gudleifr (Пн Дек 09, 2019 11:24 am), всего редактировалось 1 раз(а)
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
В ныне используемой версии
Или, все-таки, уже есть интерпретатор?
Как Вы привязываете вызов 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
Re: Создание простого транслятора forth
Пока все понятно.
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
О работе с памятью и вызове процедур на языке высокого уровня.
Именно тут, помимо стека и происходит взаимодействие
виртуальной машины форта и программой, в которую ФВМ
внедрена.
Тут память подразумевается не та, к которой в форте обращаются как
HERE, ALLOT, ! @ итд, а массивы, строки, структуры итд, которые можно
передать функции на языке высокого уровня, или которые ф-ция может вернуть.
Память может быть реализованна по разному, например
с помощью связных списков.
Тогда число, представляющее элемент из связанного списка будет
физическим адресом этого элемента.
Про добавление, удаление и прочего элементов связного списка
информации полно.
В java "память" можно реализовать так же с помощью вектора.
Вектор в ява, это массив, в который всегда можно добавить новый элемент.
Элемент в векторе, это объект любого типа, к которому можно обратиться
по индексу.
добавление элемента в вектор
int ind = appendData(Vect, byteArray );
Получить массив
byte[] newArray = (byte[]) Vect.elementAt( ind ) ;
(внимание, на низовом уровне все передается по ссылке, поэтому, если теперь
модифицировать newArray, то модифицируется также и массив, который храниться в векторе)
удаление объектов из вектора
из удаленых объектов образуется связный список
Тут, если например, выделить сразу 1000 объектов,
а затем сразу удалить, то размер вектора все равно
останется равным 1000. Тут надо додумать и удалять крайний элемент
получить тип объекта в виде строки
тип "cтрока" вернет как "java.lang.String"
массив целых как "[I"
двухмерный массив "[[I" итд
тут есть над чем подумать, возможно строку лучше парсировать и
типы данных представлять числами.
Функции на java могут использовать в качестве параметров элементы вектора,
присвоить результат выполнения функции элементу вектора и вернуть
этот элемент на стек или в порт.
Форт ВМ может обращаться к вектору через порты,
обработка записи и чтение портов индивидуально для каждой задачи.
Все тут написанное, это даже не черновик, а черновик черновика к статье
о cоздание простых форт систем
Именно тут, помимо стека и происходит взаимодействие
виртуальной машины форта и программой, в которую ФВМ
внедрена.
Тут память подразумевается не та, к которой в форте обращаются как
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; // возвращаем индекс объекта в векторе
}
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
Re: Создание простого транслятора forth
Вы сильно забегаете вперед. Эти механизмы FORTH не нужны и могут быть частью "библиотек"... А "общие блоки" без труда реализуются "там же, где и ALLOT".
Представьте себе, что Вы колдуете себе маленького гоблина, способного помогать Вам программировать. Сначала, надо чтобы он задышал, чтобы смог выполнять Ваши команды, а обучить его высшей математике можно и позже... Сейчас Вы должна разделить всю математику на ту, что внутри у гоблина (и о которой он никогда не узнает), и ту, которую он будет "осознанно" применять в своей работе....
Представьте себе, что Вы колдуете себе маленького гоблина, способного помогать Вам программировать. Сначала, надо чтобы он задышал, чтобы смог выполнять Ваши команды, а обучить его высшей математике можно и позже... Сейчас Вы должна разделить всю математику на ту, что внутри у гоблина (и о которой он никогда не узнает), и ту, которую он будет "осознанно" применять в своей работе....
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Gudleifr пишет:Вы сильно забегаете вперед. Эти механизмы FORTH не нужны и могут быть частью "библиотек"...
Я пока смутно представляю механику форта. Много проясниться, когда будет закончен черновой проект.
Функции, которые нужно вызывать из форта, очень сложны, ассинхронны.
Это навигация для андроид java locations api,
схемы управлением питанием и гашением дисплея,
получение видео и фотографий и иногда при этом гасить звук затвора,
(чтоб фотографировать бапп)
Работать с этим зоопарком нужно здесь и сейчас, не дожидаясь написания форта,
иначе программы будут готовы к следущей зиме, когда будут не нужны.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Вызов функции, написанной на java из виртуальной машины форта
Пусть ф-ция на java использует в качестве параметров массив байт, строку и целое,
и возвращает массив байт
пусть параметры на стеке расположенны следующим образом:
На вершине: целое, указывающий на расположение массива байт в векторе.
далее целое, указывающее на строку
далее, просто целое
тогда вызов функции на ява может быть написана так
вызов
Пусть ф-ция на java использует в качестве параметров массив байт, строку и целое,
и возвращает массив байт
- Код:
byte [] funct( byte[] b, String s, int i) {
byte[] ret=null;
//-- реализация ф-ции
return ret;
}
пусть параметры на стеке расположенны следующим образом:
На вершине: целое, указывающий на расположение массива байт в векторе.
далее целое, указывающее на строку
далее, просто целое
тогда вызов функции на ява может быть написана так
- Код:
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
Re: Создание простого транслятора forth
> Я пока смутно представляю механику форта.
Вы немножко переборщили с уровнями рефлексии. Вопросы типа: "Как FORTH будет вызывать функции, если я еще не знаю, как будет вызываться сам FORTH?" - до добра не доведут. Хотя, Вы вполне грамотно изобразили сам вызов.
> Функции, которые нужно вызывать из форта, очень сложны, асинхронны.
Вот тут и хитрость. FORTH - это еще пара лишних асинхронностей: "Чтение ПОТОКА" и "Правка программы руками". Его сила и слабость - в том, что сама работа с программой включена в программу. Чем Вы раньше это сделаете, тем лучше. Не думайте, что "когда будет закончен черновой проект, все прояснится". На тот момент FORTH уже можно будет выкидывать.
Вы мне уже раза три отвечали, и я раза два уже "понимал", как у Вас работает "цикл правки программы". Но каждый раз, когда Вы делаете шаг вперед, я вижу, что мое "понимание" - лишь уступка Вашему нежеланию отходить от привычных Вам парадигм писания кода.
Все не просто, все очень просто. Есть цикл "совершенствования программы":
в идеале он весь проходит во время работы программы ("exe-файла"), без выхода в Операционную Систему и вызова других "exe-файлов". Если Вы пишете не на голом железе одной машины, этот идеал недостижим, да и идеалом уже не является... Значит, будет не один такой цикл, а несколько, вложенных один в другой.
Например в DOS-версии FOBOS я что-то делал внутри FORTH-программы, сохраняя код в блоковой памяти; когда мне было лень писать большие куски кода, я вылезал из FORTH и правил его исходники, добавляя нужный функционал; все это было охвачено командным файлом DOS, который умел вызывать сам FORTH, текстовые редакторы, ассемблер и прочие игрушки, чтобы мне не нужно было вылезать наружу во время работы...
Поэтому, начинать надо не с осмысления всего взаимодействия системы в целом, а тупо с рисовании на бумажке приведенного выше рисунка с указанием, что, с чем, какими средствами и на какой машине я НА ДАННЫЙ МОМЕНТ делаю. Затем - добавлять и удалять к этому рисунку петли для приближения к ИДЕАЛУ. Например DOS-FOBOS начинался с цикла: запускаю DEBUG, пишу машинный код, пока не запутаюсь, запускаю с нужного адреса, пытаюсь поймать останов, перезапускаю повисший компьютер...
Вы немножко переборщили с уровнями рефлексии. Вопросы типа: "Как FORTH будет вызывать функции, если я еще не знаю, как будет вызываться сам FORTH?" - до добра не доведут. Хотя, Вы вполне грамотно изобразили сам вызов.
> Функции, которые нужно вызывать из форта, очень сложны, асинхронны.
Вот тут и хитрость. FORTH - это еще пара лишних асинхронностей: "Чтение ПОТОКА" и "Правка программы руками". Его сила и слабость - в том, что сама работа с программой включена в программу. Чем Вы раньше это сделаете, тем лучше. Не думайте, что "когда будет закончен черновой проект, все прояснится". На тот момент FORTH уже можно будет выкидывать.
Вы мне уже раза три отвечали, и я раза два уже "понимал", как у Вас работает "цикл правки программы". Но каждый раз, когда Вы делаете шаг вперед, я вижу, что мое "понимание" - лишь уступка Вашему нежеланию отходить от привычных Вам парадигм писания кода.
Все не просто, все очень просто. Есть цикл "совершенствования программы":
в идеале он весь проходит во время работы программы ("exe-файла"), без выхода в Операционную Систему и вызова других "exe-файлов". Если Вы пишете не на голом железе одной машины, этот идеал недостижим, да и идеалом уже не является... Значит, будет не один такой цикл, а несколько, вложенных один в другой.
Например в DOS-версии FOBOS я что-то делал внутри FORTH-программы, сохраняя код в блоковой памяти; когда мне было лень писать большие куски кода, я вылезал из FORTH и правил его исходники, добавляя нужный функционал; все это было охвачено командным файлом DOS, который умел вызывать сам FORTH, текстовые редакторы, ассемблер и прочие игрушки, чтобы мне не нужно было вылезать наружу во время работы...
Поэтому, начинать надо не с осмысления всего взаимодействия системы в целом, а тупо с рисовании на бумажке приведенного выше рисунка с указанием, что, с чем, какими средствами и на какой машине я НА ДАННЫЙ МОМЕНТ делаю. Затем - добавлять и удалять к этому рисунку петли для приближения к ИДЕАЛУ. Например DOS-FOBOS начинался с цикла: запускаю DEBUG, пишу машинный код, пока не запутаюсь, запускаю с нужного адреса, пытаюсь поймать останов, перезапускаю повисший компьютер...
Gudleifr- Admin
- Сообщения : 3245
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Возможно, я действительно поставил лошадь впереди телеги.
Но это более менее интегрируется со старым, работающим кодом.
Дает возможность экспериментировать с неоднозначно работающих
на разных аппаратах функциях android api,
Например, вызов функции getPictureSize() на htc desire
вызывает зависание программы и не отлавливается никакими try catch.
Подобных глюков в андроид api, касательно работы с мультимедиа
видимо много.
То есть я отделяю мух от котлет, отдельно разрабатывается форт,
отдельно базовый функционал программы.
Но когда уже будет отлаженная форт система, подход конечно поменяется.
Тогда не надо будет искать место, где ошибка, то ли в api, то ли в
обертке на java этого api, то ли в реализации форта, то ли еще где-нибудь.
Но это более менее интегрируется со старым, работающим кодом.
Дает возможность экспериментировать с неоднозначно работающих
на разных аппаратах функциях android api,
Например, вызов функции getPictureSize() на htc desire
вызывает зависание программы и не отлавливается никакими try catch.
Подобных глюков в андроид api, касательно работы с мультимедиа
видимо много.
То есть я отделяю мух от котлет, отдельно разрабатывается форт,
отдельно базовый функционал программы.
Но когда уже будет отлаженная форт система, подход конечно поменяется.
Тогда не надо будет искать место, где ошибка, то ли в api, то ли в
обертке на java этого api, то ли в реализации форта, то ли еще где-нибудь.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Докопирую материалы с форума.
Работа с массивами.
Пусть работа с массивом байт осуществляется через 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 \ удалить массив из вектора
Работа с массивами.
Пусть работа с массивом байт осуществляется через 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
Страница 1 из 4
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|