Korutyna


Współprogram w encyklopedii

Z Wikipedii, wolnej encyklopedii (Przekierowano z Korutyna) Przejdź do nawigacji Przejdź do wyszukiwania

Pojęcie współprogramu ma dwie odmienne definicje. Obie definicje zgodnie stwierdzają, że współprogram cechuje się posiadaniem ciągu instrukcji do wykonania i ponadto możliwością zawieszania wykonywania jednego współprogramu A i przenoszenia wykonywania do innego współprogramu B. W szczególności można wznowić pracę zawieszonego współprogramu A, a wykonywanie będzie podjęte w miejscu, w którym zostało zawieszone. Tym co różni obie definicje jest zdolność współpracy z rekurencyjnymi procedurami (W językach programowania funkcyjnego koncepcja współprogramu istnieje pod postacią kontynuacji – pojęcia wprowadzonego niemal równocześnie ze współprogramami).

Obiekt współprogramu jest quasi-wątkiem. Tak jak wątek ma ciąg instrukcji do wykonania, w odróżnieniu od wątków obiekty współprogramów nie działają równolegle. Jest niezmiennikiem systemu współprogramów to, że w każdej chwili, dokładnie jeden obiekt współprogramu wykonuje swoje instrukcje:

c a r d { c o r o u t i n e :   c o r o u t i n e   i s   A c t i v e   } = 1. {\displaystyle \color {blue}card\{coroutine:\ coroutine\ is\ Active\ \}=1.\color {black}}

W literaturze znaleźć można termin włókno (ang. fiber) dla odróżnienia od wątku (ang.thread).

W latach 60 XX wieku współprogram był fragmentem kodu napisanego w assemblerze. wątki o następujących własnościach:

  • dokładnie jeden współprogram wykonuje swoje instrukcje, tzn. jest aktywny,
  • współprogram aktywny może przejść w stan pasywny wskazując przy tym na inny wątek, który ma być uaktywniony,
  • współprogram x {\displaystyle x} uaktywniony w efekcie wykonania instrukcji a t t a c h ( x ) {\displaystyle attach(x)} (w dotychczas aktywnym współprogramie y {\displaystyle y} ) kontynuuje wykonywanie instrukcji od odpowiedniego punktu wejścia, dokładniej: pierwsze uruchomienie instrukcji wątku współprogramu spowoduje wykonanie pierwszej instrukcji wątku, każda następna instrukcja a t t a c h ( x ) {\displaystyle attach(x)} wznawiająca wykonywanie wątku współprogramu x {\displaystyle x} rozpoczyna wykonywanie instrukcji od punktu wejścia wyznaczonego przez ostatnio wykonaną w nim instrukcję a t t a c h ( . . . ) . {\displaystyle attach(...).}

Spis treści

Zasada działania współprogramów | edytuj kod

System współprogramów można nazwać systemem quasi-współbieżnym. Nazwa ta jest uzasadniona dwojako: liczne przykłady programów współbieżnych np. producent-konsument, czytelnicy-pisarze itd. zapisane przy pomocy współprogramów okazują się wystarczająco adekwatne do zastosowań. Inny argument wspierający użycie tej nazwy to fakt, że od bardzo dawna stosuje się współprogramy do symulacji systemów, np. w Simuli67, Loglanie'82 i in. Odpowiednia klasa Simulation dostarcza klasę wewnętrzną simproces – obiekty klas pochodnych od klasy simproces symulują rzeczywiste procesy np. pacjentów w systemie symulacji epidemii choroby, pojazdy w systemie symulacji ruchu w mieście itp.

Wielu autorów uważa, iż „współprogramy to podprogramy wykonywane w taki sposób, że sterowanie może zostać przekazywane pomiędzy nimi wielokrotnie, przy czym wywołanie danego współprogramu powoduje wykonywanie instrukcji od miejsca ostatniego przerwania wykonania (ostatniego punktu wyjścia), a nie od początku”. Nie jest to całkiem ścisłe. Podprogramy (funkcja, metoda) tworzą rekordy aktywacji. Po opuszczeniu takiego rekordu jest on automatycznie usuwany i nie ma możliwości wznowienia go. Współprogramy wymagają więc wątków i są realizowane jako obiekty odpowiednich klas, a nie jako podprogramy czy procedury. Cytowany wyżej pogląd mocno zawęża koncepcję współprogramów. Co więcej, nie można zapominać, że instrukcjami wątku współprogramu mogą być instrukcje wywołania jego prywatnych metod(procedur). Metody te mogą zawierać instrukcje a t t a c h ( . . . ) {\displaystyle attach(...)} przekazujące sterowanie z jednego do innego współprogramu. Dokładniej, instrukcja attach przekazując sterowanie z jednego do drugiego współprogramu przenosi je z łańcucha dynamicznego jednego współprogramu do łańcucha dynamicznego innego współprogramu.

Łańcuch dynamiczny współprogramu zawiera obiekt i wątek współprogramu i ponadto, jeśli wykonano instrukcję procedury, to do łańcucha dynamicznego dołączony jest rekord aktywacji procedury. Zakończenie wykonywania instrukcji procedury(metody) powoduje skrócenie łańcucha dynamicznego. Instrukcja a t t a c h ( x ) {\displaystyle attach(x)} wykonana w rekordzie aktywacji procedury powoduje przejście do punktu wejścia w łańcuchu dynamicznym współprogramu x. Punktem wejścia (powrotu) dla dotychczas aktywnego współprogramu jest instrukcja w rekordzie aktywacji procedury występująca bezpośrednio za instrukcją a t t a c h ( x ) . {\displaystyle attach(x).} Widać stąd, że liczba punktów wejścia (powrotu) danego współprogramu może być zmienna w czasie i może nie być niczym ograniczona!

Podsumowując, współprogramy to więcej niż obiekty zwyczajnych klas, a mniej niż obiekty aktywne wątków (ang. threads).

Schemat zmian stanów obiektu współprogramu | edytuj kod

Schemat zmian stanów obiektu współprogramu

Współprogramy w języku Loglan 82 | edytuj kod

  • instrukcją przenoszenia sterowania z aktywnego współprogramu do drugiego współprogramu x {\displaystyle x} jest a t t a c h ( x ) , {\displaystyle attach(x),}
  • moduł współprogramu jest specyficzną klasą (stosuje się słowo ‘coroutine’ zamiast ‘class’),
  • instrukcja a t t a c h ( x ) {\displaystyle attach(x)} może występować nie tylko w wątku współprogramu, lecz także w prywatnych metodach współprogramu(!),
  • punktami wejścia do współprogramu są: pierwsza instrukcja wątku współprogramu oraz każda instrukcja następna po instrukcji a t t a c h ( x ) , {\displaystyle attach(x),}
  • można też używać bezparametrowej instrukcji d e t a c h , {\displaystyle detach,} odpowiada instrukcji 'attach(ten współprogram, który ostatnio mnie wezwał)'.

Instrukcje przenoszenia sterowania między współprogramami w różnych językach programowania | edytuj kod

Instrukcje przenoszące sterowanie z jednego do drugiego współprogramu to

Argument x wskazuje na współprogram pasywny w danej chwili.

Przykładowe zastosowania współprogramów | edytuj kod

  • historycznie pierwsze współprogramy to skaner i Analizator składniowy kompilatoraConway 1963 ↓,
  • podobny schemat występuje w wielu sytuacjach np. jeden współprogram zbiera wyniki pomiarów i zapisuje je w bazie danych, a drugi współprogram opracowuje zebrane wyniki, ogólny schemat to producent-konsument,
  • jeżeli jakaś metoda (funkcja lub procedura) jest wykonywana wielokrotnie z tymi samymi parametrami aktualnymi, to warto utworzyć odpowiednie obiekty współprogramu (tablicę współprogramów) dla każdego zestawu parametrów aktualnych. Następnie każdą instrukcję wywołania procedury zastępujemy odpowiednią instrukcją a t t a c h ( . . ) . {\displaystyle attach(..).} Zysk może okazać się znaczny, ponieważ wykonanie instrukcji a t t a c h {\displaystyle attach} jest znacznie prostsze od tworzenia rekordu aktywacji procedury.
  • Jeśli współprogramy są klasami wyposażonymi w instrukcję a t t a c h ( . . . ) {\displaystyle attach(...)} to można tworzyć hierarchie współprogramów wykorzystując dziedziczenie.
  • główne zastosowanie współprogramów to narzędzia symulacji, takie jak klasy Simulation w Simuli 67 i w Loglanie 82.

Przypisy | edytuj kod

  1. Donald Ervin Knuth: The Art of Computer Programming. T. 1 Fundamental Algorithms. Addison-Wesley, 1997, s. 193–200. ISBN 0-201-89683-4.
  2. (porównaj en:coroutine).

Bibliografia | edytuj kod

  • M.E. Conway. Design of a separable transition-diagram compiler. „Communications of the ACM”, July 1963. 
  • Ole-Johann Dahl, Bjarne Myhrhaug, Kristen Nygaard: Common Base Language (Simula67). Oslo: NCC, 1970.
  • O.-J. Dahl, A. Wang. Coroutine sequencing in a block structured environment. „BIT”, s. 425–449, 1971. 
  • W.M. Bartol, i in.: Report on the Loglan'82 Programming Language. Warszawa Łódź: PWN, 1984.Sprawdź autora:2.
  • Andrzej Szałas, Jolanta Warpechowska: Loglan'82. Warszawa: WNT, 1991.
Na podstawie artykułu: "Korutyna" pochodzącego z Wikipedii
OryginałEdytujHistoria i autorzy