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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Еще один способ работы с параметрами на стеке
Автор Сообщение
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Чтобы в полной мере использовать стек данных и как стек и как место для локальных переменных
пришлось сделать стек данных очень большим. При этом указатель стека должен стать 32 разрядно-адресуемым.
Только для иллюстрации:
Код:
CODE DUP
552320 8D6DFC           LEA     EBP , FC [EBP]
552323 894500           MOV     0 [EBP] , EAX
552326 C3               RET     NEAR
END-CODE
( 7 bytes, 3 instructions )


CODE LDup
60ADCB 8DADFCFFFFFF     LEA     EBP , FFFFFFFC  ( LDup+FF9F5231  ) [EBP]
60ADD1 89042D00000000   MOV     0 [EBP] , EAX
60ADD8 C3               RET     NEAR
END-CODE
( 14 bytes, 3 instructions )
Сообщение Добавлено: Вт июл 25, 2023 16:02
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Fasm был интересен 15 лет назад. Сейчас даже и не совсем понятно, что на таком трансляторе можно будет вразумительное сделать.
Сообщение Добавлено: Сб янв 07, 2023 18:32
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Hishnik писал(а):
А spf еще жив? Архитектурно он не пережил даже перехода DOS -> Windows. Все вот эти "стандарт де-факто" и "надо либы какие-нибудь продвигать" - уже трепыхания рыбы, которая неплохо плавала, но попыталась вылезти на сушу и плавать там, помахивая плавниками "де-факто".

ЕМНИП, Win64FasmForth это тот же СПФ только он пилится под 64 бита Максимовым
Сообщение Добавлено: Сб янв 07, 2023 17:20
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
А spf еще жив? Архитектурно он не пережил даже перехода DOS -> Windows. Все вот эти "стандарт де-факто" и "надо либы какие-нибудь продвигать" - уже трепыхания рыбы, которая неплохо плавала, но попыталась вылезти на сушу и плавать там, помахивая плавниками "де-факто".
Сообщение Добавлено: Сб янв 07, 2023 16:25
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
F-MAP писал(а):
Victor__v писал(а):
Цитата:
ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN

:hey; :hey; :hey;
Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками?
Не, давайте тянуть потенциально бажное решение из SPF :)

Что так хаять spf, предложи свое решение, чем махать лаптями..


О, аргументация "сперва добейся") Очаровательно.
То что я машу лаптями, как-то меняет тот факт, что реализация расширения NOTFOUND в СПФ потенциально багоопасная и тормознутая при этом?

И свое предложение у меня есть. В своем форте реализовано и работает.
viewtopic.php?f=58&t=3273
Сообщение Добавлено: Сб янв 07, 2023 11:46
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
Цитата:
ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN

:hey; :hey; :hey;
Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками?
Не, давайте тянуть потенциально бажное решение из SPF :)

Что так хаять spf, предложи свое решение, чем махать лаптями..
Сообщение Добавлено: Пт янв 06, 2023 20:17
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Цитата:
ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN

:hey; :hey; :hey;
Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками?
Не, давайте тянуть потенциально бажное решение из SPF :)
Сообщение Добавлено: Чт янв 05, 2023 17:58
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Ну и как, с 2008 года оно получило широкое распространение?
Цитата:
The canonical Forth virtual machine is weak in several areas.
1) It does not execute C well, which is important for commercial exploitation of silicon stack machines.
2) It is weak for DSP operations, which restricts performance in embedded applications without changes to the VM or much increased compiler complexity,
3) Without index operations, it is cumbersome to deal with complex data structures whose base address is passed as an argument to a word.


1) А что вообще можно сказать про Си в отрыве от промежуточного представления, в которое компилируется исходный текст? Стековая машина - вполне рабочее промежуточное представление, естественно, с присущими недостатками.
2) DSP вообще не для процессоров, это для аппаратных ускорителей. По крайней мере, для специализированных расширений. Оптимизировать такты на DSP - изначально провальное занятие, там должен быть один такт на отвод фильтра, со всеми сопутствующими операциями, производимыми параллельно.
3) А потом будет передаваться три аргумента. А потом четыре. Почему тогда так мало регистров? Давайте уже блок на 32 РОН и 8 индексных, м?
Сообщение Добавлено: Пн янв 02, 2023 22:40
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
предлагалось расширить виртуальную машину форт регистрами A,B,X и Y
https://www.complang.tuwien.ac.at/anton/euroforth/ef08/papers/pelc.pdf
интересно проверить Вашу гипотезу иной реализацией , например с другим процессором (ARM)
или где идет компиляция в WebAssembly или другой язык.
Сообщение Добавлено: Пн янв 02, 2023 22:21
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
chess писал(а):
Число инструкций на треть где-то уменьшилось.
Реализация такой оптимизазации тривиальна.
ps. Эксперименты с фортом на манипуляторах подводят к полному пересмотру концепции стекового языка
как в части экономии времени при создании надежных программ, так и в части повышения эффективности кода программ.

Может имеет смысл оформить полученные результаты в виде статьи и разместить её, к примеру, на площадке типа Хабр? :shuffle;
Сообщение Добавлено: Сб дек 31, 2022 16:46
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
В виртуальной машине форта на манипуляторах трактовка стека параметров расширена,
а именно, стек рассматривается как массив и как стек одновременно.
Поэтому число команд виртуальной машины также расширено операциями между ячейками стека.
В этом случае возможна 'ручная' оптимизация кода без выхода на ассемблер.

Код:
\ обычный вариант определения площади треугольника
m: s3 | a b c | a b + c + 2x / | p |
       p p a - * p b - * p c - * sqrt
;m
SEE s3 3 4 5 s3 .s

\ оптимизированный вариант с использованием операций между ячейками
m: s3c | a b c | c | p | p b c+ p a c+ p 2x c/
   a p c- b p c- c p c- p a c* p b c* p c c* NEGATE sqrt
;m

SEE s3c 3 4 5 s3c .s

\ обычный вариант суммы квадратов трех чисел
m: ssq3  | a b c | a a * b b * + c c * +
;m
SEE ssq3   1 2 3 ssq3 .

\ оптимизированный вариант с использованием операций между ячейками
m: ssq3c | a b c | a a c* b b c* c c c* c b c+ c a c+
;m
SEE ssq3c  1 2 3 ssq3c .

лог
Код:
CODE s3
6293DF 8945FC           MOV     FC [EBP] , EAX
6293E2 8B4504           MOV     EAX , 4 [EBP]
6293E5 034500           ADD     EAX , 0 [EBP]
6293E8 0345FC           ADD     EAX , FC [EBP]
6293EB 8945F8           MOV     F8 [EBP] , EAX
6293EE B802000000       MOV     EAX , # 2
6293F3 8BC8             MOV     ECX , EAX
6293F5 8B45F8           MOV     EAX , F8 [EBP]
6293F8 99               CDQ
6293F9 F7F9             IDIV    ECX
6293FB 8945F8           MOV     F8 [EBP] , EAX
6293FE 8945F4           MOV     F4 [EBP] , EAX
629401 8B45F8           MOV     EAX , F8 [EBP]
629404 2B4504           SUB     EAX , 4 [EBP]
629407 F76DF4           IMUL    F4 [EBP]
62940A 8945F4           MOV     F4 [EBP] , EAX
62940D 8B45F8           MOV     EAX , F8 [EBP]
629410 2B4500           SUB     EAX , 0 [EBP]
629413 F76DF4           IMUL    F4 [EBP]
629416 8945F4           MOV     F4 [EBP] , EAX
629419 8B45F8           MOV     EAX , F8 [EBP]
62941C 2B45FC           SUB     EAX , FC [EBP]
62941F F76DF4           IMUL    F4 [EBP]
629422 8D6DF8           LEA     EBP , F8 [EBP]
629425 E89DDBFEFF       CALL    616FC7  ( sqrt )
62942A 8D6D10           LEA     EBP , 10 [EBP]
62942D C3               RET     NEAR
END-CODE
( 79 bytes, 27 instructions )

6

CODE s3c
62943F 8945FC           MOV     FC [EBP] , EAX
629442 034500           ADD     EAX , 0 [EBP]
629445 034504           ADD     EAX , 4 [EBP]
629448 C7C102000000     MOV     ECX , # 2
62944E 99               CDQ
62944F F7F9             IDIV    ECX
629451 294504           SUB     4 [EBP] , EAX
629454 294500           SUB     0 [EBP] , EAX
629457 2945FC           SUB     FC [EBP] , EAX
62945A 0FAF4504         IMUL    EAX , 4 [EBP]
62945E 0FAF4500         IMUL    EAX , 0 [EBP]
629462 0FAF45FC         IMUL    EAX , FC [EBP]
629466 F7D8             NEG     EAX
629468 8D6DFC           LEA     EBP , FC [EBP]
62946B E857DBFEFF       CALL    616FC7  ( sqrt )
629470 8D6D0C           LEA     EBP , C [EBP]
629473 C3               RET     NEAR
END-CODE
( 53 bytes, 17 instructions )

6

лог
CODE ssq3
629487 8945FC           MOV     FC [EBP] , EAX
62948A 8B5D04           MOV     EBX , 4 [EBP]
62948D 0FAF5D04         IMUL    EBX , 4 [EBP]
629491 8BC3             MOV     EAX , EBX
629493 8945F8           MOV     F8 [EBP] , EAX
629496 8B5D00           MOV     EBX , 0 [EBP]
629499 0FAF5D00         IMUL    EBX , 0 [EBP]
62949D 8BC3             MOV     EAX , EBX
62949F 0345F8           ADD     EAX , F8 [EBP]
6294A2 8945F8           MOV     F8 [EBP] , EAX
6294A5 8B5DFC           MOV     EBX , FC [EBP]
6294A8 0FAF5DFC         IMUL    EBX , FC [EBP]
6294AC 8BC3             MOV     EAX , EBX
6294AE 0345F8           ADD     EAX , F8 [EBP]
6294B1 8D6D08           LEA     EBP , 8 [EBP]
6294B4 C3               RET     NEAR
END-CODE
( 46 bytes, 16 instructions )
14

CODE ssq3c
6294C7 8B5D04           MOV     EBX , 4 [EBP]
6294CA 0FAF5D04         IMUL    EBX , 4 [EBP]
6294CE 895D04           MOV     4 [EBP] , EBX
6294D1 8B5D00           MOV     EBX , 0 [EBP]
6294D4 0FAF5D00         IMUL    EBX , 0 [EBP]
6294D8 895D00           MOV     0 [EBP] , EBX
6294DB F7E8             IMUL    EAX
6294DD 034500           ADD     EAX , 0 [EBP]
6294E0 034504           ADD     EAX , 4 [EBP]
6294E3 8D6D08           LEA     EBP , 8 [EBP]
6294E6 C3               RET     NEAR
END-CODE
( 32 bytes, 11 instructions )
14

Число инструкций на треть где-то уменьшилось.
Реализация такой оптимизазации тривиальна.
ps. Эксперименты с фортом на манипуляторах подводят к полному пересмотру концепции стекового языка
как в части экономии времени при создании надежных программ, так и в части повышения эффективности кода программ.
Сообщение Добавлено: Сб дек 31, 2022 00:46
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Сравнил манипуляторы, задаваемые в форме определений с локальными переменными
с форт-определениями (при включенном оптимизаторе) в части скорости кода.

Иногда форт проигрывает:
Код:
\ форт
: MAXMIN1  >R MAX R> MIN ;                  SEE MAXMIN1
: MAXMIN2  -ROT  MAX MIN ;                  SEE MAXMIN2 SEE MAX SEE MIN

\ манипуляторы
m: MAXMINm | a b c | a b MAX c MIN  ;m      SEE MAXMINm 

лог
Код:
CODE MAXMIN1
629287 50               PUSH    EAX
629288 8B4500           MOV     EAX , 0 [EBP]
62928B 8D6D04           LEA     EBP , 4 [EBP]
62928E E8DD90F2FF       CALL    552370  ( MAX )
629293 8945FC           MOV     FC [EBP] , EAX
629296 58               POP     EAX
629297 8D6DFC           LEA     EBP , FC [EBP]
62929A E8ED90F2FF       CALL    55238C  ( MIN )
62929F C3               RET     NEAR
END-CODE
( 25 bytes, 9 instructions )

CODE MAXMIN2
6292B7 8B5504           MOV     EDX , 4 [EBP]
6292BA 894504           MOV     4 [EBP] , EAX
6292BD 8B4500           MOV     EAX , 0 [EBP]
6292C0 895500           MOV     0 [EBP] , EDX
6292C3 E8A890F2FF       CALL    552370  ( MAX )
6292C8 E8BF90F2FF       CALL    55238C  ( MIN )
6292CD C3               RET     NEAR
END-CODE
( 23 bytes, 7 instructions )

CODE MAX
552370 8B5500           MOV     EDX , 0 [EBP]
552373 3BD0             CMP     EDX , EAX
552375 0F4FC2           CMOVG   EAX , EDX
552378 8D6D04           LEA     EBP , 4 [EBP]
55237B C3               RET     NEAR
END-CODE
( 12 bytes, 5 instructions )

CODE MIN
55238C 8B5500           MOV     EDX , 0 [EBP]
55238F 3BD0             CMP     EDX , EAX
552391 0F4CC2           CMOVL   EAX , EDX
552394 8D6D04           LEA     EBP , 4 [EBP]
552397 C3               RET     NEAR
END-CODE
( 12 bytes, 5 instructions )

CODE MAXMINm
6292E3 8945FC           MOV     FC [EBP] , EAX
6292E6 8B4500           MOV     EAX , 0 [EBP]
6292E9 8B5504           MOV     EDX , 4 [EBP]
6292EC 3BD0             CMP     EDX , EAX
6292EE 0F4FC2           CMOVG   EAX , EDX
6292F1 8B55FC           MOV     EDX , FC [EBP]
6292F4 3BD0             CMP     EDX , EAX
6292F6 0F4CC2           CMOVL   EAX , EDX
6292F9 8D6D08           LEA     EBP , 8 [EBP]
6292FC C3               RET     NEAR
END-CODE
( 26 bytes, 10 instructions )


В вариантах на форте 19 и 17 инструкций, а на манипуляторах 10.
Как правило манипуляторы дают сравнимое с фортом+оптимизатор быстродействие семантически эквивалентных определений,
но позволяют писать эти определения так же быстро как и с помощью локальных переменных.
Сообщение Добавлено: Ср дек 28, 2022 21:31
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Для формирования предельно оптимального по скорости форт-кода
сделал 'стековый' ассемблер( плюс три строчки в текст транспилятора )
Код:
m{
\ Сумма квадратов трех чисел
: SumSq | n1 n2 n3 |
  A{
  ebx n1  mov
  ecx n2  mov
  eax eax imul
  ebx ebx imul
  ecx ecx imul
  eax ebx add
  eax ecx add
  }A
  T> n1 ;
}m
SEE SumSq
1 2 3 SumSq .s

лог
Код:
CODE SumSq
628AC7 8B5D04           MOV     EBX , 4 [EBP]
628ACA 8B4D00           MOV     ECX , 0 [EBP]
628ACD F7E8             IMUL    EAX
628ACF 0FAFDB           IMUL    EBX , EBX
628AD2 0FAFC9           IMUL    ECX , ECX
628AD5 03C3             ADD     EAX , EBX
628AD7 03C1             ADD     EAX , ECX
628AD9 8D6D08           LEA     EBP , 8 [EBP]
628ADC C3               RET     NEAR
END-CODE
( 22 bytes, 9 instructions )

14

T.е. можно делать ассемблерные вставки,
но конечно проще такие вставки делать прямо в манипуляторной форме:
/[3{b1:c2:aa*bb*cc*ab+ac+}'1.
Короче и обзорность лучше.
Сообщение Добавлено: Вс дек 18, 2022 23:24
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Изменяю синтаксис манипуляторов с целью упрощения их использования
для ускорения создания программ и оптимизации их кода.

Код:
\ сумма попарных произведений для четырех чисел
: dcr4 { a b c d }     \ spf
       b c + d + a *
       c d + b * +
       c d * +
;
SEE dcr4  SEE DRMOVE

m{
: dc4 | a b c d |      \ spf + манипуляторы
      b c + d + a *
      c d + b * +
      c d * + T> a
;
}m
SEE dc4

лог.
Код:
CODE dcr4
627B53 8945FC           MOV     FC [EBP] , EAX
627B56 B810000000       MOV     EAX , # 10
627B5B 8D6DFC           LEA     EBP , FC [EBP]
627B5E E881B5F2FF       CALL    5530E4  ( DRMOVE )
627B63 6810000000       PUSH    , # 10
627B68 6868325500       PUSH    , # 553268
627B6D 8945FC           MOV     FC [EBP] , EAX
627B70 8B442410         MOV     EAX , 10 [ESP]
627B74 0344240C         ADD     EAX , C [ESP]
627B78 03442408         ADD     EAX , 8 [ESP]
627B7C 8945F8           MOV     F8 [EBP] , EAX
627B7F 8B442414         MOV     EAX , 14 [ESP]
627B83 F76DF8           IMUL    F8 [EBP]
627B86 8945F8           MOV     F8 [EBP] , EAX
627B89 8B44240C         MOV     EAX , C [ESP]
627B8D 03442408         ADD     EAX , 8 [ESP]
627B91 8945F4           MOV     F4 [EBP] , EAX
627B94 8B442410         MOV     EAX , 10 [ESP]
627B98 F76DF4           IMUL    F4 [EBP]
627B9B 0345F8           ADD     EAX , F8 [EBP]
627B9E 8945F8           MOV     F8 [EBP] , EAX
627BA1 8B44240C         MOV     EAX , C [ESP]
627BA5 8945F4           MOV     F4 [EBP] , EAX
627BA8 8B442408         MOV     EAX , 8 [ESP]
627BAC F76DF4           IMUL    F4 [EBP]
627BAF 0345F8           ADD     EAX , F8 [EBP]
627BB2 8D6DFC           LEA     EBP , FC [EBP]
627BB5 C3               RET     NEAR
END-CODE
( 99 bytes, 28 instructions )


CODE DRMOVE
5530E4 5A               POP     EDX
5530E5 8BF0             MOV     ESI , EAX
5530E7 FF7435FC         PUSH    FC [EBP] [ESI]
5530EB 83EE04           SUB     ESI , # 4
5530EE 75F7             JNE     5530E7
5530F0 03E8             ADD     EBP , EAX
5530F2 8B4500           MOV     EAX , 0 [EBP]
5530F5 8D6D04           LEA     EBP , 4 [EBP]
5530F8 FFE2             JMP     EDX
END-CODE
( 22 bytes, 9 instructions )


CODE dc4
627BC7 8945FC           MOV     FC [EBP] , EAX
627BCA 8B4504           MOV     EAX , 4 [EBP]
627BCD 034500           ADD     EAX , 0 [EBP]
627BD0 0345FC           ADD     EAX , FC [EBP]
627BD3 F76D08           IMUL    8 [EBP]
627BD6 8945F8           MOV     F8 [EBP] , EAX
627BD9 8B4500           MOV     EAX , 0 [EBP]
627BDC 0345FC           ADD     EAX , FC [EBP]
627BDF F76D04           IMUL    4 [EBP]
627BE2 0345F8           ADD     EAX , F8 [EBP]
627BE5 8945F8           MOV     F8 [EBP] , EAX
627BE8 8B5D00           MOV     EBX , 0 [EBP]
627BEB 0FAF5DFC         IMUL    EBX , FC [EBP]
627BEF 8BC3             MOV     EAX , EBX
627BF1 0345F8           ADD     EAX , F8 [EBP]
627BF4 8D6D0C           LEA     EBP , C [EBP]
627BF7 C3               RET     NEAR
END-CODE
( 49 bytes, 17 instructions )


Код на лок. переменных 37 инструкций
Код на манипуляторах 17 инструкций
На обычном форте это (и многое другое) писать гораздо дольше

Фрагмент типа ( T> a ) можно написать например так | res | Out: res
Код:
: dc4 | a b c d |
      b c + d + a *
      c d + b * +
      c d * + | res |
      out: res ;

Где out: автоматически расположит указанное количество
выходных параметров в указанном порядке на стеке.
Сообщение Добавлено: Ср дек 14, 2022 00:59
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Реализовал измеритель времени однократного исполнения отдельных слов для WinFAsmForth64,
сначала пишем на fasm в ядро форт-системы:
Код:
cfa_AHEADER 0,'xmeter',xmeter
    movd xmm0, eax
    xor   eax, eax
    cpuid
    rdtsc
    movd xmm1, eax
    movd  ebx, xmm0
    call  rbx
    xor   eax, eax
    cpuid
    rdtsc
    movd  ecx, xmm1
    sub   eax, ecx
    movd xmm2, eax
    xor   eax, eax
    cpuid
    rdtsc
    movd xmm1, eax
    movd  ebx, xmm0
    xor   eax, eax
    cpuid
    rdtsc
    movd  ecx, xmm1
    sub   eax, ecx
    mov   ebx, eax
    movd  eax, xmm2
    sub   eax, ebx
ret

потом дописываем в уже сформированной форт-системе:
Код:
: dT (  "name" --  )
  ' xmeter  CR NIP . ." ticks "  CR S0 @ SP! ;

использование:
Код:
dT DROP

результат:
Код:
81 ticks
Сообщение Добавлено: Вс июн 05, 2022 23:33

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


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