Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 04:01

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: программные "регистры"
СообщениеДобавлено: Чт мар 05, 2009 12:36 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
позвольте представить Вам комбинацию двух идей,
одна из них предложена chess-ом в конкурсе решения задач,
другая ссылка правильно оформлeнная, чтобы форум не корежло (admin)

программные "регистры" это поименованные ячейки на стеке, определить
их очень легко: 3| ( n3 n2 n1 -- R3 R2 R1 ) почти мгновенно устанавливаются
две user переменные и верхний элемент стека доступен как R1, второй как R2 ну а
третий как R3, теперь в одном или нескольких словах (определениях) можно
использовать для доступа эти имена. Это поможет сократить жонглирование на стеке,
улучшит читабельность кода. Мы можем используя эти имена привязать к ним целый
букет операций свойственных настоящим железным регистрам.

Вот как это выглядит на стеке:


\ дно <-- стек --> вершина
\
\ --------------------------------------------------
\ |x|x|R9|R8|R7|R6|R5|R4|R3|R2|R1|x|x|x|x|x|
\ --------------------------------------------------
\ ................................................^.........^
\ ...........................................FIX-SP @...SP@


Удалить определенные нами регистры можно словом |0, а аккуратно
вырезать словом |x. Эта реализация на SPF, но наверно легко можно
сделать и на Кварке.

Примеров использования пока нет, приглашаются все желающие.

Код:
USER FIX-NREG
USER FIX-SP

\ определить пул из n регистров

: R| ( n -- ) FIX-NREG ! SP@ CELL - FIX-SP ! ;

: RN ( n -- An ) CELLS FIX-SP @ + ;

\ удалить регистры и все что сверху них на стеке

: |0 FIX-SP @ FIX-NREG @ CELLS + CELL + SP! ;

\ удалить регистры и оставить n верхних элементов стека

: |N ( R1...Rk n -- Rk-n...Rk  ) N>R |0 NR> DROP ;

\ удалить текущие регистры и оставить все что сверху и снизу

: |x ( -- ) FIX-SP @ FIX-NREG @ CELLS +  SP@ - CELL /  FIX-NREG @ -  |N ;


\ Define register pool
: 1| 1 R| ;    : 2| 2 R| ;    : 3| 3 R| ;
: 4| 4 R| ;    : 5| 5 R| ;    : 6| 6 R| ;
: 7| 7 R| ;    : 8| 8 R| ;    : 9| 9 R| ;

\ R1..R9 ( -- x )  Reads the R1..R9 register.

: R1 1 RN @ ;  : R2 2 RN @ ;  : R3 3 RN @ ;
: R4 4 RN @ ;  : R5 5 RN @ ;  : R6 6 RN @ ;
: R7 7 RN @ ;  : R8 8 RN @ ;  : R9 9 RN @ ;

\ >R1..>R9 ( x -- )  Writes to the R1..R9 register.

: >R1 1 RN ! ;   : >R2 2 RN ! ;   : >R3 3 RN ! ;
: >R4 4 RN ! ;   : >R5 5 RN ! ;   : >R6 6 RN ! ;
: >R7 7 RN ! ;   : >R8 8 RN ! ;   : >R9 9 RN ! ;

\ R1@..9@ ( -- x )  Read the memory pointed to by the R1..R9 register.

: R1@ R1 @ ;  : R2@ R2 @ ;  : R3@ R3 @ ;
: R4@ R4 @ ;  : R5@ R5 @ ;  : R6@ R6 @ ;
: R7@ R7 @ ;  : R8@ R8 @ ;  : R9@ R9 @ ;

\ R1!..R9! ( -- x )  Write the memory pointed to by the R1..R9 register.

: R1! R1 ! ;   : R2! R2 ! ;   : R3! R3 ! ;
: R4! R4 ! ;   : R5! R5 ! ;   : R6! R6 ! ;
: R7! R7 ! ;   : R8! R8 ! ;   : R9! R9 ! ;

\ R1@+..R9@+ ( -- x ) Read memory pointed to by R1..R9, increment R1..R9 by one cell. R1..R9 post-incremented read.

: R1@+ R1 DUP CELL+ >R1 @ ; : R2@+ R2 DUP CELL+ >R2 @ ; : R3@+ R3 DUP CELL+ >R3 @ ;
: R4@+ R4 DUP CELL+ >R4 @ ; : R5@+ R5 DUP CELL+ >R5 @ ; : R6@+ R6 DUP CELL+ >R6 @ ;
: R7@+ R7 DUP CELL+ >R7 @ ; : R8@+ R8 DUP CELL+ >R8 @ ; : R9@+ R9 DUP CELL+ >R9 @ ;

\ R1@-..R9@- ( -- x ) Read memory pointed to by R1..R9, decrement R1..R9 by one cell. R1..R9 post-decremented read.

: R1@- R1 DUP CELL- >R1 @ ; : R2@- R2 DUP CELL- >R2 @ ; : R3@- R3 DUP CELL- >R3 @ ;
: R4@- R4 DUP CELL- >R4 @ ; : R5@- R5 DUP CELL- >R5 @ ; : R6@- R6 DUP CELL- >R6 @ ;
: R7@- R7 DUP CELL- >R7 @ ; : R8@- R8 DUP CELL- >R8 @ ; : R9@- R9 DUP CELL- >R9 @ ;
                                                             
\ R1!+..R9!+ ( x --  ) Write to the memory pointed to by R1..R9, and update R1..R9.

: R1!+ R1 TUCK ! CELL+ >R1 ; : R2!+ R2 TUCK ! CELL+ >R2 ; : R3!+ R3 TUCK ! CELL+ >R3 ;
: R4!+ R4 TUCK ! CELL+ >R4 ; : R5!+ R5 TUCK ! CELL+ >R5 ; : R6!+ R6 TUCK ! CELL+ >R6 ;
: R7!+ R7 TUCK ! CELL+ >R7 ; : R8!+ R8 TUCK ! CELL+ >R8 ; : R9!+ R9 TUCK ! CELL+ >R9 ;

\ R1!-..R9!- ( x --  ) Write to the memory pointed to by R1..R9, and update R1..R9.

: R1!- R1 TUCK ! CELL- >R1 ; : R2!- R2 TUCK ! CELL- >R2 ; : R3!- R3 TUCK ! CELL- >R3 ;
: R4!- R4 TUCK ! CELL- >R4 ; : R5!- R5 TUCK ! CELL- >R5 ; : R6!- R6 TUCK ! CELL- >R6 ;
: R7!- R7 TUCK ! CELL- >R7 ; : R8!- R8 TUCK ! CELL- >R8 ; : R9!- R9 TUCK ! CELL- >R9 ;

\ nR1@..nR9@ ( n -- x ) Read the memory pointed to by the R1..R9 register plus n (literal) address units.

: nR1@ CELLS R1 + @ ;  : nR2@ CELLS R2 + @ ;  : nR3@ CELLS R3 + @ ;
: nR4@ CELLS R4 + @ ;  : nR5@ CELLS R5 + @ ;  : nR6@ CELLS R6 + @ ;
: nR7@ CELLS R7 + @ ;  : nR8@ CELLS R8 + @ ;  : nR9@ CELLS R9 + @ ;

\ nR1!..nR9! ( n x -- ) Write the memory pointed to by the R1..R9 register plus n (literal) address units.

: nR1! CELLS R1 + ! ;  : nR2! CELLS R2 + ! ;  : nR3! CELLS R3 + ! ;
: nR4! CELLS R4 + ! ;  : nR5! CELLS R5 + ! ;  : nR6! CELLS R6 + ! ;
: nR7! CELLS R7 + ! ;  : nR8! CELLS R8 + ! ;  : nR9! CELLS R9 + ! ;

\ оставить на стеке 1..9 верхних ячеек
: |1 1 |N ;    : |2 2 |N ;    : |3 3 |N ;
: |4 4 |N ;    : |5 5 |N ;    : |6 6 |N ;
: |7 7 |N ;    : |8 8 |N ;    : |9 9 |N ;



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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
А я вот думаю, что такие непонятные сложности не нужны. Локальных переменных вполне достаточно.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Кстати о программных регистрах.
Можно просто их ввести, причем в качестве регистров можно использовать
аппаратные регистры - ниже показано использование регистров XMM0-XMM7 в качестве регистров a b c d.
Их использование практически не имеет побочных эффектов.
Регистры a b c d могут использоваться как 32 (cell) и как 64 разрядные (2cell).
Набор команд с этими регистрами на уровне форта ограничил двумя типами команд
(считаю что этого будет достаточно).
1. снять одинарное(двойное) число со стека параметров - положить в регистр
2. из регистра переслать на стек одинарное(двойное) значение.

Если не подгружать ассемблер, то вводятся в маш. коде так:
Код:
\ загрузка регистров со стека
: >a  [ 0xC06E0F66 , ] DROP ; : 2>a [ 0xC06E0F66 , ] DROP [ 0xC86E0F66 , ] DROP ;
: >b  [ 0xD06E0F66 , ] DROP ; : 2>b [ 0xD06E0F66 , ] DROP [ 0xD86E0F66 , ] DROP ;
: >c  [ 0xE06E0F66 , ] DROP ; : 2>c [ 0xE06E0F66 , ] DROP [ 0xE86E0F66 , ] DROP ;
: >d  [ 0xF06E0F66 , ] DROP ; : 2>d [ 0xF06E0F66 , ] DROP [ 0xF86E0F66 , ] DROP ;

\ содержимое регистра положить на стек
: a>  DUP [ 0xC07E0F66 , ]  ; : 2a>  DUP [ 0xC87E0F66 , ] DUP [ 0xC07E0F66 , ]  ;
: b>  DUP [ 0xD07E0F66 , ]  ; : 2b>  DUP [ 0xD87E0F66 , ] DUP [ 0xD07E0F66 , ]  ;
: c>  DUP [ 0xE07E0F66 , ]  ; : 2c>  DUP [ 0xE87E0F66 , ] DUP [ 0xE07E0F66 , ]  ;
: d>  DUP [ 0xF07E0F66 , ]  ; : 2d>  DUP [ 0xF87E0F66 , ] DUP [ 0xF07E0F66 , ]  ;

Если подгрузить ассм, то могут быть выражены чуть более быстрым кодом
(за счет однократного движения указателя стека параметров в случае работы с двойной разрядностью):
Код:
REQUIRE IDN ~CHESS/ASSM/SP-ASSM.F

: >a X0=A DROP ; : 2>a X0=A B=@P X1=B 2DROP ;
: >b X2=A DROP ; : 2>b X2=A B=@P X3=B 2DROP ;
: >c X4=A DROP ; : 2>c X4=A B=@P X5=B 2DROP ;
: >d X6=A DROP ; : 2>d X6=A B=@P X7=B 2DROP ;

: a> DUP  A=X0 ; : 2a> $ -4 @P=A B=X1 $ -8 @P=B A=X0 $ -8 Pa ;
: b> DUP  A=X2 ; : 2b> $ -4 @P=A B=X3 $ -8 @P=B A=X2 $ -8 Pa ;
: c> DUP  A=X4 ; : 2c> $ -4 @P=A B=X5 $ -8 @P=B A=X4 $ -8 Pa ;
: d> DUP  A=X6 ; : 2d> $ -4 @P=A B=X7 $ -8 @P=B A=X6 $ -8 Pa ;

Ценность использования регистров в том, что они всегда готовы.
Их не надо инициализировать и не надо заботиться о их содержимом при выходе из кода слова.
Да и код побыстрее получается.

Вот старая задача уже "при регистрах".
Код:
: SUBST  \ a0 u0 a1 u1 a2 u2 -- a u | S" "
2>c 2>b 2DUP        \ a0 u0 a0 u0  c[a2 u2] b[a1 u1]
2b> SEARCH NIP 2>a  \ a0 u0        a[a3 f3]
2c> SEARCH NIP      \ a4 f4
a> AND IF  2a> ( a4 a3 f3 ) DROP 2b> ( a4 a3 a1 u1 ) NIP + TUCK -
       ELSE ( a4 ) DROP S" " THEN
;

: s1  S" ..... <INP=456>....." S" <INP=" S" >" SUBST ;
s1 TYPE

REQUIRE METER ~CHESS/TASK/METER.F
METER s1

738 351
Ok

Трудоемкость их использования больше, чем у локальных переменных но меньше, чем у локальных стеков.
Впрочем это зависит от задачи. Для работы со строками, например, по-моему самый надежный и быстрый вариант.

Alex'у - вот сначала бы у вас задача появилась, а потом уже вот этот - ваш вариант работы с ячейками стека как с регистрами
приложили, как начало ее решения. И стало бы понятно, что задача типовая и требует типового решения(с прогр. регистрами).
А так, да, вроде есть реализация программных регистров, а где она будет эффективна - непонятно.

Если посмотреть еще раз на локалсы в SPF, то можно заметить, что какой-то аналог программным регистрам там есть:
Код:
: SUBST { a0 u0 a1 u1 a2 u2   \   a3 f3 a4  -- a u | S" " }
a0 u0 a1 u1 SEARCH NIP  TO f3  TO a3
a0 u0 a2 u2 SEARCH NIP
f3 AND IF a3 u1 + TUCK - ELSE DROP S" " THEN ;
Здесь как бы стек увеличивается на три ячейки для переменных a3 f3 a4 и фиксируется (на самом деле место им отводится на стеке возвратов), которым изначально нельзя поставить в соответствие ни один параметр лежащий на стеке. Дело в том, что объявить новый локус не в начале, а внутри
текста определения в SPF(да и во многих других форт-системах) нельзя, так неизвестен стековый эффект слов внутри определения на этапе
компиляции-нельзя зафиксировать адреса ячеек стека с параметрами. Поэтому приходится резервировать место в начальном локусе, а потом
просто засылать текущие параметры в эти зарезервированные ячейки(аналоги регистров).

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Alex писал(а):
Эта реализация на SPF, но наверно легко можно
сделать и на Кварке.

В Кварке похожими свойствами обладают стековые кадры, определяемые через FRAME{ }FRAME. Внутри стекового кадра можно пользоваться переменными ARG0 ARG1 ARG2... Удобство применения выявилось при рисовании графических примитивов, где на стеке могут быть переданы 4, 5, 6 и даже более параметров.


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
маленький примерчик
Код:
: SEARCH1 ( reg -- reg / a u )    R6 R5 R4 R3 SEARCH IF R3 R3 NEGATE D+ >R5 >R6 ELSE |0 S" " RDROP THEN ;

: SEARCH2 ( reg -- reg / a u )    R6 R5 R2 R1 SEARCH IF DROP >R4 ELSE |0 S" " RDROP THEN ;     

\ ........R6 R5 R4 R3 R2 R1
: SUBST ( a0 u0 a1 u1 a2 u2 -- a u )  6| SEARCH1 SEARCH2 R6 R4 R6 - |2 ;


обратите внимание на использование в нескольких словах, так сказать в микро-лексиконе (нано-лексиконе?),
на инициализацию и сброс


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

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

В Кварке похожими свойствами обладают стековые кадры, определяемые через FRAME{ }FRAME.

Интересно, можно ли построить общую классификацию такого рода конструкций (локалсов, фреймов и т.д.) и, соответственно, общий или однородный синтаксис для их описания?


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
Интересно, можно ли построить общую классификацию такого рода конструкций (локалсов, фреймов и т.д.) и, соответственно, общий или однородный синтаксис для их описания?

Мне думается, что проще объяснить, как можно в том или ином трансляторе организовать прямой доступ к стеку. Тогда реализация подобных конструкций не представит особой сложности.


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

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

Слова SP@ и SP! есть в большинстве форт-систем. Вот и прямой доступ.
В отличие от локальных меток SPF, механизм прямого доступа к параметрам стека может быть инициирован в любом месте кода определения в рантайме(на это надо очень мало времени), так как не требует именования, как это нужно для локальных переменных.

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
chess писал(а):
Слова SP@ и SP! есть в большинстве форт-систем. Вот и прямой доступ.

Вот именно. И тогда нет никакого смысла "закрывать" их еще чем-то, лучше разъяснять, какие следствия могут проистекать из наличия прямого доступа. А разводить терминологию с разными локалсами, стексами, фреймсами и хоббитсами - признак творческого кризиса.


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

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

кто такие хоббитсы?


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

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

Ну как же! Они еще у Горлума прелессссть отобрали :)


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Еще один пример использования программных регистров для реализации стексов,
в отличии от оригинальных chessa обратная нумерация
пример синтаксиса: 5\33415 ( 1 2 3 4 5 --> 3 3 2 5 1)

Код:

REQUIRE {  locals.f

\ ====программные регистры==============================================

USER FIX-NREG
USER FIX-SP

: RN ( n -- An ) CELLS FIX-SP @ + ;

: R| ( n -- ) FIX-NREG ! SP@ CELL - FIX-SP ! ;

: |0 FIX-SP @ FIX-NREG @ CELLS + CELL + SP! ;

: |N ( R1...Rk n -- Rk-n...Rk  ) N>R |0 NR> DROP ;

: |x ( -- ) FIX-SP @ FIX-NREG @ CELLS +  SP@ - CELL /  FIX-NREG @ -  |N ;

\ ======================================================================

: NOTFOUND { a u \ a1 a2 r1  -- }

  a C@ [CHAR] 1 [CHAR] 9 1+ WITHIN a 1+ C@ [CHAR] \ = AND

  IF ( " stacksy" )

   a C@ 48 - -> r1  a 2 + -> a1  a u + -> a2         r1 R|  a2 a1 ?DO I C@ 48 - RN @ LOOP  |x

  ELSE  a u NOTFOUND  THEN

;

\EOF

\ ======================================================================

1\       DROP
2\       2DROP
3\       2DROP DROP
4\       2DROP 2DROP
5\       2DROP 2DROP DROP
1\11     DUP
2\2121   2DUP
1\1111   DUP DUP DUP
2\212121 2DUP 2DUP
2\12     SWAP
3\213    ROT
3\132    -ROT
2\212    OVER
2\1      NIP
2\121    TUCK
4\2143   2SWAP
4\214321 2OVER
4\21     2NIP


Ну и так далее, можно использовать до 9 верхних элементов


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

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

Ах, эти...
Горлум тоже фотер?? Это сомнительная реклама, срочно переучить на Паскаль!!


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

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

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


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Хищник писал(а):
chess писал(а):
Слова SP@ и SP! есть в большинстве форт-систем. Вот и прямой доступ.

Вот именно. И тогда нет никакого смысла "закрывать" их еще чем-то, лучше разъяснять, какие следствия могут проистекать из наличия прямого доступа. А разводить терминологию с разными локалсами, стексами, фреймсами и хоббитсами - признак творческого кризиса.


Я конечно не Цицерон, отличаюсь косноязычием, попробую прокомментировать

прямой доступ это и великая опасность и огромная возможность,
что происходит здесь? - мы зафиксировали область памяти на стеке
да, да на самом нашем родном стеке, и теперь к этим элементам (ячейкам)
мы можем обращаться по номерам - дай 4-й элемент области, или
можем дать ему имя : 4th 4 RN @ ; и получить его значение вызвав 4th
мы начинаем работать со стеком совсем не стековыми методами, это дуальность
при грамотном использовании может дать хороший эффект.

Итак программные регистры это 2 user переменные и 5 слов.
FIX-NREG - переменная просто содержит количество резервируемых ячеек - регистров
FIX-SP - переменная хранит указатель стека на момент создания регистров + 1 ячейка
RN - слово поглащает номер регистра возвращает адрес ячейки соответствующего регистра
R| - слово на входе число регистров,уставливает наши переменные, тем самым создавая пул
обратите внимание - как быстро, всего два присваивания!
|0 - слово уничтожает регистры переставив указатель стека, мы теряем и все что выше на стеке!
|N - слово уничтожает регистры, но используя SPF-специфичные N>R и NR> сохраняет на стеке n ячеек
|x - слово уничтожает регистры, аккуратно вырезая их из стека
Вот она обратная сторона простоты создания- целых три слова для уничтожения.

Всего 2+5 обьекта, но мне кажется вполне можно дать им обособленное имя


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

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


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

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


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

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