Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт апр 23, 2024 19:00

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Вт окт 18, 2022 13:39 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
KPG писал(а):
но, думаю, у ТС этого Форт свои тараканы в голове. :)
Есть такое... Этого добра навалом :)
Hishnik писал(а):
А что бы на нем такого интересного сделать?
KPG писал(а):
Может, что то Форт - "эзотерическое"? :)
Как в знаменитом интервью: у меня была какая-то тактика, и я ее придерживался :)
Идея была сделать язык:
- простой в реализации до неприличия, чтобы можно было легко адаптировать под разные архитектуры;
- лаконичный, т.к. не люблю длинные простыни кода;
- самодостаточный, чтобы "из коробки" был пригоден для создания простых и не очень программ/прошивок;
По сути это некая "болванка", на базе которой штампуются трансляторы форт, не-совсем-форт и совсем-не-форт под всевозможные существующие и не очень архитектуры :) Несколько вариантов, которые "компилируют" сами себя под dos/win/linux... А потом на их базе кросс-трансляторы под разные микроконтроллеры, в т.ч. под свою поделку на verilog. Попадается мне в руки условный pic - переделываю под него транслятор и проверяю. Захотелось пощупать что-то доисторическое - делаю транслятор под chip8 или 6502 и щупаю в эмуляторе. При этом доработка напильником под любую новую архитектуру не вызывает вопросов: нужно лишь родить небольшое ядро слов на 20, а также, возможно, сделать несколько правок в основном теле транслятора. Если учесть, что общий вес исходников в районе 5K, то ничего удивительного...
Выхлоп чаще всего на asm, но есть и варианты с выводом сразу в hex, а также си, javascript и т.д. - на что фантазии хватит.
Есть одно- и несколькопроходные версии, 8/16/32/64-разрядные и даже с неопределенной разрядностью (версия под javascript) и т.д. и т.п.
Из коробки обычно умеет:
Код:
           uf                    forth
---------- --------------------  ---------------------------------
comment    \ \                   ( ... )   
include    % filename            S" filename" INCLUDED     
number     123 0xDEADBEEF 0b110  123 DEADBEEF 110 BASE DEC HEX BIN
char       'c'                   CHAR c
string     "string"              S" string"
identifier buffer GPIO           buffer GPIO
define     : ;                   : ... ;
variable   : [ ] alpha ;         VARIABLE alpha
array      : [ 256 ] buffer ;    CREATE buffer 256 CELLS ALLOT
math       + - * / < = > & | ^   + - * / < = > AND OR XOR
stack      # $ ? _               DUP SWAP PICK DROP
load/store @ ! , .               @ ! C@ C!
asm        ` `                   CODE ... END-CODE
if         { ~ }                 IF ... ELSE ... THEN
while      ( )                   BEGIN WHILE ... REPEAT
loop       [ ]                   DO ... -1 +LOOP

Такой вот аскетичный джентельменский набор, который тем не менее содержит некий необходимый минимум слов для работы. Скажу за себя - лично мне с таким набором работать достаточно комфортно.

А дальше могу, например, прикрутить сюда словарь и получить простенький форт.
Где-то добавляю инлайн-слова : inc `inc ax` ; inline или :: inc `inc ax` ;
Где-то таймеры : 100 ... ; и обработчики событий : "onmousemove" ... ;
Где-то синтаксис управляющих конструкций как в традиционном форте.
И т.д. и т.п., что хочу, то ворочу :)

Еще одной важной хотелкой было сделать язык "компилирующим" (в кавычках, т.к. выхлоп для простоты чаще все-таки на asm, а не в hex), чтобы охватить весь спектр микроконтроллеров и плат. Ведь есть микроконтроллеры, куда форт тупо не поместится. В другие поместится, но съедает слишком много флеш. Где-то нет возможности самоперешивания флеш, однократно программируемые контроллеры бывают опять же, а где-то нет возможности общаться с микроконтроллером через терминал. Во всех этих случая традиционный форт, увы, не годится. А моё поделие - без проблем :)

При этом я отошел от канонического форта не так уж сильно, как может показаться на первый взгляд. Взять ту же тестовую бродилку: она у меня без проблем кочует между абсолютно разными архитектурами, будь то win, javascript, dendy (nes) или мой процессор в плис. Но при этом легко могу перевести (практически дословно) на обычный форт и запустить хоть в своих самодельных фортах, хоть в Retro-40, хоть в хищном Ирбисе :) :) :)

А по поводу "чего бы интересного на нем сделать" могу так ответить: с некоторых пор, года 2, наверное, или больше практически все прошивки под микроконтроллеры пишу с использованием этого и близкородственных инструментов. Раньше были самодельные гораздо более традиционные форты с привычным синтаксисом и словарями, но потом зашел со стороны esoteric forth, упростив всё до неприличия, и мне понравилось :)



За это сообщение автора Total Vacuum поблагодарили - 2: Hishnik, zma
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Вт окт 18, 2022 15:23 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Total Vacuum писал(а):
Выхлоп чаще всего на asm, но есть и варианты с выводом сразу в hex, а также си, javascript и т.д. - на что фантазии хватит.

Бродилки с сайта https://js1k.com программ вмещающхся в 1Кб JS кода
тыц1 (по лабиринту)
тыц2
тыц3
тыц4 ( "бродилка" - 3D демо)
...
Tetris1
Tetris2
Tetris3

Arkanoid
Arkanoid2

P.S. Достаточно впечатляет, что можно изобразить и в 1Kб JS кода.
(чем то перекликается с идеей "форт"-мини-максимализма работ на сайте https://forthsalon.appspot.com/ )
но, похоже, исходники жмут для вставки на сайт для соблюдения 1Кб ограничения.
14 КБ это слишком много. Делаем сайты меньше 1 КБ

Total Vacuum писал(а):
Скажу за себя - лично мне с таким набором работать достаточно комфортно.

т.е. без слова OVER или оно не прижилось в личной практике использования Форт и предполагается его вводить через слово PICK?
А, как же
Код:
: BOUNDS OVER + SWAP ;


К слову, в своей практике словоупотребления, к примеру, обхожусь без слова NIP,
и думаю, что у каждого использующего Форт есть какой то свой такой бэкграунд использования/не_использования широко каких то слов присутствующих и в той или иной Форт-системе. :)


Последний раз редактировалось KPG Ср окт 19, 2022 04:41, всего редактировалось 7 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 19, 2022 02:35 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Total Vacuum писал(а):
хоть в хищном Ирбисе

Вот попробовать бы надо... :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 19, 2022 11:05 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Hishnik писал(а):
Total Vacuum писал(а):
хоть в хищном Ирбисе
Вот попробовать бы надо... :)
вот :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 19, 2022 11:48 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
KPG писал(а):
А, как же
Код:
: BOUNDS OVER + SWAP ;
:) А никак, у меня ж asciiz-строки, да и цикл со счетчиком устроен иначе. Я привел для краткости в качестве аналога DO ... -1 +LOOP, но такая аналогия будет не совсем точной. Точным аналогом моего цикла
Код:
123 [ ... ]
будет
Код:
123 DUP BEGIN WHILE 1- ... DUP REPEAT DROP
или
Код:
123 DUP IF 1- 0 SWAP DO I ... -1 +LOOP THEN
Т.е. цикл с автодекрементом до нуля, но значение счетчика цикла лежит в стеке данных.

KPG писал(а):
т.е. без слова OVER или оно не прижилось в личной практике использования Форт и предполагается его вводить через слово PICK?
А вот и нет, как раз OVER достаточно часто используется, а PICK - почти никогда. Попытаюсь объяснить, почему все-таки оставил PICK, а не OVER или что-то еще.
У этого форта ноги растут из esoteric forth. Когда распределял все одиночные неалфавитно-цифровые символы из нижней части ascii-таблицы, то какие-то (+ - < > : ; и т.д) в точности соответствуют словам традиционного форта, скобочки потратил на if и циклы, кавычки - на строки, символы и вставки и т.д. и т.п. В итоге для стековых манипуляций осталось лишь 4 свободных одиночных символа. И как раз на этом этапе были сомнения/метания, ведь нужных манипуляций со стеком больше. В итоге в числе избранных все же оказался PICK, т.к.:
- через него выводится : OVER 1 PICK ;
- в некоторых ситуациях 2 PICK может быть не прямым, но близким по смыслу аналогом ROT
- иногда - редко, но все-таки - надо достать из неведомых глубин стека какое-то число, тут без PICK никак
Кроме того, язык хоть и "компилирующий", но иногда используется в качестве интерпретатора, а в таком случае не всегда реализую ассемблерные вставки, чтобы не усложнять. А значит реализовать OVER на asm не удастся, и остается лишь вариант с 1 PICK. Получается, что ради большей гибкости пожертвовал скоростью работы OVER. Когда нужен быстрый OVER, делаю : over `код на asm` ; или :: over `код на asm` ; Если же устроит и медленный или нет возможности использовать вставки, делаю : over 1 ? ;
:) Более того, я и в системе команд своего процессора не пожалел места для pick, хотя там есть место всего лишь для 16 инструкций, каждая из которых на вес золота:
Код:
0 1 2 3 push0 jz call ret @ ! swap pick nand - mla 2/
Просто не смог придумать, как обойтись без pick. И, кстати, там даже dup выражается через push0 pick :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 26, 2022 02:43 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Total Vacuum писал(а):
), чтобы охватить весь спектр микроконтроллеров и плат. Ведь есть микроконтроллеры, куда форт тупо не поместится.

А, для этих МК используется ассемблер от производителя данных МК?
Для мелких, к примеру, AVR (PIC, 8051, STM8 ..) испытывался?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 26, 2022 11:32 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
KPG писал(а):
А, для этих МК используется ассемблер от производителя данных МК?
Да, чаще всего именно так, особенно на первом этапе. На этапе знакомства, так сказать. Иногда компилирую при помощи fasm, под него или готовую реализацию ассемблера для нужной архитектуры можно найти (например, под 6502) или же самому набросать на макросах (допустим, chip8). Если готового и вменяемого asm нет или есть свободное время, делаю ассемблер сам (например, под свой процессор).
KPG писал(а):
Для мелких, к примеру, AVR (PIC, 8051, STM8 ..) испытывался?
Из линейки microchip под горячую руку попадались atmega164 (если мне не изменяет склероз) - использовал "родной" avrasm2.exe, а также pic16f819 и pic18f1320 - собирал из под MPLAB IDE. stm8 пока не довелось пощупать, но не думаю, что там могут быть проблемы, т.к. он подозрительно похож на 6502. 8051 тоже пока не попадался, увы.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 26, 2022 12:36 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Total Vacuum писал(а):
Из линейки microchip под горячую руку попадались atmega164 (если мне не изменяет склероз) - использовал "родной" avrasm2.exe,

А,у меня был в изучении на самодельной плате сначала AT8515 в DIP40, потом его заменил на Atmega162 и запихнул под него amForth в урезанном варианте (пришлось, правда, немного с загрузчиком пободаться) и да использовался avrasm2.

P.S. PIC есть, но Форт на них не запускал. :)
из 8051- CY68013a на популярной плате логического анализатора на этой микросхеме.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Ср окт 26, 2022 17:02 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
KPG писал(а):
P.S. PIC есть, но Форт на них не запускал. :)
:) Да PIC вообще восхитителен! Будете смеяться, но pic16f819 в dip-корпусе проверял вообще без платы: взял пару плоских шлейфов от логического анализатора, воткнул туда микроконтроллер и светодиод, а на другом конце подключил к PIC-KIT3. В итоге и шьется и мигает, как положено. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Вс окт 30, 2022 17:06 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Чем то похож на uf \ micro forth \ :)
STABLE an extreme small an fast FORTH-VM

Словарик
Цитата:
arithmetic
+ ( a b--a+b) addition
- ( a b--a-b) subtraction
* ( a b--a*b) multiply
/ ( a b--a/b) division
% ( a b--a%b) modulo (division reminder)
_ ( n-- -n) negate

bit manipulation
& ( a b--a&b) 32 bits and
| ( a b--a|b) 32 bits or
~ ( n -- n') not, all bits inversed (0=>1 1=>0)

stack
# ( a--a a) duplicate top of stack
\ ( a b--a) drop top of stack
$ ( a b--b a) swap top of stack
@ ( a b--a b a) (over) copy next of stack on top

register
x ( --) select register x (x: a..z)
; ( --value) fetch from selected register
: ( value--) store into selected register
? ( --value) selected register contains an address. Fetch value from there
! ( value--) selected register contains an address. Store value there.
+ ( --) immediately after register, increment content by 1
- ( --) immediately after register, decrement content by 1

functions
{X ( --) start function definition for function X (A..Z)
} ( --) end of function definition
X ( --) call function X (A..Z)

I/O
. ( value--) display value as decimal number on stdout
, ( value--) send value to terminal, 27 is ESC, 10 is newline, etc.
^ ( --key) read key from terminal, don't wait for newline.
" ( --) read string until next " put it on stdout
0..9 ( --value) scan decimal number until non digit. to push two values
on stack separete those by space (4711 3333)
to enter negative numbers call _ (negate) after the number
0..9.0 ( --value) to enter float numbers digits must contain one . (only
available if float module is active, see 0`)

conditions
< ( a b--f) true (-1) if b is < a, false (0) otherwise
> ( a b--f) true (-1) if b is > a, false (0) otherwise
= ( a b--f) true (-1) if a is queal to b, flase (0) otherwise
( ( f--) if f is true, execute content until ), if false
skip code until )
[ ( f--f) begin while loop only if f is true. keep flag on stack
if f is false, skip code until ]
] ( f--) repeat the loop if f is true. If f is false, continue
with code after ]

extensions (expermiental)
` ( n--) call extension function n
0 ... switch to floating point mode
+ - * / . _ < >

1 ... switch back to interger mode
2 ... dbg, function dbg() to set breakpoint for debugging
3 ... switch traceing on (IP, TOKEN, SP, STACK) (not in stable_fast)
4 ... switch traceing off. Tracing int file trace
5 ... < = > without dropping their 2nd operand (NOS). This
is the behavior of Santors original virtual engine.
6 ... mstime, time in milliseconds, for timing
7 ... ( n--) edit block number n
8 ... ( n--) load block number n. Data segment remains. So this
is a kind of shared memory. Registers could be used as arguments.
After leaving the application and 0 is on TOS, STABLE will be
terminated. A value not equal 0 on TOS will load this block.
If the block is not valid, the command block will be loaded
Use block 0 as an index for all your block numbers
9 ... ( n 9--) copy block n (1000 cells) into memory begining of 1000.
write back the old content before. At exit write back current
data block. STABLE is starting with block 0 loaded.
10 ... trace only current state (ip, rp, sp, ..) on stdout
11 ... quit VM ( n--) n is exit code to os
12 ... ( --n) push current data block number on stack
13 ... ( --) copy 1000 cells from address 1000 to 2000
14 ... ( --) copy 1000 cells from address 2000 to 1000


P.S. Вопросы автора проекта



За это сообщение автора KPG поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Пн окт 31, 2022 04:26 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Ещё похожий проект.
S4 (с запуском ino файла в Arduino ESP32)
Цитата:
************************************
* S4 Reference *
************************************

*** ARITHMETIC ***
+ (a b--n) n: a+b - addition
- (a b--n) n: a-b - subtraction
* (a b--n) n: a*b - multiplication
/ (a b--q) q: a/b - division
^ (a b--r) r: MODULO(a, b)
& (a b--q r) q: DIV(a,b), r: MODULO(a,b) - /MOD


*** BIT MANIPULATION ***
b& (a b--n) n: a AND b
b| (a b--n) n: a OR b
b^ (a b--n) n: a XOR b
b~ (a--b) b: NOT a (ones-complement, e.g - 101011 => 010100)


*** STACK ***
# (a--a a) Duplicate TOS (DUP)
\ (a b--a) Drop TOS (DROP)
$ (a b--b a) Swap top 2 stack items (SWAP)
% (a b--a b a) Push 2nd (OVER)
_ (a--b) b: -a (Negate)
xA (a--b) b: abs(a) (Absolute)


*** MEMORY ***
c@ (a--n) Fetch BYTE n from address a
@ (a--n) Fetch CELL n from address a
c! (n a--) Store BYTE n to address a
! (n a--) Store CELL n to address a


*** REGISTERS and LOCALS ***
NOTES: 1) Register names are 1 to 3 UPPERCASE characters: [rA..rZZZ]
2) LOCALS: S4 provides 10 locals per call [r0..r9].
3) The number of registers is controlled by the NUM_REGS #define in "config.h".
4) Register 'rI' is the FOR Loop index **special**
rXXX (--n) read register/local XXX
sXXX (n--) set register/local XXX to n
iXXX (--) increment register/local XXX
dXXX (--) decrement register/local XXX
nXXX (--) increment register/local XXX by the size of a cell (next cell)


*** WORDS/FUNCTIONS ***
NOTES: 1) Word/Function names are ProperCase identifiers.
2) They must begin with [A..Z], and can include underscore (_).
3) The number of words is controlled by the NUM_FUNCS #define in "config.h"
4) If a word has already been defined, S4 prints "-redef-".
: (--) Define word/function. Copy chars to (HERE++) until closing ';'.
A_b (--) Execute/call word/function A_b
; (--) Return: PC = rpop()
NOTES: 1) Returning while inside of a loop is not supported; break out of the loop first.
2) Use '|' to break out of a FOR or WHILE loop.


*** INPUT/OUTPUT ***
. (N--) Output N as decimal number.
, (N--) Output N as character (Forth EMIT).
" (?--?) Output characters until the next '"'.
NOTES: 1) %d outputs TOS as an integer (eg - 123"x%dx" outputs x123x)
2) %c outputs TOS as a character (eg - 65"x%cx" outputs xAx)
3) %n outputs CR/LF
4) %<x> output <x> (eg - "x%" %% %"x" outputs x" % "x)
0..9 (--n) Scan DECIMAL number. For multiple numbers, separate them by space (47 33).
To enter a negative number, use "negate" (eg - 490_).
hNNN (--h) h: NNN as a HEX number (0-9, A-F, UPPERCASE only).
'x (--n) n: the ASCII value of x
`XXX` (a--a b) Copies XXX to address a, b is the next address after the NULL terminator.
xZ (a--) Output the NULL terminated string starting at address a.
xK? (--f) f: 1 if a character is waiting in the input buffer, else 0.
xK@ (--c) c: next character from the input buffer. If no character, wait.


*** CONDITIONS/LOOPS/FLOW CONTROL ***
< (a b--f) f: (a < b) ? 1 : 0;
= (a b--f) f: (a = b) ? 1 : 0;
> (a b--f) f: (a > b) ? 1 : 0;
~ (n -- f) f: (a = 0) ? 1 : 0; (Logical NOT)
[ (F T--) FOR: start a For/Next loop. if (T < F), swap T and F
rI (--n) n: the index of the current FOR loop
] (--) NEXT: increment index (I) and restart loop if (rI <= T)
NOTE: A FOR loop always runs at least one iteration.
It can be put it inside a '()' to keep it from running.
{ (f--f) BEGIN: if (f == 0) skip to matching '}'
} (f--f?) WHILE: if (f != 0) jump to matching '{', else drop f and continue
| (--) BREAK: Break out of current WHILE of FOR loop
( (f--) IF: if (f != 0), continue into '()', else skip to matching ')'


*** OTHER ***
xBO (n m--fh) File: Block Open (block-nnn.s4, m: 0=>read, 1=write)
xBR (n a sz--) File: Block Read (block-nnn.s4, max sz bytee).
xBW (n a sz--) File: Block Write (block-nnn.s4, sz bytes).
xBL (n--) File: Load code from file (block-nnn.src). This can be nested.
xFL (--) File: Load code from ./Code.S4.
xFS (--) File: Save code to ./Code.S4.
xFO (n m--h) File: Open - n: file name, m: mode, h: file handle (0 means not opened)
xFC (h--) File: Close - h: file handle
xFD (n--) File: Delete - n: file name
xFR (h--c f) File: Read - h: file handle, c: char, n: success?
xFW (c h--f) File: Write - h: file handle, c: char, n: success?
NOTE: File operations are enabled by #define __FILES__
xPI (p--) Arduino: Pin Input (pinMode(p, INPUT))
xPU (p--) Arduino: Pin Pullup (pinMode(p, INPUT_PULLUP))
xPO (p--) Arduino: Pin Output (pinMode(p, OUTPUT)
xPRA (p--n) Arduino: Pin Read Analog (n = analogRead(p))
xPRD (p--n) Arduino: Pin Read Digital (n = digitalRead(p))
xPWA (n p--) Arduino: Pin Write Analog (analogWrite(p, n))
xPWD (n p--) Arduino: Pin Write Digital (digitalWrite(p, n))
xR (n--r) r: a random number in the range [0..(n-1)]
NB: if n=0, r is the entire 32-bit random number
xT (--n) Milliseconds (Arduino: millis(), Windows: GetTickCount())
xN (--n) Microseconds (Arduino: micros(), Windows: N/A)
xW (n--) Wait (Arduino: delay(), Windows: Sleep())
xIAF (--a) INFO: a: address of first function vector
xIAH (--a) INFO: a: address of HERE variable
xIAR (--a) INFO: a: address of first register vector
xIAS (--a) INFO: a: address of beeginning of system structure
xIAU (--a) INFO: a: address of beeginning of user area
xIF (--n) INFO: n: number of words/functions
xIH (--n) INFO: n: value of HERE variable
xIR (--n) INFO: n: number of registers
xIU (--n) INFO: n: number of bytes in the USER area
xSR (--) S4 system reset
xQ (--) PC: Exit S4


P.S. по сообщению с одного форума на железке Teensy 4.0 такой результат на этой VM
Цитата:
Time for 1 billion empty loops: 20 seconds (50 million loops per second)
Time for 32-bit ADD or SUB 108nS (9.26 million additions per second)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Пн окт 31, 2022 11:34 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
KPG писал(а):
Чем то похож на uf \ micro forth \ :)
STABLE an extreme small an fast FORTH-VM

Скорее уж на ef \ esoteric forth \
В STABLE (как и в esoteric forth) можно не разделять слова пробелами, а переменные/функции только однобуквенные (a-z/A-Z): по 26 штук и тех и других.
А в uf \ micro forth \ необходимо разделять слова пробелами, а имена слов могут быть длинными.

Вот интересно, в STABLE и S4 для манипуляций со стеком по 4 слова: DUP SWAP DROP OVER
А в uf \ micro forth \: DUP SWAP DROP PICK
Т.е. они как-то обходятся без PICK и не переживают по этому поводу, а вот я без него жить не могу :))
Еще забавно, что DUP и SWAP обозначаются одинаково: # и $ соответственно. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Пн окт 31, 2022 12:50 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Total Vacuum писал(а):
Т.е. они как-то обходятся без PICK и не переживают по этому поводу, а вот я без него жить не могу :))
Еще забавно, что DUP и SWAP обозначаются одинаково: # и $ соответственно. :)

Сам тоже не использую PICK.
Возможно для PICK если использовать одну из переменных для хранения адреса указателя на стек и по команде извлечения данных с адреса вводить PICK.

@ (в Stable) - OVER наиболее используем.
Интереснее что XOR нет слова и оригинально решили разруливание веток IF ... ELSE ...
с помощью ~ после IF ветки его oставляя в FALSE \1_ или 1_ для обхода ветки "ELSE".
не равно при этом =~ :)

Истина в этих VM 1? (как в Си)
Пробелы в программе не возброняется использовать.
Можно и ? ("крючок") поменять c @ в Stable.
Количество функций можно не ограничивать одной заглавной буквой, а допустить их возможность большее количество вводить, но тогда при их последовательном использовании разделять пробелом.

P.S. По смыслу выбора слов, вроде как, достаточно обдуманные наименования и для восприятия кода программы.
А, использование такого символьного байт-код полезно для передачи программы в контроллер по последовательному порту при инкрементальной разработке и может для связи словами-символами в узлах "сети" (вспоминая Meteor-Forth)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Пн окт 31, 2022 14:09 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
KPG писал(а):
Сам тоже не использую PICK. Возможно для PICK если использовать одну из переменных для хранения адреса указателя на стек и по команде извлечения данных с адреса вводить PICK
Тут такой немного скользкий момент. Если стек данных лежит в общем адресном пространстве с кодом/данными или же в отдельном сегменте, тогда да. Тогда всё просто, и мы можем сделать PICK через @ или какую-то его разновидность (например, обзовем ее S@). Другой вопрос, что скорость работы такого PICK да и других стековых примитивов будет не очень впечатляющей, если постоянно запоминать/читать указатель стека в/из переменной. Но, например, если взять мой самодельный процессор, там для стеков и кода не предусмотрено места в общем адресном пространстве, поэтому реализация PICK через @ невозможна. И не думаю, что в этом смысле моя поделка уникальна, наверняка найдутся процессоры с таким же положением вещей. Есть еще вариант реализации PICK с использованием стека возвратов (или же отдельного программно реализованного стека) для пересыпания туда/обратно всего содержимого стека вплоть до ячейки с нужным номером. Жутко медленный вариант. Так что мне подумалось, что лучше иметь быстрый PICK и чуть более медленный OVER, чем иметь быстрый OVER, но очень медленный PICK. :) Не исключаю, что не прав. Но, как известно, кто не рискует, тот не пьёт :))

Можно считать, что PICK - это аналог слова @ для стека данных :) Не прямой аналог, но достаточно близкий по смыслу.

KPG писал(а):
@ (в Stable) - OVER наиболее используем.
P.S. По смыслу выбора слов, вроде как, достаточно обдуманные наименования и для восприятия кода программы.
Ну не знаю, лично для меня как-то дико выглядит использование : ; не для объявления слов :) Это ж в некотором роде визитная карточка Форта. Да и от использования @ в качестве OVER сердце кровью обливается :)

KPG писал(а):
Интереснее что XOR нет слова и оригинально решили разруливание веток IF ... ELSE ...
с помощью ~ после IF ветки его oставляя в FALSE \1_ или 1_ для обхода ветки "ELSE".
не равно при этом =~ :)
По большому счету, достаточно одного единственного цикла while, чтобы реализовать и if-else-then и циклы со счетчиком.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: uf \ micro forth \
СообщениеДобавлено: Пн окт 31, 2022 14:42 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Total Vacuum писал(а):
По большому счету, достаточно одного единственного цикла while, чтобы реализовать и if-else-then и циклы со счетчиком.

Согласен.
т.е. "вернуть" скобки в Форт стиле одного из вариантов комментирования (STABLE)? :) (или квадратные скобки в uf)
или их использовать для обозначения локальных переменных, которые по традиции определяются через фигурные скобки в Форт.
квадратные скобки можно использовать и в семантике из классического Форт.

P.S. : ; - - чем то имеет смысл в новом языке "пожертвовать" или найти консенсус.
Фигурная скобка { достаточно наглядна выделяет вводимое слово для восприятия с точки зрения эргономики.
По поводу @ тоже согласен и символ ? тоже полезен как "вопрос"
Есть в Stable ^ для запроса клавиш - вот его можно для другой цели использовать, если добавить системную функцию к ` в терминалогии STABLE.
Например ^ использовать "вместо" ? (STABLE) для извлечения значения по адресу хранимому в выбранной переменной,
а ; использовать для комментариев в стиле ассемблеров или прагма оператора.
ещё можно использовать ; в определении слова как машинный оператор RET (тогда возможен множественный выход из слова)

, (запятую) в новой семантике можно понимать как добавление нового "числа" в выходной "буфер" c переназначаемым адресом в переменной для его привязки (HERE указатель, HANDLE/STDIN/STDOUT файловый поток ...)
т.е. в такой интепритации напрашивается замена ! на , (в Selected)
а ; заменить на ?
с : не определился но можно оставить как есть в Selected.

Без xor вероятно можно обойтись т.к. есть ~ и and и ими можно эмулировать xor к числам, вроде как.
да и сам xor не часто востребован.

Total Vacuum писал(а):
[. Так что мне подумалось, что лучше иметь быстрый PICK и чуть более медленный OVER, чем иметь быстрый OVER, но очень медленный PICK. :) .

Специально можно не вводить слово PICK для работы со стеком данных, а понимать применение операции @ к примеру, числам 0 , 1 , 2 3 положенному на вершину стека как доступ к соответствующему значению элемента стека.
т.е. "адреса" переменных a-z не могут быть этими несколькими числами зарезервированными для доступа к стеку в таком варианте, Сколько таких чисел для "PICK" можно конфигурировать программно в системе, например через системную функцию.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB