Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 16:18

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 19:13 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Forthware писал(а):
Да, конечно, но результат для SPF получисля более эффективным чем ваш код на ассме. А на других Фортах ваш код вообще не работает в отличии от этого.

На других фортах будет другой ассм+форт, который в случае необходимости всегда даст в общем случае лучший код, как впрочем и на SPF. Пока ни в одном форте кроме peephole-оптимизации той или иной глубины ничего другого не видел. :(

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 19:41 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
всегда даст в общем случае лучший код, как впрочем и на SPF.
Однако вы такого кода для SPF пока не привели (код слова VSWAP). ;)
chess писал(а):
Пока ни в одном форте кроме peephole-оптимизации той или иной глубины ничего другого не видел.
Да неужели? Ну вот, запускаем VFX и смотрим:
Код:
: VSWAP ( "v1 v2" -- )
>IN @ PAD 2 0 DO BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + BL OVER C! CHAR+ LOOP SWAP >IN !
2 0 DO S"  TO " CHARS TUCK 3 PICK SWAP MOVE + BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + LOOP
PAD SWAP OVER - EVALUATE ; IMMEDIATE  ok
1 value v1 2 value v2  ok
: test vswap v1 v2 ;  ok
see test
TEST
( 004ABD30    8B15E0BC4A00 )          MOV       EDX, [004ABCE0]
( 004ABD36    8B0D10BD4A00 )          MOV       ECX, [004ABD10]
( 004ABD3C    890DE0BC4A00 )          MOV       [004ABCE0], ECX
( 004ABD42    891510BD4A00 )          MOV       [004ABD10], EDX
( 004ABD48    C3 )                    NEXT,
( 25 bytes, 5 instructions )
ok
Это вам ничего не напоминает? :lol:


Последний раз редактировалось Forthware Пн мар 17, 2008 20:24, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 19:58 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
В отличии от SPF и VFX, Swift имеет очень слабый оптимизатор, поэтому результат компиляции моего варианта далек от идеала:
Код:
: test1 vswap v1 v2 ;  ok
test1  ok
v1 . v2 . 1 2  ok
see test1
46E5DF   4 # EBP SUB                    83ED04
46E5E2   EBX 0 [EBP] MOV                895D00
46E5E5   6C4A4 [EDI] EBX MOV            8B9FA4C40600
46E5EB   4 # EBP SUB                    83ED04
46E5EE   EBX 0 [EBP] MOV                895D00
46E5F1   6C4C4 [EDI] EBX MOV            8B9FC4C40600
46E5F7   EBX 6C4A4 [EDI] MOV            899FA4C40600
46E5FD   0 [EBP] EBX MOV                8B5D00
46E600   4 # EBP ADD                    83C504
46E603   EBX 6C4C4 [EDI] MOV            899FC4C40600
46E609   0 [EBP] EBX MOV                8B5D00
46E60C   4 # EBP ADD                    83C504
46E60F   RET                            C3 ok
Очевидно что мглобы быть лучше. Однако, как я говорил раньше, попытка исправить ситуацию прямым вмешательством с помощью @ и ! выглядит еще хуже. Вот ваша реализация без ассемблера:
Код:
: VSWAP1 ( xt1 xt2 -- ) >BODY SWAP >BODY 2DUP @ SWAP @ ROT ! SWAP ! ;  ok
: VSWAP2 ' ' STATE @ IF  POSTPONE 2LITERAL  POSTPONE VSWAP1 ELSE  VSWAP1 THEN ; IMMEDIATE  ok
: test2 vswap2 v1 v2 ;  ok
see test2
46E6CF   8 # EBP SUB                    83ED08
46E6D2   EBX 4 [EBP] MOV                895D04
46E6D5   6C49F # 0 [EBP] MOV            C745009FC40600
46E6DC   6C4BF # EBX MOV                BBBFC40600
46E6E1   46E62F ( VSWAP1 ) JMP          E949FFFFFF ok
see vswap1
46E62F   5 [EDI] [EBX] EBX LEA          8D5C1F05
46E633   0 [EBP] EAX MOV                8B4500
46E636   EBX 0 [EBP] MOV                895D00
46E639   EAX EBX MOV                    8BD8
46E63B   5 [EDI] [EBX] EBX LEA          8D5C1F05
46E63F   8 # EBP SUB                    83ED08
46E642   EBX 4 [EBP] MOV                895D04
46E645   8 [EBP] EAX MOV                8B4508
46E648   EAX 0 [EBP] MOV                894500
46E64B   0 [EBX] EAX MOV                8B03
46E64D   0 [EBP] EBX MOV                8B5D00
46E650   EAX 0 [EBP] MOV                894500
46E653   0 [EBX] EBX MOV                8B1B
46E655   4 [EBP] EAX MOV                8B4504
46E658   EBX 0 [EAX] MOV                8918
46E65A   0 [EBP] EBX MOV                8B5D00
46E65D   8 # EBP ADD                    83C508
46E660   0 [EBP] EAX MOV                8B4500
46E663   EBX 0 [EAX] MOV                8918
46E665   4 [EBP] EBX MOV                8B5D04
46E668   8 # EBP ADD                    83C508
46E66B   RET                            C3 ok

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 20:42 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
А где можно взять ~chess\assm\sp-assm.f ?
Спасибо.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 21:56 
Не в сети

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 380
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
in4 писал(а):
forther писал(а):
in4 писал(а):
Нет заморочек с предыдущим левым переносом

Нет никакого левого переноса.

В системе команд 8-битового PIC16F877- микроконтроллера нет команды "сложить/вычесть с переносом". Для сложения и вычитания 16-битных чисел приходится применять дополнительные команды, корректирующие перенос. В случае с XOR такой необходимости нет! А как раз для таких контроллеров с памятью ~128..256..384 байтов на всё - предложенная задача особенно актуальна.


Алгоритм будет работать и без переноса, если вы примените вычитание/сложение отдельно к каждому байту. Вам же не сам результат вычитания нужен.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 10:09 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Forthware писал(а):
Однако вы такого кода для SPF пока не привели (код слова VSWAP).

Привожу:
Код:
REQUIRE IDN ~chess\assm\sp-assm.f

1 VALUE V1 2 VALUE V2

: VSWAP
' >BODY DUP ' >BODY DUP >CS C=@, SWAP >CS D=@, >CS @=D, >CS @=C,
; IMMEDIATE

: TST VSWAP V1 V2 ;

STARTLOG
SEE TST
TST
V1 . V2 .

ЛОГ

CODE TST
5A5BA0 8B0DF55A5A00     MOV     ECX , 5A5AF5  ( V2+5  )
5A5BA6 8B15D55A5A00     MOV     EDX , 5A5AD5  ( V1+5  )
5A5BAC 8915F55A5A00     MOV     5A5AF5  ( V2+5  ) , EDX
5A5BB2 890DD55A5A00     MOV     5A5AD5  ( V1+5  ) , ECX
5A5BB8 C3               RET     NEAR
END-CODE  2 1
Ok

Forthware писал(а):
А где можно взять ~chess\assm\sp-assm.f ?

Здесь:
http://www.chess2007.nm.ru/~chess.zip
Forthware писал(а):
Это вам ничего не напоминает?

Может быть это и не peephole-оптимизация, исходников-то нет - продукт однако коммерческий сказать ничего не могу. :(
Однако до такого оптимизатор СПФ легко доработать можно.
Насчет оптимизации. Сначала нужно убедиться, что форт-система грамотно поставлена на аппаратную
платформу, а потом уже смотреть как сделать оптимизатор. В СПФ похоже форт-система поставлена
на IA-32 не совсем правильно. Кстати по коду от VFX похоже аналогично - так как код и данные рядом находятся.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 12:02 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
forther писал(а):
Алгоритм будет работать и без переноса, если вы примените вычитание/сложение отдельно к каждому байту.
Возможно in4 имел ввиду решение на форте, которое использует слова + и -. Реализация этих слов в 16 битном форте на 8 битном процессоре использует перенос.


chess писал(а):
Благодарю.
chess писал(а):
исходников-то нет - продукт однако коммерческий сказать ничего не могу.
И не сможете, поскольку даже приобретя самый дорогой пакет содержащий исходники оптимизатора за ~$6000, вы подписываете договор о неразглашении, запрещающий вам рассказывать как оно устроено. :)
chess писал(а):
Однако до такого оптимизатор СПФ легко доработать можно.
Вот видите, а вы говорите что незнаете фортов с нормальной оптимизацией. VFX уже компилирует мой вариант идеально, и вы согласны что СПФ тоже легко до такого доработать. :)
chess писал(а):
Сначала нужно убедиться, что форт-система грамотно поставлена на аппаратную платформу, а потом уже смотреть как сделать оптимизатор.
Ну мы вроде не оптимизаторы обсуждаем а варианты решения задачи garbler. Попробую подытожить.

1. Ваш вариант без ассма:
Код:
: VSWAP1 ( xt1 xt2 -- ) >BODY SWAP >BODY 2DUP @ SWAP @ ROT ! SWAP ! ;
: VSWAP2 ' ' STATE @ IF  POSTPONE 2LITERAL  POSTPONE VSWAP1 ELSE  VSWAP1 THEN ; IMMEDIATE

Преимущества:
- есть VSWAP1 берущий в качестве аргументов xt переменных.
Недостатки:
- код зависит от реализации VALUE, поэтому не переносим;
- генерирует очень неэффективный код на любых реализациях Форта;

2. Мой последний вариант:
Код:
: VSWAP ( "v1 v2" -- )
>IN @ PAD 2 0 DO BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + BL OVER C! CHAR+ LOOP SWAP >IN !
2 0 DO S"  TO " CHARS TUCK 3 PICK SWAP MOVE + BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + LOOP
PAD SWAP OVER - EVALUATE ; IMMEDIATE

Преимущества:
- независит от реализации VALUE на конкретом Форте, может быть использован практически везде, без изменений;
- генерирует максимально эффективный код, на который способен компилятор, без вмешательства ассемблера.
- соответствует стандарту ANSI94
Недостатки:
- использует PAD.

3. Ваш ассемблерный вариант:
Код:
: VSWAP
' >BODY DUP ' >BODY DUP >CS C=@, SWAP >CS D=@, >CS @=D, >CS @=C,
; IMMEDIATE

Преимущества:
- генерирует максимально эффективный код (эффективнее за мой вариант);
Недостатки:
- применим только на SPF;
- использует не только Форт (это недостаток, поскольку в задаче было сказано: "усложнение задачи: решение должно быть совместимым со стандартом (одним из).").

Вот, гдето так. :D

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 12:41 
Вот лично мне больше нравится первый вариант. :oops:
Он выглядит короче и читабельнее. Совместимость со стандартом - переносить нужно не код, а алгоритмы. Если нужна максимальная скорость, то писать нужно в ассемблере (добавить новое слово в СвойФорт).
Ваш вариант получился нечитаемым, и если его нужно будет перенести в форт несовместимый со стандартом, то придется попотеть. К тому же Вы сами говорили, что совместимости со стандартом в разных фортах сейчас никакой...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 13:44 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
whiteTigr писал(а):
Вот лично мне больше нравится первый вариант. Он выглядит короче и читабельнее.
Это понятно, поэтому мой первый вариант решения был аналогичным (http://fforum.winglion.ru/viewtopic.php?p=13293#13293). Но он не соответствует последнему условию задачи (опциональному). К тому же, подобное решение, в виду своей тривиальности, не может представлять какого либо интереса, тем более для программиста имеющего СвойФорт, IMHO. :roll:
whiteTigr писал(а):
Ваш вариант получился нечитаемым,
Да, это правда. Мне следовало изложить идею отдельно, так было бы понятнее. :shuffle;
whiteTigr писал(а):
К тому же Вы сами говорили, что совместимости со стандартом в разных фортах сейчас никакой...
Требование соответствия стандарту было обусловлено в задаче.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 14:15 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вот более простая реализация, с пояснениями. Надеюсь так будет кому то понятней. :)
Код:
: VSWAP ( "v1 v2" -- ) >IN @ >R 2 0 DO BL WORD COUNT EVALUATE LOOP S" TO " PAD SWAP CMOVE
R> >IN ! 2 0 DO BL WORD COUNT TUCK PAD 3 CHARS + SWAP CMOVE 3 + PAD SWAP EVALUATE LOOP ; IMMEDIATE

Код:
: VSWAP ( "v1 v2" -- )
\ сохраняем положение входного потока
  >IN @ >R
\ выполняем 2 следующих слова
  2 0 DO BL WORD COUNT EVALUATE LOOP
\ записываем "ТО " в PAD
  S" TO " PAD SWAP CMOVE
\ восстанавливаем положение входного потока (чтобы еще раз выбрать два следующих слова)
  R> >IN !
\ копируем следующее слово в PAD, после "TO " и выполняем содержимое PAD (для 2-х следующих слов)
  2 0 DO BL WORD COUNT TUCK PAD 3 CHARS + SWAP CMOVE 3 + PAD SWAP EVALUATE LOOP
; IMMEDIATE \ слово немедленного исполнения
\ Если введена строка: "VSWAP V1 V2" то с помощью EVALUATE будет исполнено "V1 V2 TO V1 TO V2".
\ Если система находится в состоянии компиляции, то эта последовательность будет скомпилирована.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 19:45 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
О-ох! :shock:
Вот уж точно, иллюстрация на тему, как надо удалять гланды через задний проход!

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 20:20 
Forthware писал(а):
подобное решение, в виду своей тривиальности, не может представлять какого либо интереса, тем более для программиста имеющего СвойФорт


"Гениальный программист - это тот, который с помощью тупого кода пишет гениальные вещи, а не наоборот" (с)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 20:26 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Вот уж точно, иллюстрация на тему, как надо удалять гланды через задний проход!
Знаете, Антонов всегда говорил, что не красивый самолет не может хорошо летать. Тем не менее, все его проекты проходили летные испытания а не конкурсы красоты, и именно техническое превосходство делало их первыми в мире, а не внешний вид. :roll:

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 21:05 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Если бы Антонов приделывал к своим самолетам гребной винт,
и ставил на него колеса от К700, чтобы он по болотам мог ездить,
то такой самолет не взлетел бы.

Это я к тому, что накрутки вокруг этого уже свапа кажутся не просто дикими, а дико сумасшедшими.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 18, 2008 22:13 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Это я к тому, что накрутки вокруг этого уже свапа кажутся не просто дикими, а дико сумасшедшими.
Такая поставлена задача. А на практике, по моему, проще просто писать V1 V2 TO V1 TO V2 где надо, и ничего не выдумывать. ;)

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

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


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

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


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

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