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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 150 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 12, 2007 10:53 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
mOleg писал(а):
И при этом захотим получить форт-систему, с минимальными правками ФВМ на портирование - в идеале вообще без правок ФВМ обойтись - а только правкой ЦК


Для минизации правок ФВМ , достоточно просто минимизировать количество примитивов.
А ЦК меньше всего хотелось-бы трогать.


mOleg писал(а):
такой псевдоассемблер позволил бы просто писать низкоуровневые слова ФВМ


вот ! в содах
Код:
CODE !
8B C, 55 C,  00   C,    \ MOV     EDX , 0 [EBP]
89 C, 10 C,        \ MOV     [EAX] , EDX
8B C, 45 C, 04   C,    \ MOV     EAX , 4 [EBP]
8D C, 6D C, 08   C,    \ LEA     EBP , 8 [EBP]
C3 C,                        \   RET     NEAR
END-CODE   Ok


Писть кто нибудь напишет MOV псевдоассемблера для x86.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 12, 2007 13:04 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Mihail писал(а):
Писть кто нибудь напишет MOV псевдоассемблера для x86.


MOVов лучше сделать несколько в зависимости от типа адресации и
использовать постфиксную нотацию

Код:

: >2OP ( reg1 reg2 -- kod )
8 LSHIFT SWAP 11 LSHIFT OR ;

:  MOV, ( reg1 reg2 -- )  \ MOV reg1,reg2
  >2OP   0xC08B OR W, ;

:  @MOV, ( reg1 reg2 -- )  \ MOV reg1,[reg2]
  >2OP   0x008B OR W, ;

:  !MOV, ( reg1 reg2 -- )  \ MOV [reg1],reg2
  >2OP   0x0089 OR W, ;

:  #MOV, ( n reg -- )  \ MOV     reg , # n
  11 LSHIFT 0xC0C7  OR W, , ;



Можно с автоинкрементом. Если процессор не поддерживает автоинкремент,
можно сделать макрос:

Код:
: @MOV++,  ( reg1 reg2 -- )   \ MOV reg1,[reg2]    ADD reg2, # 4
   DUP >R @MOV,
   4 R>  #ADD,
;



Этот ассемблер можно использовать для создания традиционного
Код:

: MOV
  ASM_INTERPRET
ADR_TYPE @
CASE
&reg1,reg2  OF  MOV,  ENDOF
&reg1,[reg2]  OF @MOV,  ENDOF
&[reg1],reg2  OF  !MOV,  ENDOF
&reg,#  OF  #MOV,  ENDOF
-333 THROW
ENDCASE
;


Где ASM_INTERPRET - интерпретатор регистров
&reg1,reg2 &reg1,[reg2] &[reg1],reg2 &reg,# - константы обозначаюшие тип адресации
ADR_TYPE - переменная инициализируемая ASM_INTERPRET


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

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

CODE !
8B C, 55 C, 00 C, \ MOV EDX , 0 [EBP]

89 C, 10 C, \ MOV [EAX] , EDX
8B C, 45 C, 04 C, \ MOV EAX , 4 [EBP]
8D C, 6D C, 08 C, \ LEA EBP , 8 [EBP]
C3 C, \ RET NEAR
END-CODE Ok

Писть кто нибудь напишет MOV псевдоассемблера для x86.


На самом деле хоть и есть слово MOV, но как таковой команды ассемблера MOV нет. Есть много команд
MOV R1, R2
MOV R1, [R2]
MOV [R1], R2 и т.д.
Поэтому написать команду MOV означает написать множество команд пересылки.
В форте используются немного команд из этого множества, но их-то уж все-равно писать придется.
Синтаксис по моему лучше сделать таким образом, чтобы имена регистров выступали как параметры, а методы адресации, используемые в командах "зашивать" в имена команд. Методов адресации не так много для фон-неймановских или гарвардских архитектур поэтому синтаксических конструкций получится тоже немного.
Например для MOV
R=R
R=@R
@R=R
R=@RR
@RR=R
@=R
R=@
R=#
формат регистров я задаю буквами b - байт, w - слово, ничего-двойное слово(для 32 разрядов) перед обозначением регистров, например bR=bR.
Вообще данный подход позволяет достаточно быстро написать ассемблер для любого микропроцессора с указанными выше архитектурами. Причем такой синтаксис позволяет вводить и новые методы адресации для команд. Например в X86 нет адресации память-память, но если бы была то @R=@R или @=@R и т.д. и т.п.
Привязка обобщенных мнемоник к форматам команд конкретного процессора - параметризация и есть переход к командам конкретного процессора. Размер исходного текста параметризующей части будет зависеть от набора процессоров, поддерживаемых таким ассемблером.
Для СПФ используется около 40 целочисленных команд ассемблера из всего их множества. Параметризовать эти команды под конкретный микропроцессор гораздо проще, чем написать весь ассемблер хотя бы для целочисленной арифметики.
Вообщем пусть не всеобщий, но ассемблер для подавляющего множества существующих микропроцессоров, да еще в плане использования его для Форта написать несложно. Вопрос - нужно ли. Для меня, например, не нужно. Я работаю с 3-4-мя микропроцессорами разных типов, ну еще X86 и все. Это для тех кто делает МП на ПЛИС может еще интересно, но и то там архитектур думаю не будет много - проще сделать новый асм на базе уже существующего. Да и форты разные бывают - вот ретрофорт весь на ассемблере написан.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 12, 2007 16:32 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
chess писал(а):
Например для MOV
R=R
R=@R
@R=R
R=@RR


Можно и так. Где-то это мне начинает нравится.
Для переходов можно использовать средства структурного программирования
Для x86:


Код:
0x75 CONSTANT 0=   0x74 CONSTANT 0<>   0x79 CONSTANT 0<
0x78 CONSTANT 0>=  0x7D CONSTANT <     0x7C CONSTANT >=
0x7F CONSTANT <=   0x7E CONSTANT >     0x73 CONSTANT U<
0x72 CONSTANT U>=  0x77 CONSTANT U<=   0x76 CONSTANT U>
0x71 CONSTANT OV   0x70 CONSTANT NOV   0xE1 CONSTANT <>C0=
0xE2 CONSTANT C0=  0xE0 CONSTANT ?C0=  0xE3 CONSTANT C0<>

: SIF     (  - a) I'  EXECUTE  C,  HERE ( origin)  0 C, ( blank) ;
: SWHILE  ( a1 "opcode" - a2 a1) SIF SWAP ;
: STHEN   ( a -) HERE OVER 1+ - SWAP C! ;
: SELSE   ( a - a') 0xEB ( short jmp) C,
  HERE OVER - SWAP C!  HERE  0 C, ;
: SBEGIN  ( - a) HERE ;
: SUNTIL_ ( a opc -) C,  HERE  1+ - C, ;
: SUNTIL  ( a -) I'  EXECUTE  SUNTIL_ ;
: SAGAIN  ( a -) 0xEB SUNTIL_ ;
: SREPEAT ( a a1 -) SAGAIN STHEN  ;

: SLOOP   ( a -) 0xE2 SUNTIL_ ;
: SLOOPZ  ( a -) 0xE1 SUNTIL_ ;
: SLOOPNZ ( a -) 0xE0 SUNTIL_ ;

: LIF    ( opcode - a) I'  EXECUTE  0xF10 + W,  HERE ( origin)  0 , ( blank) ;
: LWHILE ( a1 opcode - a2 a1) LIF SWAP ;
: LTHEN  ( a -) HERE OVER CELL+ - SWAP ! ;
: LELSE  ( a - a') 0xE9 ( short jmp) C,
  HERE OVER - SWAP !  HERE  0 , ;
: LUNTIL ( a opc -)  I'  EXECUTE 0xF10 +  W,  HERE  CELL+ - , ;
: LAGAIN  ( a -) 0xE9 C, HERE  CELL+ - , ;
: LREPEAT ( a -) LAGAIN LTHEN ;



Можно и метки требующие 2-а прохода
В предыдущей моей реализации 2-х проходов была ошибка.
Правильнее:
Код:

REQUIRE $! ~mak\place.f

CREATE XSOURCE 0x101 ALLOT
0 VALUE X>IN
0 VALUE XDP
VARIABLE XFP 0 ,
VARIABLE XCURSTR

: [BEGIN]
>IN @ TO X>IN
  DP @ TO XDP
  SOURCE XSOURCE $!
  SOURCE-ID FILE-POSITION
DROP
XFP 2!
  CURSTR @ XCURSTR !
; IMMEDIATE

: [AGAIN]
   XSOURCE COUNT DUP #TIB ! TIB SWAP MOVE
   XCURSTR @ CURSTR !
   X>IN 1+  >IN  !
   XDP   DP   !
   XFP 2@  SOURCE-ID REPOSITION-FILE DROP
; IMMEDIATE

: [UNTIL]
  IF POSTPONE [AGAIN] THEN
; IMMEDIATE


\EOF test

0 VALUE XN

: 2: :
  1 TO XN
POSTPONE [BEGIN]
;

: 2;
XN IF
   XN 1- TO XN
   POSTPONE [AGAIN]
   EXIT
THEN
POSTPONE ; ; IMMEDIATE

2: HI   ." Hello!!"
[ CR .( PASS=) XN . ]
2;

: HA   ." HoHo!!"
[ CR .( PASS=) XN . ]
;

2: HU   ." HUUU!!"
[ CR .( PASS=) XN . ]
2;

HI HA



Кто-нибудь встречал UM* UM/MOD на Форте?

Но все-равно, стоит появится Си и в псевдоассемблере (для написания форта) потребность отпадает.
Его можно использовать при написание традиционного ассемблера.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 12, 2007 17:23 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Mihail писал(а):
Кто-нибудь встречал UM* UM/MOD на Форте?


Вот откопал:

Код:

: UM+   ( U U -- UD )
      OVER + TUCK U> NEGATE ; 

: D+ ( d d -- d )                       \ Double addition, as an example using UM+.
  >R SWAP >R UM+ R> R> + + ;

0x80000000 CONSTANT HighBit

   : (UM/Mod)                           \ Support for UM/MOD, factored out
     ( ud1 ud2 -- ud3 u4 )              \ to allow recursion.  Gives quotient
                                        \ u4 and remainder ud3.
     2DUP >R >R                         \ Save value of ud2i in this cycle.
     2OVER 2OVER DU<                    \ If ud2i is now > ud1 or
     OVER HighBit AND                   \ ud2i cannot double again ...
     OR IF                              \ cease recursion.
       2DROP 0                          \ Set ud3=ud1, u4=0 and let recursion
     ELSE                               \ unwind.
       2DUP D+                          \ Double ud2i
       RECURSE                          \ and repeat
       2*                               \ As recursion unwinds,
     THEN                               \ double u4 (initially u4=0).
     ROT ROT                            \ Bury u4 under ud3.
     R> R>                              \ Fetch ud2i for this cycle.
     2OVER 2OVER DU<      \ X
     IF                                 \ If ud3 < ud2i ...
       2DROP ROT                        \ Tidy up.
     ELSE                               \ Else do the work ...
       DNEGATE D+                       \ ud3 = ud3 - ud2i
       ROT 1+                           \ Increment u4.
     THEN                 \ Y
   ;

: UM/MOD   \ ( ud1 u2 -- u3 u4 )     \ Divide ud1 by u2, giving the
     ?DUP IF                            \ quotient u4 and the remainder u3.
       0 (UM/Mod) >R DROP R>
     ELSE                               \ If ud1=0 ...
       2DROP 0 0                        \ this code just returns 0 0.
                                        \ To report 'divide by 0', substitute
     THEN                               \ -10 THROW.
;



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 12, 2007 23:32 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Mihail писал(а):
mOleg писал(а):
И при этом захотим получить форт-систему, с минимальными правками ФВМ на портирование - в идеале вообще без правок ФВМ обойтись - а только правкой ЦК

Для минизации правок ФВМ , достоточно просто минимизировать количество примитивов.
А ЦК меньше всего хотелось-бы трогать.

минимизировать количество примитивов не всегда хочется - от них зависит скорость системы.
А ЦК нужен нормальный, к тому же легче править ЦК, нежели исходники системы, где все очень тесно увязано.

Mihail писал(а):
mOleg писал(а):
такой псевдоассемблер позволил бы просто писать низкоуровневые слова ФВМ

вот ! в содах
Код:

CODE !
8B C, 55 C, 00 C, \ MOV EDX , 0 [EBP]
89 C, 10 C, \ MOV [EAX] , EDX
8B C, 45 C, 04 C, \ MOV EAX , 4 [EBP]
8D C, 6D C, 08 C, \ LEA EBP , 8 [EBP]
C3 C, \ RET NEAR
END-CODE Ok


Писть кто нибудь напишет MOV псевдоассемблера для x86.

это не удобно править, сложно понять. Приходится думать какие регистры Целевого процессора соответствуют регистрам ФВМ.

То ли дело
CODE !
move temp, subtop
move [tos] , temp
move tos, CELL [top]
dheave 2 CELLS
exit
END-CODE
тут уже думаем в терминах ФВМ. По крайней мере регистры называем так, как принято в форте.
к тому же переход на кеширование, например двух регистров, не скажется на приведенном выше коде, как и переход на другой тип ШК, так же как и переход на другой процессор.
При этом как и в процессоре 8080 командам различного типа можно присвоить различные мнемоники: MOV MVI LD и так далее, за счет чего исключим анализ параметров команд.
И еще, есть идея, оформить каждую команду как словарь, и параметры будут находиться для каждой команды в отдельном словаре.

VOCABULARY move IMMEDIATE
: [tos] ... ;
: temp .. ;
: top .. ;

и так далее

вот такие у меня мысли


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 13, 2007 00:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Mihail писал(а):
Писть кто нибудь напишет MOV псевдоассемблера для x86.

MOVов лучше сделать несколько в зависимости от типа адресации и
использовать постфиксную нотацию

Код:

: >2OP ( reg1 reg2 -- kod )
8 LSHIFT SWAP 11 LSHIFT OR ;

: MOV, ( reg1 reg2 -- ) \ MOV reg1,reg2
>2OP 0xC08B OR W, ;

: @MOV, ( reg1 reg2 -- ) \ MOV reg1,[reg2]
>2OP 0x008B OR W, ;

: !MOV, ( reg1 reg2 -- ) \ MOV [reg1],reg2
>2OP 0x0089 OR W, ;

: #MOV, ( n reg -- ) \ MOV reg , # n
11 LSHIFT 0xC0C7 OR W, , ;


можно и так, но лучше тогда как-нибудь разнообразить имена, например
load - reg , # n
move - reg , reg
save - [reg] , reg

и так далее.
Дальше, постфиксным, ассемблер лучше не делать, тем более, что уже есть хороший пример в асме, который используется в СПФ.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 13, 2007 00:13 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Mihail писал(а):
Можно и так. Где-то это мне начинает нравится.
Для переходов можно использовать средства структурного программирования
Для x86:


кстати по-моему идеальное решение 8)
chess писал(а):
Например для MOV
R=R
R=@R
@R=R
R=@RR
@RR=R
@=R
R=@
R=#

а вот эти кракозябры мне совсем не по душе.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Я уже опасаюсь лезть со своим декларативным исходником, чтобы не вносить сумятицу в такое интересное обсуждение.

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 13, 2007 03:17 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
Я уже опасаюсь лезть со своим декларативным исходником, чтобы не вносить сумятицу в такое интересное обсуждение.

просто совсем не понятно, зачем такие сложности с декларативным исходником, когда можно проще и гибче сделать. А вообще во всем всегда приходится искать компромис 8)


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
вопрос писал(а):
Я уже опасаюсь лезть со своим декларативным исходником, чтобы не вносить сумятицу в такое интересное обсуждение.

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

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 13, 2007 17:01 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Mihail писал(а):
Можно и так. Где-то это мне начинает нравится.

Еще забыл сказать, что такая форма задания мнемоник близка к регулярным выражениям, поэтому из них легко получить краткую форму, например из R=R получается весь набор команд этого типа -
A=A (MOV EAX, EAX)
A=B
A=C
A=D
....
T=A
T=B (MOV EDI, EBX)
и т.д.
то есть не надо описывать каждую конкретную команду, описывается весь их набор сразу.
Mihail писал(а):
В предыдущей моей реализации 2-х проходов была ошибка.

За это спасибо - учту.
Многопроходная компиляция для меня предпочтительнее. Если ее распространить на форт, то будут просто делаться достаточно трудоемкие вещи, например
: w1000
...
val12 w34
123 w35
... ;
пусть слова w34, w35 немедленного исполнения и им для работы требуется взять значение переменной
val1 и число 123.
В случае мнопроходной компиляции при первом проходе определяется, что val1 при втором проходе должна быть исполнена, хотя у нее нет флага Immediate. Как бы слово w34 ставит режим [ перед переменной val1. Аналогично и для слова w35 - не надо ставить [ ] для числа 123.
Появляется возможность управлять поведением одних слов из других слов (один из аспектов контекстной компиляции). Это самые простые примеры упрощения синтаксиса.

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


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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
mOleg писал(а):
минимизировать количество примитивов не всегда хочется - от них зависит скорость системы.


Увеличить количество примитивов никогда не поздно. Это можно делать между делом, по мере необходимости.
К тому-же можно использовать макроподстановщик с оптимизатором. Задача-та в другом, а именно:
Подготовить шаблон с помощью которого можно создать Форт-систему за несколько минут для
процессора, к которому никакого ПО нет.

mOleg писал(а):
Дальше, постфиксным, ассемблер лучше не делать, тем более, что уже есть хороший пример в асме, который используется в СПФ.


Что за пример в СПФ?
Постфиксный элементарно реализуется, а главное просто делать макросы.

Код:
: REST++,  \ reg , [reg]++
    DUP >R   ( reg , [reg]  ) REST,   
   4 R>  #ADD,
;

: DPOP,   DPSP REST++, ;



Постфиксные команды я обозначаю суффиксом ","
Сделать из постфиксной команды префиксную очень просто. Вообще, все надо разделять на уровни.
Сложное базируется на простом.
Код:
: DPOP INTERPRET DPOP, ;


Если хочется несколько команд в одной строке

Код:

VECT INCT_V  ' NOOP TO INCT_V

: A; INCT_V ['] NOOP TO INCT_V ;

: DPOP A; ['] DPOP, TO  INCT_V  INTERPRET A; ;


Я использую P:

Код:

[IFNDEF] ASM_INTERPRET  : ASM_INTERPRET INTERPRET ;
[THEN]

: P: >IN @ '
  SWAP  >IN ! PARSE-NAME
1-  \ отбрасывается запятая
CREATED , POSTPONE \
DOES>
   >R A; R> @   TO INCT_V
       >IN @ >R
       ASM_INTERPRET
                   R> >IN @ >R >IN !  \ монипуляции с >IN ради обработчика
       A;          R> >IN !           \ ошибок
;

P: DPOP,
P: REST,
P: SAVE,
P: LOAD,
P: REST++,
P: #ADD,


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Решил таки запостить:

Всё же - программка - метаассемблер должна, например, сама решать, каким регистрам отвести какую роль на данный момент, имея их просто перечень

На прологе это выглядело бы приблизительно так

arithmetic_registers([a1,a2,a3,a4,a5,a6]).

для кого пролог необычен: следует понять - существуют такие-то арифметические регистры


/* далее функция состояния алгоритма операции (алгоритма примитива, который мы хотим реализовать)
state(Operation, InUse,Ressurs_List, Algorithm_Stages , Actions).
где Actions - получающаяся реализация, Algorithm_Stages - сам абстрактный алгоритм
Ressurs_List - в данном случае регистры, можно обобщить */

state(Operation, InUse,[], Algorithm_Stages, Actions):- fail.
читается - тупикoвая ветвь, если рессурс свободных регистров исчерпан (пустой список [])
на самом деле нетрудно сделать алгоритм "освобождения" регистра

state(Operation, InUse,[RL_HEAD|RL_TAIL], [AS_Head|AS_TAIL] , Actions):-
restrictions(AS_HEAD,RL_HEAD,unique), member(RL_HEAD, InUse),fail.

читается - тупиковая ветвь, если уникальный для данной операции регистр занят

state(Operation, InUse,Ressurs_List, [] , Actions):- assert( resolution(Operation,Actions)).
читается - в случае исчерпания необходимых шагов алгоритма - занести в базу данных перечень действий как решение для данной операции

state(Operation, InUse,[RL_HEAD|RL_TAIL], [AS_Head|AS_TAIL] , Actions):-
required(AS_HEAD,register), !, no_restrictions(AS_HEAD,RL_HEAD), action(AS_HEAD,RL_HEAD,ACTION),
state(Operation, [RL_HEAD|InUse],RL_TAIL, AS_TAIL , [ACTION|Actions]) .

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

state(Operation, InUse,Ressurs_List, Algorithm_Stages , Actions):-
required(AS_HEAD,register), !, resort(Ressurs_List,RL_2),
state(Operation, InUse,RL_2, Algorithm_Stages , Actions).

читается - пресортировать список свободных регистров с тем, чтобы порядок их был другим и повторить этап с пересортированным списком.

alg_m(adding, algorithm_Stages).
читается - для примитива операции сложения существует такая последовательность шагов
algorithm_Stages - их list

inuse(adding, inUse).
читается - до начала операции сложения уже будут задействованы такие регистры
inUse - их list

search(Operation):-
alg_m(Operation, Algorithm_Stages),inuse(Operation, InUse), arithmetic_registers(Ressurs_List)
state(Operation, InUse,Ressurs_List, Algorithm_Stages, []).

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

Не кажется сложным? На самом деле, все эти строки общие для всех операций (правда, тут несколько упрощений и схематизмов)

для какой-либо другой операции нужны только другие строки , вместо тех, кот. выделенные рыжим, всё остальное остаётся
семь строчек плюс по две строчки для каждой операции ...
Плюс ограничения и перечни регистров (ещё строчек двадцать-сорок). Зато всё ищет само и от процессора к процессору меняется только "ограничения" и "реализация". Т.е. то, во что преобразуется на выходе конечный результат поиска.

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Особенность такого поиска в том, что для добавления примитива, если нам этого хотелось бы, мы добавляем одну-две строки и за пару секунд (больше на самом деле) готова новая реализация

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 150 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10  След.

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


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

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


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

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