nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 22:40



Reply to topic  [ 38 posts ]  Go to page 1, 2, 3  Next
aForth - кросплатформенный FORTH-подобный язык. 
Author Message
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
ДЛЯ ЧЕГО ОНО:

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

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

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

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

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

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

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

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

http://www.nedopc.org/nedopc/upload/afort-cl.1-adoc.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

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

ЗЫ
Для коммерческого использования (а вдруг кому интересно?) свяжитесь со мной! Для некоммерческого - пользуйтесь так наздоровье.


21 Jul 2008 10:07
Profile
Retired

Joined: 03 Aug 2003 22:37
Posts: 1474
Location: Moscow
Reply with quote
Post 
Ничего себе, просто нет слов!

P.S. Про ДССП не слышал ?

_________________
Extreme Entertainment


21 Jul 2008 12:41
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22414
Location: Silicon Valley
Reply with quote
Post 
А я думал было куда это SfS пропал на полгода, а он оказывается писал свой язык! SfS, ТЫ - МОНСТР! :kruto:

_________________
:dj: https://mastodon.social/@Shaos


21 Jul 2008 14:21
Profile WWW
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Mac Buster wrote:
P.S. Про ДССП не слышал ?


Нет. А чего это такое ?


21 Jul 2008 16:56
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Shaos wrote:
А я думал было куда это SfS пропал на полгода, а он оказывается писал свой язык! SfS, ТЫ - МОНСТР! :kruto:


Оно не "свой язык". Оно - легко модифицируемый язык. Сейчас бы доку осилить по тому как новые словари-слова добавлять.

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

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

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

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

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

Кстати, думаю данная разработка будет весьма интересна людям, что роботов на SAM7 делают. Связка - самое то. С одной стороны операционка-многозадачка. Таймеры-шмаймеры. С другой - верх, который рвботает быстро (виртуальный код) и в то же время хорошо мониторится.


21 Jul 2008 17:06
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Во! Доделал поддержку самогенерации программы и сделал краткое описание с примерами.

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

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

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

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

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

Жду, блин!


22 Jul 2008 06:03
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
В теории контроль размерности переменных? типа [2-10], аля ада, модула-3. Контейнеры с процессами?

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


22 Jul 2008 07:19
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
cr0acker wrote:
В теории контроль размерности переменных? типа [2-10], аля ада, модула-3. Контейнеры с процессами?


Не очень понимаю о чём ты.
Размер любой переменной или массива можно получить вызовом слова size.

Например:

100 array A
A size . "\n" .

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

0 variable I
I size . "\n" .

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

Сейчас планирую ввести функцию, возвращающую ТИП значения на вершине стека (целое, вещественное, строка).


22 Jul 2008 07:28
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


22 Jul 2008 08:00
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
cr0acker wrote:
Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных


Можно то можно. Только не видно пока нафига оно надо.
Контроль ? Сомнительная штука. С помощью условий можно и не сложнее и гибче.

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

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

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

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

"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


22 Jul 2008 09:21
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
SfS wrote:
cr0acker wrote:
Нет не так: типа ввести паскалевский range. Т.е.задавать возможных принимаемых значений
типа integer range 2..20 для всех типов и массивов и делать проверку во время выполнения кода. Причем нужно иметь возможность что бы задавать размерность переменоо от другиъ переменных


Можно то можно. Только не видно пока нафига оно надо.
Контроль ? Сомнительная штука. С помощью условий можно и не сложнее и гибче.


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

Quote:
Страшный язык ? :P

Учитывая польскую послдовательность да.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


22 Jul 2008 11:39
Profile
Retired

Joined: 03 Aug 2003 22:37
Posts: 1474
Location: Moscow
Reply with quote
Post 
SfS wrote:
Mac Buster wrote:
P.S. Про ДССП не слышал ?


Нет. А чего это такое ?


Отечественный язык подобный Форту - http://www.forth.org.ru/~dssp/

_________________
Extreme Entertainment


22 Jul 2008 13:28
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
cr0acker wrote:
Ну нужно дляя больших приложений в основном, а в ембедерстве дофига применений. Есть скажем некая переферия и ты знаешь, что у нею на выходе, и задаешь размерность, и если данные не влизают в размерность значит твой косяки где то, либо переферия не работает или в поинтер указвающий на данные уехал, короче в больших языках такая проверка стандартная вещь. Плюс прикольно было бы иметь слова-процессы и иниструменты взаимодейтсвия с ними.


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

"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:
Учитывая польскую послдовательность да.


После дня работы с ней - она уже логична и понятна. И кому нафиг нужны эти скобки и приоритеты ? :)))

ЗЫ Я не против проверок, но я думаю, что надо будет ввести отдельные слова - которые поддерживают контроль значений. Так чтобы либо обращение к памяти с контролем, либо нет. И эти слова могут быть написаны на самом языке.


22 Jul 2008 17:45
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
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разрядами - весьма неплохо!


22 Jul 2008 17:54
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Пока перерыв добавил тип слов - символы. Они полностью аналогичны целым числам. Доработал ещё операцию сложения строки и символов-целых.
Теперь можно написать:
'A' . ( Напечатает код символа 'A'- 65 )
'A' .С ( Напечатает символ 'A' )
'A' " Строка" + . ( Напечатает "A Строка")
65 " Строка" + . ( Напечатает "A Строка")
"Строка " 'A' +. ( Напечатает "Строка A")
"Строка " 65 +. ( Напечатает "Строка A")

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


22 Jul 2008 23:02
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 38 posts ]  Go to page 1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 21 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.