Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс окт 21, 2018 12:54

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

Обзор темы - Еще один способ работы с параметрами на стеке
Автор Сообщение
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D

Это скорее не совсем извращения, а неординарный подход к проблеме.
Мне вот вспомнился процессор Z80 с двумя регистровыми парами, где нельзя сразу знать, какая именно активна...
Сообщение Добавлено: Ср апр 25, 2018 21:29
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Небольшое усовершенствование механизма качалки.
Иногда нужно дополнить набор параметров на исходном стеке небольшим количеством дополнительных параметров,
получаемых из исходных параметров на этом стеке.
Код:
: ~s   s1beg DUP S0 @ <> 60 AND + AddrSt ! ; \ после ~s параметры добавляются на тот же стек откуда они берутся
И тогда, например:
Код:
\ конкатенация строк в хипе
\        1  2  3  4    5 2+4
: s+ \ a1 u1 a2 u2 -- a u
  ~s 2> 4> + ALLOCATE THROW \ к существующим параметрам a1 u1 a2 u2 на исходном стеке добавляется
                                                \  адрес результирующей строки в хипе
  ~  1> 5> 2>      MOVE
     3> 5> 2> + 4> MOVE
     5> 2> 4> +
;
\ или стенографическая форма
\         1  2  3  4    5 2+4
: s+ \ a1 u1 a2 u2 -- a u
  /]24+h[152V352+4V524+ ; \ символ ']' это слово ~s
: tst
  S" 12 " S" AB " s+ S" cdef" s+   ;
tst TYPE

ПС. Интересный момент - полностью отсутствуют присвоения, все становится похожим на функциональный язык.
Не привожу примеры где параметры именуются произвольно - там все по-старому.
Сообщение Добавлено: Ср апр 25, 2018 16:55
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях"

Ну вот и нашелся ценитель мастерства :))
Сообщение Добавлено: Сб апр 14, 2018 18:23
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D
Сообщение Добавлено: Пт апр 13, 2018 22:03
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
А ничего так, что S0 это USER-переменная?

Ну так и задумано в SPF для поддержки многозадачности, а я не выключаю эту поддержку, закидывая значения адресов
оснований стеков 1 и 2 также в USER-переменную ( AddrSt ).
Victor__v писал(а):
А при вложенности качалка будет переключаться. Правильно понял?

Смысл качалки в чем? В том, что на исходном стеке лежат параметры, например так 1 2 3, где 1 - самый нижний параметр,
а 3 - самый верхний. Теперь мы начинаем выкладывать параметры с 1-го стека на второй в нужном нам порядке для обработки
этих выложенных на 2-ой стек параметров соответствующими процедурами-словами( второй стек перед этим очищается).
После обработки на 2-м стеке могут остаться новые параметры, которые в свою очередь могут быть выложены на 1-й стек,
также предварительно очищенный и т.д. Как такового вложения здесь не наблюдается.
В этом варианте нет нужды в словах типа SWAP OVER ROT >R R> и им подобным. Стеки рассматриваются как пары массив1-стек2,
а затем как стек1-массив2. На каком стеке мы остановимся не имеет значения, поэтому тут не вводится новый инструментальный контекст.
Сообщение Добавлено: Пт апр 13, 2018 20:44
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Код:
S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg

А ничего так, что S0 это USER-переменная?

А при вложенности качалка будет переключаться. Правильно понял?
Сообщение Добавлено: Пт апр 13, 2018 20:10
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Вспомнил еще одну свою-же старую идею варианта работы с параметрами на стеке - вариант, похоже наиболее для меня подходящий.
Код:
\ два стека параметров с одним указателем - "качалка"
             |<--60 байтов -->|
\ ------|----|---------|------|
\       sp1  s1beg     sp0    s0beg

S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg
USER AddrSt  s0beg AddrSt !
: ~  \ переключатель стеков
  S0 @ s0beg =
  IF   s1beg DUP s0beg
  ELSE s0beg DUP s1beg THEN
  AddrSt ! S0 ! SP!
;
: ~0 \ исходное сосстояние качалки
  s0beg DUP S0 ! SP! ;

: [1 AddrSt @  4 - @ ;
: [2 AddrSt @  8 - @ ;
: [3 AddrSt @ 12 - @ ;
: [4 AddrSt @ 16 - @ ;
: [5 AddrSt @ 20 - @ ;
: [6 AddrSt @ 24 - @ ;
: [7 AddrSt @ 28 - @ ;
: [8 AddrSt @ 32 - @ ;
: [9 AddrSt @ 36 - @ ;

: SumSq \ 1 2 -- 11* 22* +
~ [1 [1 * [2 [2 * + ;
\ тоже в стенографической форме
: SumSq \ 1 2 -- 11* 22* +
/[11*22*+ ; \ здесь символ '['  это переключатель стеков - слово ~

1 2 SumSq .

Пс. В принципе вариант безопасный - не надо помнить какой из 2-х стеков текущий(выходной), а какой входной.
По сравнению с предыдущим вариантом нет пересылки параметров единым массивом.
Сообщение Добавлено: Чт апр 12, 2018 23:00
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
mOleg писал(а):
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)

А обосновать можете?
Обычно, как раз наоборот считается.


юзверь должен использоваться для конечной задачи, которую решает форт.
А, к примеру, механизм лок. переменных, явно вспомогателен.
Если же новый стек активно используется в многопоточном приложении, то пусть будет.
Но ежели это что-то вспомогательное, стреляющее отсюда и до обеда, (лок. переменные) то смысл это в пользовательскую память засовывать?
Сообщение Добавлено: Ср янв 31, 2018 14:02
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
_KROL писал(а):
Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю?

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

Чем тебя пользовательская область памяти смущает мне не ясно, тем более, что стек каждого потока тоже в ней находится.
Сообщение Добавлено: Ср янв 31, 2018 14:00
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)
Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю?
Хоть несколько стеков объявлю, главное не то, что они в USER-области, а чтобы нормально взаимодействовали между собой (не перекрывая друг друга).
Сообщение Добавлено: Ср янв 31, 2018 11:53
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)

А обосновать можете?
Обычно, как раз наоборот считается.
Сообщение Добавлено: Ср янв 31, 2018 11:23
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
chess писал(а):
Зато не требуется переопределение ниже указанных слов для возможности использовать
локальные переменные внутри цикла DO LOOP и независимо от изменения
содержимого стека возвратов словами >R R> , ну и других слов создаваемых самостоятельно,
использующих стек возвратов
DO
?DO
LOOP
+LOOP
>R
R>
RDROP
2>R
2R>

Ну памяти-то в ПК предостаточно (например, кэш 3 уровня у меня для каждого из 8-ми поддерживаемых аппаратно потоков, аж 8 Мб).


Я смягчил это в своём форте введением механизма предкомпиляции.
К тому же в этом (доопределении) нет ничего сложного.
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)
Сообщение Добавлено: Ср янв 31, 2018 09:06
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Зато не требуется переопределение ниже указанных слов для возможности использовать
локальные переменные внутри цикла DO LOOP и независимо от изменения
содержимого стека возвратов словами >R R> , ну и других слов создаваемых самостоятельно,
использующих стек возвратов
DO
?DO
LOOP
+LOOP
>R
R>
RDROP
2>R
2R>

Ну памяти-то в ПК предостаточно (например, кэш 3 уровня у меня для каждого из 8-ми поддерживаемых аппаратно потоков, аж 8 Мб).
Сообщение Добавлено: Вт янв 30, 2018 21:47
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Цитата:
Вариант с использованием стека в USER памяти
( стек возвратов при этом не используется )


Ну, так не интересно.
К тому же этот вариант тяжелей использовать. А если памяти не хватит? Тут либо стек, который по умолчанию безконечный, или хип.
Сообщение Добавлено: Вт янв 30, 2018 12:13
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Вариант с использованием стека в USER памяти
( стек возвратов при этом не используется )

Код:
USER dps 0 dps !
USER-CREATE ads 60 USER-ALLOT

: bs   ( N -- )
  1+ CELLS SP@ + DUP 4 dps +! ads dps @ + ! 60 - SP!
;
: prm  ( n -- An )
  CELLS NEGATE ads dps @ + @ +
;
: es
  SP@ DUP 60 + TUCK ads dps @ + @ -4 dps +! OVER - MOVE SP!
;
ps.
быстродействие тут даже чуть выше, чем в варианте реализации из SPF,
позволяет использовать локальные переменные при распараллеливании
приложений для многоядерных процессоров.
Сообщение Добавлено: Пн янв 29, 2018 22:28

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


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