Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн окт 21, 2019 17:47

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Реализация сопрограмм на форте
СообщениеДобавлено: Чт фев 07, 2019 22:41 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 906
Благодарил (а): 1 раз.
Поблагодарили: 8 раз.
Думал над некоторыми операциями парсинга и вспомнил, что некоторые вещи удобно решать с помощью сопрограмм.
Вот реализовал на Нове. Код несложный можно портировать и на СПФ при желании.

Код затачивался под "синхронное" исполнение итераторов, поэтому у каждой сопрограммы свой стек возвратов
Код:
~ER\data-stack\REVERSE.F
~ER\STRUCT\STRUCT-SUGAR.F


USER-VALUE coop-stack

STRUCT: coop-struct
CELL -- LAST-RP      \ точка сброса. "выход" из сопрограмм
CELL -- countC      \ сколько всего сопрограмм
CELL -- currentC   \ номер текущей сопрограммы
STRUCT;

: coop-addr coop-stack coop-struct + ;

\ каждый элемент стека сопрограмм включает позицию присваиваемую указателю стека возвратов
\ и указатель на выделенную память под стек возвратов
STRUCT: coop-elem
CELL -- pos
CELL -- mem
STRUCT;

\ перенести позицию и память на стек сопрограмм
: >coopS \ pos mem --
coop-stack countC @ coop-elem *
coop-addr
+
>R
R@ mem !
R@ pos !
RDROP
coop-stack countC 1+!
;

\ безусловный переход на след. сопрограмму
: COOP-JMP      
coop-stack currentC 1+!
coop-stack currentC @
coop-stack countC @
= IF
coop-stack currentC 0!
coop-addr pos @
ELSE
coop-stack currentC @ coop-elem * 
coop-addr
+
pos @
THEN
RP!
;

\ освободить стеки возвратов и выделенную память под сопрограммы
: COOP-FREE
coop-stack countC @ >R
coop-addr
BEGIN R@ WHILE
DUP mem @ FREE THROW
coop-elem +
-1 RP@ +!
REPEAT
RDROP DROP
coop-stack FREE THROW
;


: COOP-EXIT      \ выйти из ВСЕХ сопрограмм. действие по умолчанию
coop-stack LAST-RP @ RP!
COOP-FREE
0   \ в >COOP перехват ошибок, это для THROW
;

: >COOP \ xt1 xt2 .. xtn n
DUP 30 > IF S" many cooprogramms" DROP THROW THEN
['] THROW >R

   coop-struct
   30 coop-elem *
   +
   ALLOCATE THROW
   FROM coop-stack KEEP!
RP@ coop-stack LAST-RP !
-1 coop-stack currentC !      \ поскольку COOP-JMP инкрементирует
>R
coop-stack countC 0!
R@ REVERSE
BEGIN R@ WHILE
980 CELLS 1000 CELLS ALLOCATE THROW   \ -- смещение память
DUP >R + R>            \ смещение память -- позиция память
2DUP >coopS

DROP >R               \ нужна только позиция
R@ !                \ записываем в позицию xt
['] COOP-EXIT R> CELL+ !      \ записываем за xt код безусловного выхода. Стек растёт вниз
-1 RP@ +!
REPEAT
RDROP
['] COOP-JMP CATCH
coop-stack LAST-RP @ RP!
COOP-FREE
;

\ передать управление следующей сопрограмме. После завершения сопрограмм управление передастся коду после COOP-NEXT
: COOP-NEXT
RP@
   coop-stack currentC @ coop-elem *
   coop-stack coop-struct +
   +
   pos !
COOP-JMP
;


Тестовый пример
Код:
\ инициализация матрицы

~er\array\matrix.f

~ER\LAMBDA\L-CODE.F

10 10 HEAP-MATRIX VALUE M

: TEST
L{ 100 0->n COOP-NEXT }L
L{ 10 0->n ['] DROP >R 10 0->n OVER >R COOP-NEXT R> }L
L{ BEGIN M ELEM-ADDR ! COOP-NEXT AGAIN }L
3 >COOP
M TYPE-intMATRIX
;


Вложения:
coop.F [2.63 Кб]
Скачиваний: 334

_________________
Цель: сделать 64-битную Нову под Винду
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Реализация сопрограмм на форте
СообщениеДобавлено: Вс фев 24, 2019 11:38 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 646
Благодарил (а): 6 раз.
Поблагодарили: 25 раз.
А просто несколько потоков бы не прокатило бы?)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Реализация сопрограмм на форте
СообщениеДобавлено: Вс фев 24, 2019 11:52 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 906
Благодарил (а): 1 раз.
Поблагодарили: 8 раз.
diver писал(а):
А просто несколько потоков бы не прокатило бы?)

Не-а)
Потоки и сопрограммы это разные вещи

_________________
Цель: сделать 64-битную Нову под Винду


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

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


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

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


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

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