Язык Форт и его реализации


         

Сопрограммы - часть 3


Применяя описанный механизм, определим две сопрограммы ВВОД и ВЫВОД, которые обмениваются между собой через однобайтный буфер ТЕК-СИМ, и слово ЗАДАЧА, которое выполняет требуемую перепись данных:

QUAN ТЕК-СИМ ( ОЧЕРЕДНОЙ ОБМЕНИВАЕМЫЙ СИМВОЛ) CREATE ВХОД-БУФ 80 ALLOT ( БУФЕР ВВОДА) CREATE ВЫХ-БУФ 64 ALLOT ( БУФЕР ВЫВОДА) СОПРОГРАММА ВВОД ОТКРЫТЬ-ВВОД BEGIN ВХОД-БУФ ЧИТАТЬ WHILE ВХОД-БУФ 80 + ВХОД-БУФ DO I С@ TO ТЕК-СИМ RESUME LOOP REPEAT ЗАКРЫТЬ-ВВОД ЗАКРЫТЬ-ВЫВОД ; СОПРОГРАММА ВЫВОД ОТКРЫТЬ-ВЫВОД BEGIN ВЫХ-БУФ 64 + ВЫХ-БУФ DO ТЕК-СИМ I С! RESUME LOOP ВЫХ-БУФ ПИСАТЬ AGAIN ; : ЗАДАЧА START ВВОД START ВЫВОД BEGIN ВВОД ВЫВОД AGAIN ;

Два ряда слов ОТКРЫТЬ-ВВОД, ЧИТАТЬ, ЗАКРЫТЬ-ВВОД и ОТКРЫТЬ-ВЫВОД, ПИСАТЬ, ЗАКРЫТЬ-ВЫВОД обеспечивают взаимодействие с входным и выходным файлами. Слова ЧИТАТЬ и ПИСАТЬ требуют в качестве параметра адрес буфера (ВХОД-БУФ для ввода и ВЫХ-БУФ для вывода), а слово ЧИТАТЬ, кроме того, возвращает логический результат — признак успешного завершения чтения.

В заключение рассмотрим направления, в которых можно развить данную реализацию.

  • Если сопрограммы могут использовать общий стек данных, то можно сохранять и восстанавливать только указатель стека возвратов.
  • Можно передавать параметры при начале работы сопрограммы, а также при каждом возобновлении. Для этого потребуется специальное слово, пересылающее указанное число элементов стека вызывающей сопрограммы на стек вызываемой.
  • Предусмотрев поле связи для сцепления всех сопрограмм в список, можно получить состояние всей совокупности взаимодействующих сопрограмм.
  • Можно предусмотреть вызов асинхронного выхода «Окончание задачи». Идентификация этого выхода может быть как статической, так и динамической.
  • Часть действий можно выполнять в состоянии исполнения, а не компиляции. Среди этих действий могут быть следующие: создание сопрограммы без имени и отведение заказываемого участка памяти в динамически распределяемой памяти, инициализация этой области памяти, освобождение области памяти сопрограммы при ее завершении.
  • Если использовать косвенный вызов через переменную типа VECT, можно динамически определять возобновляемую сопрограмму.
  • Возможны, конечно, и любые другие изменения, диктуемые конкретной обстановкой.




    Содержание  Назад  Вперед