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

...
Google Search
Forth-FAQ Spy Grafic

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




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

Зарегистрирован: Чт дек 31, 2009 18:36
Сообщения: 1896
Откуда: Питер
Благодарил (а): 13 раз.
Поблагодарили: 32 раз.
gudleifr писал(а):
Если же FORTH-программа компилируется, то нет ничего странного, что стиль ее написания тяготеет к наиболее "естественному" компилируемому языку - C, или более привычному C++.

F-MAP писал(а):
В этом коде наверно структуру использовать намного читабельней , например как в SPF

sic!

_________________
Когда я говорю "понимаю" - это не значит, что я согласен, не значит, что я понимаю и вообще не значит, что я слушаю тебя. /Чарли, "2 1/2 человека"/


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

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 272
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Код:
В этом коде наверно структуру использовать намного читабельней , например как в SPF

Знаю. Просто хочется чуть больше независимости от СПФ, подправлю

Цитата:
А при использовании HASH, не избежать ведь коллизий, может привести к чему нибудь не хорошему

Ну кол-во записей явно меньше миллиарда будет :) 32-битный хеш достаточно надёжен
А так тоже думаю отказаться от него. Но чем тогда выразить идентификатор группы? Можно и строку в четыре байта, но это не серьёзно.
А, допустим, восемь использовать. Доп.функционал или плохочитаемый код на получится.
Можно конечно MMX использовать как раз документация есть, но по-хорошему значение подопытного регистра надо где-то и сохранить. Что доп.проблемы может привнести. Про реализацию двоичной арифметики молчу.
Или на строке в 4 байта остановиться. Что просто, но также как и хеш малоинформативно
.
.

_________________
Цель: написать форт-систему
Подцель: написать оптимизирующий компилятор
текущая задача: переписать if-else-then


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Навешивание обработчиков на компиляцию
СообщениеДобавлено: Ср май 17, 2017 22:00 
Не в сети

Зарегистрирован: Пт июн 06, 2008 14:21
Сообщения: 83
Откуда: Карелия
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
Код:
В этом коде наверно структуру использовать намного читабельней , например как в SPF

Знаю. Просто хочется чуть больше независимости от СПФ, подправлю

Цитата:
А при использовании HASH, не избежать ведь коллизий, может привести к чему нибудь не хорошему

Ну кол-во записей явно меньше миллиарда будет :) 32-битный хеш достаточно надёжен
А так тоже думаю отказаться от него. Но чем тогда выразить идентификатор группы? Можно и строку в четыре байта, но это не серьёзно.
А, допустим, восемь использовать. Доп.функционал или плохочитаемый код на получится.
Можно конечно MMX использовать как раз документация есть, но по-хорошему значение подопытного регистра надо где-то и сохранить. Что доп.проблемы может привнести. Про реализацию двоичной арифметики молчу.
Или на строке в 4 байта остановиться. Что просто, но также как и хеш малоинформативно
.
.

Тогда может перейти к глобальному идентификатору GUID? Как в СОМ интерфейсах...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Навешивание обработчиков на компиляцию
СообщениеДобавлено: Чт май 18, 2017 07:19 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 272
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
F-MAP писал(а):
Тогда может перейти к глобальному идентификатору GUID? Как в СОМ интерфейсах...

Для каждой группы записей? Не слишком ли?

_________________
Цель: написать форт-систему
Подцель: написать оптимизирующий компилятор
текущая задача: переписать if-else-then


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Навешивание обработчиков на компиляцию
СообщениеДобавлено: Сб май 20, 2017 15:27 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 272
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Вот механизм предкомпиляции в действии:

Код:
\ Таблица предкомпияции
\ 20.05.2017 ~er
\

\ Избавился от хеширования
\ подключил структуры
\ изменил разрядность некоторых элементов структуры

REQUIRE STRUCT: ~ER\STRUCT-SUGAR.F





STRUCT: rec-event
CELL       -- gr-e
CELL       -- gr-h
CELL       -- group-name
30 CELLS    -- sp-ev
30 CELLS    -- sp-h
STRUCT;


0 VALUE EVENT-TABLE


\ добавить запись-пустышку в таблицу и
\  выдать адрес записи
: new-event-rec \ xt-e - rec-addr
EVENT-TABLE >R
BEGIN
   R@ gr-e @ 0=
   R@ gr-e @ -1 =
   OR
   INVERT   

WHILE
   R> rec-event + >R
REPEAT

\ очистка на случай, если запись удалена
R@ rec-event 0 FILL

1 R@ gr-e ! 
R@ sp-ev  !
R>
;

\ если xt имееся в записях или группах записей,
\ то выдать адрес записи и вернуть истину
\ в противном случае xt и ложь

: event-rec? \ xt -- addr-rec -1| xt 0
EVENT-TABLE >R
BEGIN    
      R@ gr-e @ 0= IF RDROP 0 EXIT THEN
      R@ gr-e @ -1 <> IF
               DUP
               R@ sp-ev  R@ gr-e @ CELLS
               ROT >R
               RP@ CELL
               SEARCH NIP NIP
               RDROP
               INVERT \ 0 ЕСЛИ ИСТИНА
            ELSE
               -1
            THEN
      
      
WHILE
R> rec-event + >R
REPEAT
DROP
R> -1

;

\ пометить запись для удаления в будущем
: mark-delete-ev \ addr-rec --
rec-event -1 FILL
;



\ создать псевдоним для группы из строки
\ псевдоним имеет длину равную CELL
: event-group-psevd \ addr u -- n
   DUP CELL <    
         IF
            0 >R
            RP@ SWAP MOVE
            R>
         ELSE
            DROP @
         THEN
;


\ собрать группу из ранее записанных
\ в таблицу слов предкомпиляции, 
\ которые имеют адреса xt1 ... xtn количеством n
\ Группа сотворяется с псевдонимом addr u
\ Если среди xt есть те, которые отсутствуют в таблице,
\ то ловим исключение
\ Если запиcи пусты т.е. имеют только xt,
\ то запись помечается для удаления
\ создаётся запись-группа и возвращаеся её адрес
\



: compute-group \ xt1 xt2 .. xtn n addr u -- addr-rec

   event-group-psevd >R
   DUP >R
   BEGIN
      
      R@ PICK R@ - DUP \ если очередное взятие не равно n
   WHILE
   R@ +
\   DUP .    \ отладка
   event-rec?
   0= IF . CR -3001 THROW THEN
   REPEAT
   DROP
   R@

   BEGIN
   SWAP
   >R
      R@ gr-h @          \ если есть обработчик
      R@ gr-e @ 1 >        \ или это группа
      OR          
      0=   
         IF R@ mark-delete-ev THEN
   RDROP
   1-
   DUP 0=
   UNTIL
   DROP
   DROP
   0 new-event-rec >R
   RP@ CELL+ @ R@ gr-e !

   \ переносим данные со стека в таблицу. Стек растёт вниз!!!
   SP@
      R@ sp-ev 
      RP@ CELL+ @ CELLS
                   MOVE

   \ очищаем стек от слов
   SP@ RP@ CELL+ @ CELLS + SP!
   R>
   RDROP
   
   DUP group-name   R> SWAP !
      
       

;

\ добавить обработчик xt-h к слову предкомпиляции xt-e
\ если xt-e не слово предкомпиляции, то ловим исключение
\ если xt-e не в записи, а в группе записей,
\ то создать запись xt-e с обработчиком

: ->EVENT \ xt-h xt-e --
   >R
   R@ event-rec?
   0= IF . CR -3001 THROW THEN

   \ если слово предкомпиляции в группе
   DUP gr-e @ 1 > IF     
            EVENT-TABLE >R
            rec-event +
            TO EVENT-TABLE
            RP@ CELL+ @ \ D: -- xt-e
            \ если слово только в группе или группах,
            \ то создаём запись
            event-rec? 0=
               IF    
                  R> TO EVENT-TABLE
                  new-event-rec
               ELSE   
                  DROP \ rec-addr --
               \ продолжаем искать запись
               \
   
            \      ." RECURSER" CR   \ отладка
            \      DEPTH .SN CR   \ отладка

                  RP@ CELL+ @ \ D: -- xt-e
                  RECURSE
                  R> TO EVENT-TABLE
                  RDROP EXIT
               THEN
         THEN

\   DEPTH .SN CR   \ отладка

   >R \ R: -- rec-addr
   
   R@ gr-h @ CELLS    \ СМЕЩЕНИЕ
   R@ sp-h       \ ДЛЯ ПОКЛАДА ОБРАБОТЧИКА
   +
   !
\   DEPTH .SN CR   \ отдадка
   
   \ увеличить кол-во обработчиков на 1
   R@ gr-h 1+!

   RDROP
   RDROP
;      
   
: find-next-rec \ xt-e rec-addr1 -- xt-e rec-addr? -1 | xt-e 0   
2>R
BEGIN
      BEGIN
         R@ gr-e @ 0=
         R@ gr-e @ -1 =
         OR INVERT
      WHILE
         R@ sp-ev R@ gr-e @ CELLS
         RP@ CELL+ CELL
         SEARCH NIP NIP
         IF 2R> -1 EXIT THEN
         R> rec-event + >R
      REPEAT

\ Внимание!!! манипуляция со стеком потока-управления
R@ gr-e @ -1 = IF
         R> rec-event + >R
         [ 2SWAP ] AGAIN
      THEN
RDROP
R> 0                
;


\ добавиь обработчик в группу слов предкомпиляции,
\ которая идентифицируется псевдонимом
\ если псевдоним не найден в записях
\ то получаем исключение

: ->EVENT-GROUP \ xt-h addr u --
   event-group-psevd
   EVENT-TABLE >R
   BEGIN
      R@ gr-e @
   WHILE
   R@ @ -1 <> IF
            
            R@ group-name @ OVER =
            R@ gr-e @ 1 >
            AND
            IF
               
               DROP
               R@ sp-h 
               R@ gr-h @ CELLS
               
               + !
               R@ gr-h 1+!
               RDROP
               EXIT
            THEN
         THEN
   R> rec-event + >R
   REPEAT
   -3003 THROW

;

USER-VALUE EVENT-RP@

\ выйти из обработчика и EVENT-COMPILE,
: EVENT-EXIT EVENT-RP@ RP! ;


: EVENT-COMPILE, \ FFA@1 xt1 -- FFA@? xt1|xt?|'noop
   RP@ TO EVENT-RP@
   >R
   R@ event-rec?
   0= IF -3005 THROW THEN
   DROP

   R@ EVENT-TABLE
   BEGIN
      find-next-rec
   WHILE         
      >R \ rec-addr
      R@ sp-h  R@ gr-h @
         0 ?DO
            I CELLS + >R
            \ xt-h:
            \ FFA@ xt -- ??? FFA@ xt
            R@ @ EXECUTE
            R>
           LOOP

      2DROP \ ... xt sp-h -- ...
      R> rec-event + R@ SWAP
   REPEAT
   RDROP   
                     
;


Код для тестов

Цитата:

REQUIRE SEE lib\ext\disasm.f
~ER\EVENT-TABLE2.F

\ выделяем память под таблицу
100000 ALLOCATE THROW
DUP 100000 0 FILL
TO EVENT-TABLE

' + new-event-rec DROP
' - new-event-rec DROP
' / new-event-rec DROP
' * new-event-rec DROP

' MOD new-event-rec DROP

' XOR new-event-rec DROP
' OR new-event-rec DROP
' AND new-event-rec DROP

' + ' -
' / ' *
' MOD
' XOR ' OR ' AND
8 S" AL_O" compute-group DROP


: handlerOPT_2op \ FFA@ xt -- FFA@ xt| FFA@1 'noop

HERE 5 - \ skip MOV EAX ???
6 - 6
['] DUP 6 COMPARE 0=
HERE 5 -
6 -
5 - \ skip MOV EAX ???
6 - 6
['] DUP 6 COMPARE 0=
AND

HERE 5 - C@ 0xB8 = \ eax mov-code
HERE 5 -
6 - 5 - C@ 0xB8 = \ eax mov-code
AND
AND IF >R
HERE 4 - @
HERE 5 - 6 - 4 - @
SWAP R@ EXECUTE
HERE 5 - 6 - DP !
HERE 4 - !
DROP
1 \ immediate-flag
['] NOOP

\ стек возвратов не освобождаем
\ за нас это делает слово ниже
EVENT-EXIT
THEN
;

' handlerOPT_2op S" AL_O" ->EVENT-GROUP

\ аналог СПФ-ского LIT, только без оптимизации на ходу
: LT, \ zn --
['] DUP 6 S,
0xB8 C, ,
;


HEADER TEST
10 LT, 20 LT, 6 ' * EVENT-COMPILE,
RET,

SEE TEST




Ну, и итог оптимизации:

Цитата:

~ER\EVENT-TEST.F

575E7B 8D6DFC LEA EBP , FC [EBP]
575E7E 894500 MOV 0 [EBP] , EAX
575E81 B8C8000000 MOV EAX , # C8
575E86 C3 RET NEAR


_________________
Цель: написать форт-систему
Подцель: написать оптимизирующий компилятор
текущая задача: переписать if-else-then


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Навешивание обработчиков на компиляцию
СообщениеДобавлено: Чт июн 08, 2017 14:14 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 406
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Victor__v писал(а):
Лично мне не нужна зверская оптимизация.
но просматривать отъилнайненный код 10 20 + выше моих духовных сил. Вот с этим смириться не могу :mrgreen:
Не нравится LITERAL и нравится Си , ну определи
: { POSTPONE [ ; IMMEDIATE
: } ] POSTPONE LITERAL ;
и тогда пиши вот так
{ 10 20 + }
Красота !


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Навешивание обработчиков на компиляцию
СообщениеДобавлено: Чт июн 08, 2017 14:51 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 406
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Victor__v писал(а):
Код:
\ создать псевдоним для группы из строки
\ псевдоним имеет длину равную CELL
: event-group-psevd \ addr u -- n
   DUP CELL <    
         IF
            0 >R
            RP@ SWAP MOVE
            R>
         ELSE
            DROP @
         THEN
;
MIN и MAX фортовское "наше всьо" :)
Код:
\ создать псевдоним для группы из строки
\ псевдоним имеет длину равную CELL
: event-group-psevd \ addr u -- n
        CELL UMIN
        0 >R
        RP@ SWAP CMOVE
        R>
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Навешивание обработчиков на компиляцию
СообщениеДобавлено: Чт июн 08, 2017 18:25 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 272
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Ага, спасибо заменю.
А ещё лучше:
Код:
mov ecx 4
cmp eax, ecx
cmovbe eax, ecx
xor edx edx
mov ebx esp
lea ebx -4 [ebx]
mov [ebx] edx
mov ecx [ebp]

\ прыгай сюда

mov dl [ecx]
mov [ebx] dl
inc ecx
inc ebx
dec eax
jne \ к фразе :)
mov eax, -4 [esp]
lea ebp 4 [ebp]
ret


Ну,это так в порядке бреда

_________________
Цель: написать форт-систему
Подцель: написать оптимизирующий компилятор
текущая задача: переписать if-else-then


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

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


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

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


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

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