aForth - кросплатформенный FORTH-подобный язык.
Moderator: Shaos
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
aForth - кросплатформенный FORTH-подобный язык.
ДЛЯ ЧЕГО ОНО:
На 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
Всё довольно сумбурно, но если кого заинтересует в свете применения - пишите предложения.
ЗЫ
Для коммерческого использования (а вдруг кому интересно?) свяжитесь со мной! Для некоммерческого - пользуйтесь так наздоровье.
На 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
Всё довольно сумбурно, но если кого заинтересует в свете применения - пишите предложения.
ЗЫ
Для коммерческого использования (а вдруг кому интересно?) свяжитесь со мной! Для некоммерческого - пользуйтесь так наздоровье.
-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Оно не "свой язык". Оно - легко модифицируемый язык. Сейчас бы доку осилить по тому как новые словари-слова добавлять.Shaos wrote:А я думал было куда это SfS пропал на полгода, а он оказывается писал свой язык! SfS, ТЫ - МОНСТР!
ЗЫ. В выложенной версии нет нескольких вещей, что ещё в работе. А именно:
- Слова makeword, которое позволяет синтезировать из строки слова и таким образом программе позволяет писать саму себя.
- Нет работы с файлами, но это потому что в ARMOS оно ещё нормально не сделано, потому я для ПЦ и не напрягался особенно.
- Поддержки загрузки сжатых модулей словом includez. Я тут утилиту сделал - текст жмёт весьма неплохо. Фича в том, чтобы словари хранить в виде скомпрессованного файла и при загрузке налету его декомпрессовать.
- Ну и слова, работающие с многозадачностю.
Кстати, думаю данная разработка будет весьма интересна людям, что роботов на SAM7 делают. Связка - самое то. С одной стороны операционка-многозадачка. Таймеры-шмаймеры. С другой - верх, который рвботает быстро (виртуальный код) и в то же время хорошо мониторится.
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Во! Доделал поддержку самогенерации программы и сделал краткое описание с примерами.
Так что, кому интересно - тестируйте и пишите чего не хватает.
В планах доделать:
- побитовые операции
- словарь математических слов (синусы-косинусы-логарифмы)
- преобразования (строка-число, число-строка и проч)
- сервисные функции (проверка - есть ли такое слово в словаре, тип значения на стеке и проч).
- работа с файлами (открыть записать-прочитать-закрыть-позиционировать)
- работа со строками (поиск подстрок, расчленение строк и т.п.)
Чего ещё надо ?
Тут лежит описание с примерами:
http://www.nedopc.org/nedopc/upload/afo ... .1.tar.bz2
А тут - исходники всего (в том числе и документации):
http://www.nedopc.org/nedopc/upload/afo ... .1.tar.bz2
Жду, блин!
Так что, кому интересно - тестируйте и пишите чего не хватает.
В планах доделать:
- побитовые операции
- словарь математических слов (синусы-косинусы-логарифмы)
- преобразования (строка-число, число-строка и проч)
- сервисные функции (проверка - есть ли такое слово в словаре, тип значения на стеке и проч).
- работа с файлами (открыть записать-прочитать-закрыть-позиционировать)
- работа со строками (поиск подстрок, расчленение строк и т.п.)
Чего ещё надо ?
Тут лежит описание с примерами:
http://www.nedopc.org/nedopc/upload/afo ... .1.tar.bz2
А тут - исходники всего (в том числе и документации):
http://www.nedopc.org/nedopc/upload/afo ... .1.tar.bz2
Жду, блин!
-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Не очень понимаю о чём ты.cr0acker wrote:В теории контроль размерности переменных? типа [2-10], аля ада, модула-3. Контейнеры с процессами?
Размер любой переменной или массива можно получить вызовом слова size.
Например:
100 array A
A size . "\n" .
напечатает размер массива А - 100 (байт).
0 variable I
I size . "\n" .
напечатает размер переменной I - 4 (байт для 32хбитной машины).
Сейчас планирую ввести функцию, возвращающую ТИП значения на вершине стека (целое, вещественное, строка).
-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Можно то можно. Только не видно пока нафига оно надо.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

-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
Ну нужно дляя больших приложений в основном, а в ембедерстве дофига применений. Есть скажем некая переферия и ты знаешь, что у нею на выходе, и задаешь размерность, и если данные не влизают в размерность значит твой косяки где то, либо переферия не работает или в поинтер указвающий на данные уехал, короче в больших языках такая проверка стандартная вещь. Плюс прикольно было бы иметь слова-процессы и иниструменты взаимодейтсвия с ними.SfS wrote:Можно то можно. Только не видно пока нафига оно надо.cr0acker wrote:Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных
Контроль ? Сомнительная штука. С помощью условий можно и не сложнее и гибче.
Учитывая польскую послдовательность да.Страшный язык ?

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
Отечественный язык подобный Форту - http://www.forth.org.ru/~dssp/SfS wrote:Нет. А чего это такое ?Mac Buster wrote: P.S. Про ДССП не слышал ?
Extreme Entertainment
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Вот полная проверка размерности входного значения. Кстати, написано так, чтобы понятно было. Контролирует любое целое на стеке в любом диапазоне. Конечно, вывод сообщений можно поменять на процедуры обхода ошибок.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:Учитывая польскую послдовательность да.

ЗЫ Я не против проверок, но я думаю, что надо будет ввести отдельные слова - которые поддерживают контроль значений. Так чтобы либо обращение к памяти с контролем, либо нет. И эти слова могут быть написаны на самом языке.
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Порылся в инете - нашёл. Вообщето насколько я знаю - фортоподобных языков - тьма.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разрядами - весьма неплохо!
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Пока перерыв добавил тип слов - символы. Они полностью аналогичны целым числам. Доработал ещё операцию сложения строки и символов-целых.
Теперь можно написать:
'A' . ( Напечатает код символа 'A'- 65 )
'A' .С ( Напечатает символ 'A' )
'A' " Строка" + . ( Напечатает "A Строка")
65 " Строка" + . ( Напечатает "A Строка")
"Строка " 'A' +. ( Напечатает "Строка A")
"Строка " 65 +. ( Напечатает "Строка A")
Плюс добавил работу с файлами
open - открыть файл
close - закрыть файл
creat - создать или усечь файл
getchar - считать символ из файла
putchar - записать символ в файл
Теперь можно написать:
'A' . ( Напечатает код символа 'A'- 65 )
'A' .С ( Напечатает символ 'A' )
'A' " Строка" + . ( Напечатает "A Строка")
65 " Строка" + . ( Напечатает "A Строка")
"Строка " 'A' +. ( Напечатает "Строка A")
"Строка " 65 +. ( Напечатает "Строка A")
Плюс добавил работу с файлами
open - открыть файл
close - закрыть файл
creat - создать или усечь файл
getchar - считать символ из файла
putchar - записать символ в файл