aForth - кросплатформенный FORTH-подобный язык.

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

aForth - кросплатформенный FORTH-подобный язык.

Post by SfS »

ДЛЯ ЧЕГО ОНО:

На AT91SAM7S256 + флешка работает небольшая операционка (я про неё в теме про АРМ писал). И чтобы была возможность её полегче программировать - захотелось интерпретируемого языка, да побыстрее.

Язык ФОРТ (как есть) - не понравился. Слижком уж ассемблер напоминает. Но принципы - весьма занятные.

Потому был написан aForth. Он фортподобен, но НЕ ФОРТ.

Что там от ФОРТА:
- все слова разделяются пробелами.
- обратная польская запись выражений.
- компиляция "на лету".
- виртуальная форт-машина.

Что там своего:
по языку:
- типизация (целые, вещественные, строки).
- возможность иметь тип - массив байт.
- адреса памяти преравнены к целым.
- сравнение в соответствии с типом (например можно сравнить две строки - поёмёт).

по виртуальной машине:
- абсолютная модульность - дописать новое слово можно очень быстро.
- словари можно подключать-отключать при компиляции очень просто - добавляя-удаляя их из списка соловарей.
- автогенерация документации по словорям.

В данный момент всё это заточено как под PC (этот вариант я выкладываю сюда), так и под NedoPC-ARMOS. Для NedoPC-ARMOS сейчас идёт работа над нормальной файловой системой во флешке. Как закончу - будет полностью полноценная система - многозадачный низ (для его поддержки допишу слова в aForth) и форт-подобный верх с возможностью выгрузки словарей во флешь. Фактически - полноценный микрокомпьютер на AT91SAM7S.

Исходные тексты:

http://www.nedopc.org/nedopc/upload/afo ... oc.tar.bz2

В подкаталоге forth - после компиляции появится символическая ссылка на компилятор aforth.
Файлы с расширением .af - программы на aForth.
Можно посмотреть, пособирать, самому пописать.

Для компиляции самого языка - набрать make.
Для компиляции документации по словам - набрать make doc.

Собирается всё это компилятором gcc под линукс.

На всякий случай - дока по словам:

http://www.nedopc.org/nedopc/upload/aFort-dicts.pdf
http://www.nedopc.org/nedopc/upload/aFort-dicts.dvi

Всё довольно сумбурно, но если кого заинтересует в свете применения - пишите предложения.

ЗЫ
Для коммерческого использования (а вдруг кому интересно?) свяжитесь со мной! Для некоммерческого - пользуйтесь так наздоровье.
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Ничего себе, просто нет слов!

P.S. Про ДССП не слышал ?
Extreme Entertainment
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А я думал было куда это SfS пропал на полгода, а он оказывается писал свой язык! SfS, ТЫ - МОНСТР! :kruto:
Я тут за главного - если что шлите мыло на me собака shaos точка net
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Mac Buster wrote: P.S. Про ДССП не слышал ?
Нет. А чего это такое ?
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaos wrote:А я думал было куда это SfS пропал на полгода, а он оказывается писал свой язык! SfS, ТЫ - МОНСТР! :kruto:
Оно не "свой язык". Оно - легко модифицируемый язык. Сейчас бы доку осилить по тому как новые словари-слова добавлять.

ЗЫ. В выложенной версии нет нескольких вещей, что ещё в работе. А именно:

- Слова makeword, которое позволяет синтезировать из строки слова и таким образом программе позволяет писать саму себя.

- Нет работы с файлами, но это потому что в ARMOS оно ещё нормально не сделано, потому я для ПЦ и не напрягался особенно.

- Поддержки загрузки сжатых модулей словом includez. Я тут утилиту сделал - текст жмёт весьма неплохо. Фича в том, чтобы словари хранить в виде скомпрессованного файла и при загрузке налету его декомпрессовать.

- Ну и слова, работающие с многозадачностю.

Кстати, думаю данная разработка будет весьма интересна людям, что роботов на SAM7 делают. Связка - самое то. С одной стороны операционка-многозадачка. Таймеры-шмаймеры. С другой - верх, который рвботает быстро (виртуальный код) и в то же время хорошо мониторится.
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Во! Доделал поддержку самогенерации программы и сделал краткое описание с примерами.

Так что, кому интересно - тестируйте и пишите чего не хватает.

В планах доделать:
- побитовые операции
- словарь математических слов (синусы-косинусы-логарифмы)
- преобразования (строка-число, число-строка и проч)
- сервисные функции (проверка - есть ли такое слово в словаре, тип значения на стеке и проч).
- работа с файлами (открыть записать-прочитать-закрыть-позиционировать)
- работа со строками (поиск подстрок, расчленение строк и т.п.)

Чего ещё надо ?

Тут лежит описание с примерами:
http://www.nedopc.org/nedopc/upload/afo ... .1.tar.bz2

А тут - исходники всего (в том числе и документации):
http://www.nedopc.org/nedopc/upload/afo ... .1.tar.bz2

Жду, блин!
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

В теории контроль размерности переменных? типа [2-10], аля ада, модула-3. Контейнеры с процессами?
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

cr0acker wrote:В теории контроль размерности переменных? типа [2-10], аля ада, модула-3. Контейнеры с процессами?
Не очень понимаю о чём ты.
Размер любой переменной или массива можно получить вызовом слова size.

Например:

100 array A
A size . "\n" .

напечатает размер массива А - 100 (байт).

0 variable I
I size . "\n" .

напечатает размер переменной I - 4 (байт для 32хбитной машины).

Сейчас планирую ввести функцию, возвращающую ТИП значения на вершине стека (целое, вещественное, строка).
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

cr0acker wrote:Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных
Можно то можно. Только не видно пока нафига оно надо.
Контроль ? Сомнительная штука. С помощью условий можно и не сложнее и гибче.

Я пока элементарную функциональность добавляю. А то язык сам в себе без файла-шмайла както не смотрится.

Вот пока вечер - суть да дело - добавил следующие слова:
- Битовые операции - or, xor, and, not, lshift, rshift. (сдвиги в общем)
- Логические - lor, land, lnot.
- работу с файлами - open, close, getchar.

Это позволило написать программу, считывающую и печатающую свой исходник:

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 ;

( Открываем файл )
"./forth.af" dbgopen

( Печатаем его )
dbgfprint

( Закрываем файл )
dbgclose
Страшный язык ? :P
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

SfS wrote:
cr0acker wrote:Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных
Можно то можно. Только не видно пока нафига оно надо.
Контроль ? Сомнительная штука. С помощью условий можно и не сложнее и гибче.
Ну нужно дляя больших приложений в основном, а в ембедерстве дофига применений. Есть скажем некая переферия и ты знаешь, что у нею на выходе, и задаешь размерность, и если данные не влизают в размерность значит твой косяки где то, либо переферия не работает или в поинтер указвающий на данные уехал, короче в больших языках такая проверка стандартная вещь. Плюс прикольно было бы иметь слова-процессы и иниструменты взаимодейтсвия с ними.
Страшный язык ? :P
Учитывая польскую послдовательность да.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

SfS wrote:
Mac Buster wrote: P.S. Про ДССП не слышал ?
Нет. А чего это такое ?
Отечественный язык подобный Форту - http://www.forth.org.ru/~dssp/
Extreme Entertainment
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

cr0acker wrote: Ну нужно дляя больших приложений в основном, а в ембедерстве дофига применений. Есть скажем некая переферия и ты знаешь, что у нею на выходе, и задаешь размерность, и если данные не влизают в размерность значит твой косяки где то, либо переферия не работает или в поинтер указвающий на данные уехал, короче в больших языках такая проверка стандартная вещь. Плюс прикольно было бы иметь слова-процессы и иниструменты взаимодейтсвия с ними.
Вот полная проверка размерности входного значения. Кстати, написано так, чтобы понятно было. Контролирует любое целое на стеке в любом диапазоне. Конечно, вывод сообщений можно поменять на процедуры обхода ошибок.

Code: Select all

( Печать текстового файла )

"dict.af" include

(
    Контроль значения на стеке
    <зачение> <минимум> <максимум>
)

: range
    ( Вывод всех значений )
    " Диапазон [" . over . ".." . dup . "]; значение : " . 2 nover . "> " .
    ( Проверки )
    2 nover
    2 nover
    <
    if
        "Значение меньше минимума" . CR
        drop drop drop
    else
        2 nover
        <
        if
            "Значение больше максимума" . CR
        else
            "Значение входит в диапазон" . CR
        endif
        drop drop
    endif
;

( Контроль значения на вхождение в диапазон от 5 до 10 )

: range_5_10 5 10 range ;

3  range_5_10
7  range_5_10
12 range_5_10
cr0acker wrote:Учитывая польскую послдовательность да.
После дня работы с ней - она уже логична и понятна. И кому нафиг нужны эти скобки и приоритеты ? :)))

ЗЫ Я не против проверок, но я думаю, что надо будет ввести отдельные слова - которые поддерживают контроль значений. Так чтобы либо обращение к памяти с контролем, либо нет. И эти слова могут быть написаны на самом языке.
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Mac Buster wrote: Отечественный язык подобный Форту - http://www.forth.org.ru/~dssp/
Порылся в инете - нашёл. Вообщето насколько я знаю - фортоподобных языков - тьма.

У меня идея - сделать возможность запускать на SAM7 несколько aForth-машин, с возможностью обмена сообщениями и сигналами.

Таким образом получаем многозадачную aForth-систему. Я ещё не выяснял - сколько ОЗУ одна машина занимает, но на SAM7 - запускал, работает.
Рассчёт по памяти - около 2Кбайт на стандартный словарь+ сопутствующие буфера. Ну ещё 2К на стек - тоже хватит. Прикидочно - 4Кбайт ОЗУ на одну форт-машину с небольшим пользовательским словарём.

В принципе - в SAM7 64К ОЗУ. Должно хватить для 8 aForth-машин за глаза даже без мудрстований.
Ну килобайта 4 гдето ОЗУ ARMOS жрать будет.

8задачная система на одном кристалле с 50МГЦ тактовой и 32разрядами - весьма неплохо!
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Пока перерыв добавил тип слов - символы. Они полностью аналогичны целым числам. Доработал ещё операцию сложения строки и символов-целых.
Теперь можно написать:
'A' . ( Напечатает код символа 'A'- 65 )
'A' .С ( Напечатает символ 'A' )
'A' " Строка" + . ( Напечатает "A Строка")
65 " Строка" + . ( Напечатает "A Строка")
"Строка " 'A' +. ( Напечатает "Строка A")
"Строка " 65 +. ( Напечатает "Строка A")

Плюс добавил работу с файлами
open - открыть файл
close - закрыть файл
creat - создать или усечь файл
getchar - считать символ из файла
putchar - записать символ в файл