Forth http://fforum.winglion.ru/ |
|
Пытаюсь разработать Форт-систему для мобильного телефона http://fforum.winglion.ru/viewtopic.php?f=38&t=2888 |
Страница 1 из 1 |
Автор: | atomkraft [ Пн окт 29, 2012 21:30 ] |
Заголовок сообщения: | Пытаюсь разработать Форт-систему для мобильного телефона |
Приветствую всех участников форума! Не так давно передо мной встала задача написания форт-системы для мобильного телефона. Языком реализации выбрал Яву, руководствуясь лишь его поддержкой большинством мобильных телефонов. Пока не знаю насколько это оправдано для поставленной задачи. Но суть моего сообщения совсем не в этом. Где-то около месяца читал литературу по Форту - книгу Баранова, Ноздрунова, статьи Брэда Родригеса, но целостной картины "как все взаимосвязано и устроено" так и не появилось. В понятиях, используемых при реализации Форта, я разобрался, то есть шитый код и адресный интерпретатор для меня не пустые слова. Банально не знаю с какой стороны подойти, с чего начать. Я думаю, что кто-нибудь из участников да встречался с такой проблемой при написании своего первого Форта и прошу поделиться опытом в этом вопросе. Была конечно предпринята попытка написать для начала класс 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); //??? } } Буду рад любым комментариям. |
Автор: | Hishnik [ Пн окт 29, 2012 22:58 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
Теперь можно попробовать написать простейший интерпретатор. Для начала переданная строка, пока пусть из одного слова, вызовет соответствующее слово форт-машины из описанного класса. Полезно также сделать минимальную визуализацию состояния - например, вывести содержимое стека и памяти. |
Автор: | mOleg [ Пн окт 29, 2012 22:59 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
atomkraft писал(а): Банально не знаю с какой стороны подойти, с чего начать. Начать с написания требований к форт-системе. Т.е. техническое задание надо (если речь идет о чем-то серьезном). Если же вас больше попробовать что выйдет интересует, начинайте с продумывания используемой модели памяти, реализаци простейших примитивов, отладки передачи управления между примитивами (зависит от типа выбранного ШК) и простых определений. Ну и еще можно посмотреть на уже реализованные форты (на яве). |
Автор: | Antender [ Вт окт 30, 2012 00:13 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
Можно ещё посмотреть как устроены уже готовые похожие системы поддерживающие j2me: frt-sci, sfi, retro (в соседних темах обсуждались). По поводу кода: лучше не городить кучи классов, они тут ни к чему, и опкоды можно было делать (если вы хотите отделить ВМ форта, как отдельный уровень абстракции, более переносимый, но более медленный подход, в стиле retroForth), а можно было и не делать, а написать простой интерпретатор, как советует Хищник (более быстрый, простой подход, но потом модифицировать код сложнее). |
Автор: | Hishnik [ Вт окт 30, 2012 01:53 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
Вообще, приятных/полезных/рабочих Фортов много больше одного Важно соотносить усилия и результаты и балансировать между планированием (переходящим в попытки "написать Форт в уме") и написанием кода (переходящим в кодонабивание по кругу). Мое предложение по интерпретатору - не догма, а просто рекомендация перейти к фазе практических проб, если уж какая-то часть кода набрана, и теперь стоит вопрос, куда же пойти дальше. У каждого оно может быть свое. Но при этом очень полезно иметь возможность смотреть на хоть сколько-нибудь живую систему - многие вещи станут понятнее, и возможно, найдется какое-то альтернативное решение, более подходящее желаемому образу Форта. |
Автор: | fplab [ Вт окт 30, 2012 09:10 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
В журнале "Системный Администратор" www.samag.ru (март и апрель 2011) была опубликована статья "Стек: скрытые таланты и возможности". Как раз о реализации стековой виртуальной машины на Java. Не совсем Форт, но смысл тот же |
Автор: | VoidVolker [ Вт окт 30, 2012 09:32 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
Тут еще одна сложность в поддержке железа разных устройств. Ибо производителей куча, платформ тоже немеряно и везде все может быть по-разному. А ввиду популярности андроида, есть еще и планшеты, смартфоны и прочее. Вот например есть gforth для андроида — вроед системя известная и развитая, а толком и не работает там. Чтобы написать Сфой Форт — им надо пользоваться постоянно. А если в форте новчек, то это, ИМХО, пустая трата времени. Ибо написаться-то оно напишется, а вот будет ли использоваться? atomkraft писал(а): Банально не знаю с какой стороны подойти, с чего начать. С программирования на форте. Ведь Свой Форт пишется в первую очередь для себя. |
Автор: | atomkraft [ Вт окт 30, 2012 21:00 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
Хищник писал(а): Теперь можно попробовать написать простейший интерпретатор. Для начала переданная строка, пока пусть из одного слова, вызовет соответствующее слово форт-машины из описанного класса. Полезно также сделать минимальную визуализацию состояния - например, вывести содержимое стека и памяти. Когда писал этот класс в голове крутилась такая идея. Написать виртуальную машину поддерживающую небольшой набор команд. С помощью этих команд реализовать примитивные слова Форта, которые обычно пишутся на языке низкого уровня. А далее использовать полученные слова и уже из них строить высокоуровневый код на Форте остальных слов. Этот момент меня и подкосил, какой-то самокомпилятор получается, а меня всегда этот термин пугал Или это на самом деле не сложно и этот подход широко используется? mOleg писал(а): Ну и еще можно посмотреть на уже реализованные форты (на яве). Смотрел исходники Retro-Forth'a, но как понял весь смак зарыт в файле retroImage. А в нем разобраться это невыполнимая задача, так как там последовательность команд виртуальной машины на 28кб. В frt-sci, sfi более-менее понятно как все устроено. Но теперь кончено мучает вопрос пытаться развить мысль выше или просто оформить все необходимые слова одним case'ом. В первом подходе вижу следующие плюсы - более удобное расширение базового набора словаря. Например, действие слова IF реализованого на самом Форте - это одна-две строчки. Во втором же относительная простота устройства интерпретатора, но добавление новых слов менее удобно. Например те же действия слова IF в sfi у меня не вмещаются в экран. fplab, спасибо за ссылку! Обязательно почитаю. |
Автор: | Hishnik [ Вт окт 30, 2012 21:14 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
atomkraft писал(а): Когда писал этот класс в голове крутилась такая идея. Написать виртуальную машину поддерживающую небольшой набор команд. С помощью этих команд реализовать примитивные слова Форта, которые обычно пишутся на языке низкого уровня. А далее использовать полученные слова и уже из них строить высокоуровневый код на Форте остальных слов. Этот момент меня и подкосил, какой-то самокомпилятор получается, а меня всегда этот термин пугал Или это на самом деле не сложно и этот подход широко используется? В принципе, не так уж и сложно. Причем продолжать на том же языке или уже переходить к Форту, решать лучше самостоятельно, ориентируясь в первую очередь на собственное удобство и ощущение правильности, а не на какие-то догмы. Тут работают простота выражения (что-то проще дописать на Форте, а что-то на Java) и эффективность (скорость, размер) получаемого кода. Опять же, эффективность не является самоцелью, где-то может оказаться, что 1% кода напрочь остановил всю разработку, потому что какое-то вспомогательное слово хочется обязательно переписать на Форте (оставить на Java), а оно никак. Я тут склоняюсь к запуску уже хотя бы какой-то работающей версии и принятию дальнейших решений на основе работы с ней. |
Автор: | vikt [ Ср окт 31, 2012 12:32 ] |
Заголовок сообщения: | Re: Пытаюсь разработать Форт-систему для мобильного телефона |
Использую форт на мобильнике, с целью иметь возможность навесить функционал на уже установленное приложение. Заодно неплохой и полезный способ занять время. Первое и наиболее полезное, небольшая электронная таблица, в ячейки которой можно записать форт-скрипт, наподобие ява скрипт в браузере. Второе навигационная програмка, ранее была полезна, сейчас временно заброшена. Крайне полезно сразу сделать возможность загрузку форт текстов через веб, если загрузить можно хоть с narod.ru, то для выгрузки проще сделать свой веб сайт с cgi, написать простейший скрипт на perl или php. Я пользуюсь бесплатным хостингом http://www.holm.ru/faq.shtml Я мог бы выложить тексты, но из-за бесчисленных правок они крайне изуродованны и запутанны. К тому же в них нет ничего выдающегося, махровая любительщина, но сами программы для меня крайне полезны. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |