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