aForth - кросплатформенный FORTH-подобный язык.
Moderator: Shaos
- 
				cr0acker
														 - God
 - Posts: 1078
 - Joined: 03 Feb 2003 13:53
 
На самом деле, многозадочной форт машину можно сделать ввести слова типа fork, open, read, write,close, kill. Т.е. сначала фот машина форкает сама себя, создается вторая с таким же загруженным словарем и программой, затем вторая мишания окрывает новый словарь и программу, читает и исполняет до тех порт пока что не сделал и не получила сигнал kill, вообще такая машина на пропеллере бы пошла, классно.
ЗЫ: Кстати умные мысли не приходя только в одну голову http://www.jacobsdesign.com.au/software ... dforth.php
			
			
									
						
							ЗЫ: Кстати умные мысли не приходя только в одну голову http://www.jacobsdesign.com.au/software ... dforth.php

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
Оно так и замышляется. Только наверное для запуска будет два слова - fork и spawn (spawn - будет создавать "чистую" форт-машину и выполнять на ней новый файл. Типа execa).cr0acker wrote:На самом деле, многозадочной форт машину можно сделать ввести слова типа fork, open, read, write,close, kill.
Кроме того хочу предусмотреть ещё два слова - sendmsg и recvmsg - для обмена сообщениями между aForth-машинами.
Параллакс у меня живой есть. Но там - 8 ядер имеется. И прерываний нет. Вообще. Хитроархитектурная штука.
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
Примеры рабочих программ на aForth:
[/url]
			
			
									
						
										
						Code: Select all
: CR "\n" . ;           ( Возврат каретки )
(
    Перевод строки в 10е число
    str - входная строка
)
: atoi
    dup size    ( str size )
    malloc      ( str adr )
    swap over   ( adr str adr )
    setmstr     ( adr )
    dup         ( adr adr )
    0   swap    ( sum adr )
    begin
        dup getmchar    ( adr sum adr char )
        dup 0 =         ( adr sum adr char cond )
        if              ( adr sum adr char )
            drop drop swap      ( sum adr )
            free
            1
        else
            '0' -       ( adr sum adr digit )
            swap        ( adr sum digit adr )
            1 nswap     ( adr adr digit sum )
            10 * +      ( adr adr sum )
            swap 1 +    ( adr sum adr )
            0
        endif
    until
;
"1234567890" dup . CR
atoi . CR
Code: Select all
( Копирование файла. )
"dict.af" include
(
    dbgopen - Процедура, открывающая файл и возвращающаяя его дескриптор на стеке.
    Если файл не удалось открыть - на стек кладётся -1.
)
: dbgopen dup open dup 0< if "Ошибка при открытии файла: " . swap . CR else "Файл: " . swap . " открыт\n" . endif ;
(
    dbgcreat - Процедура, создающая файл и возвращающаяя его дескриптор на стеке.
    Если файл не удалось открыть - на стек кладётся -1.
)
: dbgcreat dup creat dup 0< if "Ошибка при открытии файла: " . swap . CR else "Файл: " . swap . " открыт\n" . endif ;
(
    dbgclose - закрывает файл и печатает результат. На стеке ничего не оставляет в отличие от close.
)
: dbgclose close 0<  if "Ошибка при закрытии файла\n" . else "Файл закрыт\n" . endif ;
(
    Копирование файла.
        s - дескриптор источника
        d - дескриптор приёмника
        c - символ или код возврата
    Вызов:
        <s> <d> fcopy
)
: fcopy
                        ( Состояния стека )
                        ( s d )
    begin
        over over swap  ( s d  d s )
        getchar         ( s d  d c )
        ( Проверка на конец файла )
        dup 0< if       ( s d  d c )
            drop drop   ( s d )
            1           ( s d 1         1-выход из цикла для until )
        else
            putchar     ( s d )
            0< if       ( s d )
                "Ошибка записи файла"
            else
                0       ( s d 0         0-повтор цикла для until )
            endif
        endif
    until
                        ( s d )
;
( Открываем файл )
"./forth.af" dbgopen
"./forth-copy.af" dbgcreat
( Копируем файл )
fcopy
( Закрываем файл )
dbgclose
dbgclose
Code: Select all
( Печать текстового файла )
"dict.af" include
(
    dbgopen - Процедура, открывающая файл и возвращающаяя его дескриптор на стеке.
    Если файл не удалось открыть - на стек кладётся -1.
)
: dbgopen dup open dup 0< if "Ошибка при открытии файла: " . swap . CR else "Файл: " . swap . " открыт\n" . endif ;
(
    dbgclose - закрывает файл и печатает результат. На стеке ничего не оставляет в отличие от close.
)
: dbgclose close 0<  if "Ошибка при закрытии файла\n" . else "Файл закрыт\n" . endif ;
(
    Печать файла, дескриптор которого на стеке.
    После печати - дескриптор остаётся на стеке
)
: dbgfprint begin dup getchar dup 0< if drop 1 else .C 0 endif until ;
( Открываем файл )
"./dumpfile.af" dbgopen
( Печатаем его )
dbgfprint
( Закрываем файл )
dbgclose
Code: Select all
: CR "\n" . ;           ( Возврат каретки )
: XPFX "0x" . ;         ( Печатает 0x )
: SPACE " " . ;         ( Печать пробела )
: TAB   "\t" . ;        ( Печать табуляции )
: SLASH "\\" . ;        ( Печать слэша )
( Печать всех символов от 32 до 255 )
: print-all-chars
    32
    ""
    begin
        over +
        swap 1 +
        dup 255 >
        if
            drop
            1
        else
            swap
            over
            0x0F and lnot if '\n' + endif
            0
        endif
    until
    . CR
;
print-all-chars
- 
				cr0acker
														 - God
 - Posts: 1078
 - Joined: 03 Feb 2003 13:53
 
Кстати это всё хорошо, но неплохо было бы, заиметь схему, разводку платы афорт машины? Кстати благодаря своей польской последовательсности афорт может выступать в роли баша для армос:) Ещё не плохо было бы добавить слово(если не пропустил) запуска произвольного бинарного кода:) И тогда получается что армос будет выступать своего рода микроядром, я форт машины интерфесом более высокого уровня:) Одна форт машина может обслжывать переферию,другая работать с файлами, третья запускать приложени, а из армос эти функции можно убрать, она будет только передавать сообщения 
 Десятая или 20ая форт машина может выступать даже в виде инерпритатора рв0 кода.
			
			
									
						
							
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
Разводку выложить не могу - отлаживаюсь не на своей плате и разводки нет.cr0acker wrote:Кстати это всё хорошо, но неплохо было бы, заиметь схему, разводку платы афорт машины? Кстати благодаря своей польской последовательсности афорт может выступать в роли баша для армос:) Ещё не плохо было бы добавить слово(если не пропустил) запуска произвольного бинарного кода:) И тогда получается что армос будет выступать своего рода микроядром, я форт машины интерфесом более высокого уровня:) Одна форт машина может обслжывать переферию,другая работать с файлами, третья запускать приложени, а из армос эти функции можно убрать, она будет только передавать сообщенияДесятая или 20ая форт машина может выступать даже в виде инерпритатора рв0 кода.
Но там AT91SAM7S256 + FLASH AT45DB081, подключенная по SPI размером 8 Мбайт.
Подключение - стандартное, обвязка проца - тоже (там обвязки то - кварц да кондёры). По этим данным платку сделать - раз плюнуть. Я просто первую попавшуюся платку взял и ковыряюсь. Ну и терминал - на порт DBGU цепляется.
Добавить слово "запустить любой машкод" - это не проблема. Но смысла немного в таком слове при программировании форт-машины и возможности записи-чтения в любую точку памяти (слова setm* getm*).
Сейчас хочу первым делом сделать нормальный ввод с терминала и слово save для выгрузки текущего состояния aForth-машины.
Плюс - приём-передача файла по протоколу TSA (он уже поддержан на PC и в NEDOPC-ARMOS).
Тогда получится самостоятельная aForth-система с выгрузкой состояния и возможностью автозагрузки.
Идея простая - при загрузке системы дать пользователю скажем 3 сек в течении которых он может нажать любую клавишу на терминале и вывалиться в интерактивную форт-машину.
Если же он не нажимал клавишь - подгружается файл, скажем init.af и выполняется в форт-машине.
Вообще на повестке дня (из задач, сложных для реализации):
- слова обработки ошибок. скажем система, если определено слово onerror будет очищать при ошибке стеки и выполнять его, поместив на стек код ошибки и прочие данные.
- Приём-передача сообщений между форт-машинами. Скажем при приёме сообщения выполняется слово onmsg, если оно определено и выполнение программы продолжается.
- fork() spawn() kill() - запуск-останов форт-машин.
А простых-мелких задач типа математики и обработки строк - вообще ещё тьма.
- 
				cr0acker
														 - God
 - Posts: 1078
 - Joined: 03 Feb 2003 13:53
 
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
- 
				cr0acker
														 - God
 - Posts: 1078
 - Joined: 03 Feb 2003 13:53
 
Как кусок памяти?SfS wrote:Сделал команду save, которая выгружает всё в текстовый файл.
Всё бы ничего - но не знаю пока как выгружать байтовые массивы array.
Остальное - на ура прокатывает.
Выгружаются все слова и переменные, НО НЕ СТЕК!.

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
Неа выгрузка производится в виде ИСХОДНОГО ТЕКСТА. Даже с форматированием для читабельности.cr0acker wrote:Как кусок памяти?
ПОка спал пришла мысль сделать возможность задавать константу-байтовый массив типа так:
{ 00 23 45 66 "Строка" 'A' 'Б' } array MASSIV
Тогда можно и в программе это задавать и выгружать.
Конечнно, если массив адреса содержит - то выгружать его бесполезно - но тут уж все сами думать должны. А для таблиц - милое дело.
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
В принципе моё поделко aForth могёт собраться на всём, на чём есть С.Shaos wrote:Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битногоcr0acker wrote:Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)
Все биты-флаги у меня вроде как в пределах 8 бит, все раззмеры - через sizeof().
Если и есть где пара узких разрядно-зависимых мест - можно и поправить. Только у меня сейчас 8- 16-битного железа нет, чтобы туда портировать и проверить.
- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
А у меня есть NedoPC-91, на который я периодически пытаюсь RW0-движок водрузитьSfS wrote:В принципе моё поделко aForth могёт собраться на всём, на чём есть С.Shaos wrote:Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битногоcr0acker wrote:Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)
Все биты-флаги у меня вроде как в пределах 8 бит, все раззмеры - через sizeof().
Если и есть где пара узких разрядно-зависимых мест - можно и поправить. Только у меня сейчас 8- 16-битного железа нет, чтобы туда портировать и проверить.
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
В принципе можно попробовать Портануть ARMOS на AVR. Я пока не вижу особых проблем. Разве что прошерстить на предмет правильности указания типов и разрядности.Shaos wrote:А у меня есть NedoPC-91, на который я периодически пытаюсь RW0-движок водрузить
Самый геморр - переписать драйвера под систему прерываний, UART и PIO для AVR - и будет 8/16 разрядная ОСЬКА.
И aForth - поверх неё.
Ограничения - надо AVR с внешним ОЗУ хотя бы на 32К и флешкой. Иначе ничего кроме "Hello world!" не запустишь толком.
В общем - я пока форт до ума доведу на SAM7. А там - может и к AVRу обращусь.
Сейчас на очереди поддержка массивов в виде констант для их загрузки-выгрузки. Это, пожалуй, последнее, что в язык надо для полноценности включить.
Ну и компрессия-декомпрессия при выгузке-загрузке "на лету". Очень оно память экономит.
- 
				SfS
 - Doomed
 - Posts: 491
 - Joined: 16 Apr 2005 22:35
 - Location: Томск
 
Доделал работу с массивами.
Теперь массив можно объявить так:
10 array A - массив размером 10 байт, забитый нулём
Пустой массив:
0 array A
{ } array A
Массив, заполненный значениями:
{
1 3 4 34 0x14 "Строка"
} array A
Массив из другого массива (копия):
{ A } array B
Целые числа в массиве интерпретируются поразному - по умолчанию - как целые. Но могут и как байты и как короткие целые:
{
byte 0x11 0x33 0x44
short 0x1234 0x2344
int 0x12345678 0x87654321
} array A
Выгружается массив всегда как массив байт.
			
			
									
						
										
						Теперь массив можно объявить так:
10 array A - массив размером 10 байт, забитый нулём
Пустой массив:
0 array A
{ } array A
Массив, заполненный значениями:
{
1 3 4 34 0x14 "Строка"
} array A
Массив из другого массива (копия):
{ A } array B
Целые числа в массиве интерпретируются поразному - по умолчанию - как целые. Но могут и как байты и как короткие целые:
{
byte 0x11 0x33 0x44
short 0x1234 0x2344
int 0x12345678 0x87654321
} array A
Выгружается массив всегда как массив байт.
				