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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Пн окт 29, 2012 21:30 
Не в сети

Зарегистрирован: Пн окт 29, 2012 18:25
Сообщения: 2
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Приветствую всех участников форума!
Не так давно передо мной встала задача написания форт-системы для мобильного телефона. Языком реализации выбрал Яву, руководствуясь лишь его поддержкой большинством мобильных телефонов. Пока не знаю насколько это оправдано для поставленной задачи. Но суть моего сообщения совсем не в этом. Где-то около месяца читал литературу по Форту - книгу Баранова, Ноздрунова, статьи Брэда Родригеса, но целостной картины "как все взаимосвязано и устроено" так и не появилось. В понятиях, используемых при реализации Форта, я разобрался, то есть шитый код и адресный интерпретатор для меня не пустые слова. Банально не знаю с какой стороны подойти, с чего начать. Я думаю, что кто-нибудь из участников да встречался с такой проблемой при написании своего первого Форта и прошу поделиться опытом в этом вопросе.
Была конечно предпринята попытка написать для начала класс ForthVirtualMachine, но чувство, что получилась чушь меня не покидает. Вот наработка этого класса.
Код:
package forth;

public class ForthVirtualMachine {
   int ip;   //interpreter pointer
   int pc;   //program counter
   int[] ps; //parameter stack
   int psp;  //parameter stack pointer
   int[] rs; //return stack
   int rsp;  //return stack pointer
   int[] memory;
   
   public ForthVirtualMachine(int rs_depth, int ps_depth, int mem_size) {
      ip = -1;
      pc = -1;
      ps = new int[ps_depth];
      psp = -1;
      rs = new int[rs_depth];
      rsp = -1;
      memory = new int[mem_size];
   }

   public static class OpCodes {
      public static final int ENTER = -1; // RS :   -> A;
      public static final int EXIT = -2;  // RS : A ->  ;
      public static final int LIT = -3;   // PS :   -> A;
      public static final int NEXT = -4;  // inner interpreter
      //arithmetic operations
      public static final int ADD = -5;  // PS : A, B -> A+B;
      public static final int SUB = -6;  // PS : A, B -> A-B;
      public static final int MUL = -7;  // PS : A, B -> A*B;
      public static final int DIV = -8;  // PS : A, B -> A DIV B;
      public static final int MOD = -9;  // PS : A, B -> A MOD B;
      public static final int NEG = -10; // PS : A -> -A;
      //memory operations
      public static final int FETCH = -11; // PS : ADDR -> MEMORY[ADDR];
      public static final int STORE = -12; // PS : A, ADDR -> ; MEMORY[ADDR] := A
      //parameter stack operations
      public static final int DUP = -13;  // PS : A -> A, A;
      public static final int DROP = -14; // PS : A -> ;
      public static final int SWAP = -15; // PS : A, B -> B, A;
      public static final int OVER = -16; // PS : A, B -> A, B, A;
      //jumps
   }
   
   public void process(int cfa) {
      pc = cfa;
      int op_code = memory[pc];
      do {
         pc++;
         switch (op_code) {
            case OpCodes.EXIT :
               ip = rs[rsp];
               rsp--;
               pc = memory[ip];
               ip++;
               break;
            case OpCodes.ENTER :
               rsp++;
               rs[rsp] = ip;
               ip = pc;
               pc = memory[ip];
               ip++;
               break;
            case OpCodes.NEXT :
               pc = memory[ip];
               ip++;
               break;
            case OpCodes.LIT :
               psp++;
               ps[psp] = memory[ip];
               ip++;
               break;
            case OpCodes.ADD :
               psp--;
               ps[psp] += ps[psp + 1];
               break;
            case OpCodes.SUB :
               psp--;
               ps[psp] -= ps[psp + 1];
               break;
            case OpCodes.MUL :
               psp--;
               ps[psp] *= ps[psp + 1];
               break;
            case OpCodes.DIV :
               psp--;
               ps[psp] /= ps[psp + 1];
               break;
            case OpCodes.MOD :
               psp--;
               ps[psp] %= ps[psp + 1];
               break;
            case OpCodes.NEG :
               ps[psp] = -ps[psp];
               break;
            case OpCodes.FETCH :
               ps[psp] = memory[ps[psp]];
               break;
            case OpCodes.STORE :
               memory[ps[psp]] = ps[psp - 1];
               psp -= 2;
               break;
            case OpCodes.DUP :
               psp++;
               ps[psp] = ps[psp - 1];
               break;
            case OpCodes.DROP :
               psp--;
               break;
            case OpCodes.SWAP :
               int buf = ps[psp];
               ps[psp] = ps[psp - 1];
               ps[psp - 1] = buf;
               break;
            case OpCodes.OVER :
               psp++;
               ps[psp] = ps[psp - 2];
               break;
         }
         op_code = memory[pc];
      } while (rsp >= 0); //???
   }
}

Буду рад любым комментариям.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Пн окт 29, 2012 22:58 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
Теперь можно попробовать написать простейший интерпретатор. Для начала переданная строка, пока пусть из одного слова, вызовет соответствующее слово форт-машины из описанного класса. Полезно также сделать минимальную визуализацию состояния - например, вывести содержимое стека и памяти.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Пн окт 29, 2012 22:59 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
atomkraft писал(а):
Банально не знаю с какой стороны подойти, с чего начать.

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Вт окт 30, 2012 00:13 
Не в сети

Зарегистрирован: Вс апр 25, 2010 11:14
Сообщения: 200
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Можно ещё посмотреть как устроены уже готовые похожие системы поддерживающие j2me: frt-sci, sfi, retro (в соседних темах обсуждались).
По поводу кода: лучше не городить кучи классов, они тут ни к чему, и опкоды можно было делать (если вы хотите отделить ВМ форта, как отдельный уровень абстракции, более переносимый, но более медленный подход, в стиле retroForth), а можно было и не делать, а написать простой интерпретатор, как советует Хищник (более быстрый, простой подход, но потом модифицировать код сложнее).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Вт окт 30, 2012 01:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
Вообще, приятных/полезных/рабочих Фортов много больше одного :) Важно соотносить усилия и результаты и балансировать между планированием (переходящим в попытки "написать Форт в уме") и написанием кода (переходящим в кодонабивание по кругу). Мое предложение по интерпретатору - не догма, а просто рекомендация перейти к фазе практических проб, если уж какая-то часть кода набрана, и теперь стоит вопрос, куда же пойти дальше. У каждого оно может быть свое. Но при этом очень полезно иметь возможность смотреть на хоть сколько-нибудь живую систему - многие вещи станут понятнее, и возможно, найдется какое-то альтернативное решение, более подходящее желаемому образу Форта.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Вт окт 30, 2012 09:10 
Не в сети

Зарегистрирован: Вт авг 08, 2006 13:49
Сообщения: 47
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
В журнале "Системный Администратор" www.samag.ru (март и апрель 2011) была опубликована статья "Стек: скрытые таланты и возможности". Как раз о реализации стековой виртуальной машины на Java. Не совсем Форт, но смысл тот же



За это сообщение автора fplab поблагодарил: atomkraft
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Вт окт 30, 2012 09:32 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Тут еще одна сложность в поддержке железа разных устройств. Ибо производителей куча, платформ тоже немеряно и везде все может быть по-разному. А ввиду популярности андроида, есть еще и планшеты, смартфоны и прочее. Вот например есть gforth для андроида — вроед системя известная и развитая, а толком и не работает там. Чтобы написать Сфой Форт — им надо пользоваться постоянно. А если в форте новчек, то это, ИМХО, пустая трата времени. Ибо написаться-то оно напишется, а вот будет ли использоваться?
atomkraft писал(а):
Банально не знаю с какой стороны подойти, с чего начать.

С программирования на форте. Ведь Свой Форт пишется в первую очередь для себя.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Вт окт 30, 2012 21:00 
Не в сети

Зарегистрирован: Пн окт 29, 2012 18:25
Сообщения: 2
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Хищник писал(а):
Теперь можно попробовать написать простейший интерпретатор. Для начала переданная строка, пока пусть из одного слова, вызовет соответствующее слово форт-машины из описанного класса. Полезно также сделать минимальную визуализацию состояния - например, вывести содержимое стека и памяти.

Когда писал этот класс в голове крутилась такая идея. Написать виртуальную машину поддерживающую небольшой набор команд. С помощью этих команд реализовать примитивные слова Форта, которые обычно пишутся на языке низкого уровня. А далее использовать полученные слова и уже из них строить высокоуровневый код на Форте остальных слов. Этот момент меня и подкосил, какой-то самокомпилятор получается, а меня всегда этот термин пугал :? Или это на самом деле не сложно и этот подход широко используется?
mOleg писал(а):
Ну и еще можно посмотреть на уже реализованные форты (на яве).

Смотрел исходники Retro-Forth'a, но как понял весь смак зарыт в файле retroImage. А в нем разобраться это невыполнимая задача, так как там последовательность команд виртуальной машины на 28кб. В frt-sci, sfi более-менее понятно как все устроено. Но теперь кончено мучает вопрос пытаться развить мысль выше или просто оформить все необходимые слова одним case'ом. В первом подходе вижу следующие плюсы - более удобное расширение базового набора словаря. Например, действие слова IF реализованого на самом Форте - это одна-две строчки. Во втором же относительная простота устройства интерпретатора, но добавление новых слов менее удобно. Например те же действия слова IF в sfi у меня не вмещаются в экран.
fplab, спасибо за ссылку! Обязательно почитаю.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Вт окт 30, 2012 21:14 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
atomkraft писал(а):
Когда писал этот класс в голове крутилась такая идея. Написать виртуальную машину поддерживающую небольшой набор команд. С помощью этих команд реализовать примитивные слова Форта, которые обычно пишутся на языке низкого уровня. А далее использовать полученные слова и уже из них строить высокоуровневый код на Форте остальных слов. Этот момент меня и подкосил, какой-то самокомпилятор получается, а меня всегда этот термин пугал Или это на самом деле не сложно и этот подход широко используется?

В принципе, не так уж и сложно. Причем продолжать на том же языке или уже переходить к Форту, решать лучше самостоятельно, ориентируясь в первую очередь на собственное удобство и ощущение правильности, а не на какие-то догмы. Тут работают простота выражения (что-то проще дописать на Форте, а что-то на Java) и эффективность (скорость, размер) получаемого кода. Опять же, эффективность не является самоцелью, где-то может оказаться, что 1% кода напрочь остановил всю разработку, потому что какое-то вспомогательное слово хочется обязательно переписать на Форте (оставить на Java), а оно никак. Я тут склоняюсь к запуску уже хотя бы какой-то работающей версии и принятию дальнейших решений на основе работы с ней.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Пытаюсь разработать Форт-систему для мобильного телефона
СообщениеДобавлено: Ср окт 31, 2012 12:32 
Не в сети
Аватара пользователя

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

Крайне полезно сразу сделать возможность загрузку форт текстов через веб,
если загрузить можно хоть с narod.ru, то для выгрузки проще сделать свой веб сайт с cgi,
написать простейший скрипт на perl или php.
Я пользуюсь бесплатным хостингом
http://www.holm.ru/faq.shtml
Я мог бы выложить тексты, но из-за бесчисленных правок они крайне изуродованны и запутанны.
К тому же в них нет ничего выдающегося, махровая любительщина, но сами программы
для меня крайне полезны.

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


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

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


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

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


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

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