Співпрограма або співпроцедура (англ. Coroutine) — компонент програми, що узагальнює поняття підпрограми, додатковою підтримкою безлічі точок входу (а не однієї, як підпрограма) і зупинку та продовження виконання із збереженням певного положення. Співпрограми є гнучкішими і узагальненішими, ніж підпрограми, але рідше використовуються на практиці. Застосування співпрограм, будучи методикою ще асемблера, практикувалося лише деякими високорівневими мовами, наприклад Simula і . Співпрограми добре придатні для реалізації багатьох схожих компонентів програм (ітераторів, нескінченних списків, каналів, волокон).
Співпрограма має початкову точку входу і розташовані всередині послідовності повернень і наступних точок входу. Підпрограмма може повертати керування лише одного разу, співпрограма може повертати керування багаторазово. Час роботи підпрограми відзначається принципом LIFO (остання викликана підпрограма завершується першою), час роботи співпрограми визначається її використанням і необхідністю.
Наведемо простий приклад використання співпрограми. Нехай необхідно реалізувати зв'язок між споживачем і виробником, де одна частина програми створює елементи й поміщає їх у чергу, а інша видаляє їх та використовує. Наступний код реалізує це:
var q := new queue coroutine produce loop while q is not full create some new items add the items to q yield to consume coroutine consume loop while q is not empty remove some items from q use the items yield to produce
Реалізації
C++
Підтримка співпрограм існувала в ранніх версіях , але через низку різних причин у стандарт співпрограми не увійшли.
В 2012 році комітет отримав формальну пропозицію з включення підтримки співпрограм. Головним чином, вони були потрібні для створення серверних застосунків з підтримкою тисяч або навіть мільйонів одночасних клієнтів. В 2013 році була запропонована альтернативна реалізація. Відтоді тривали дискусії, дослідження, спроби узгодити остаточну версію.
Нарешті, підтримка безстекових сівпрограм увійшла в стандарт мови . Зокрема, були додані нові ключові слова co_return, co_await та co_yield, але підтримка співпрограм у стандартній бібліотеці була мінімальна.
До того можливість роботи зі співпрограмами була реалізована на рівні бібліотек, зокрема Boost.Coroutine, Boost.Coroutine2 та іншими, стандарт радше визначив каркас для роботи зі співпрограмами. Тому, для зручності розробників, були створені бібліотеки класів для поширених видів співпрограм: cppcoro, libcoro, QCoro, та інші.
Стандартом передбачено, що співпрограма може віддати управління в одному потоці виконання, а бути відновлена — в іншому.
В стандарті був доданий тип generator, який полегшує створення (генераторів послідовностей) на основі співпрограм сумісних з доданими в стандарті C++20 діапазонами.
Таким чином, генератор послідовності Фібоначчі мовою стандарту C++23 може мати такий вигляд:
#include <generator> #include <ranges> #include <iostream> std::generator<int> fib() { co_yield 0; auto a = 0; auto b = 1; for (auto n : std::views::iota(0)) { auto next = a + b; a = b; b = next; co_yield next; } } int main() { for (auto f : fib() | std::views::take(10)) { std::cout << f << " "; } }
Див. також
Примітки
- Stroustrup, Bjarne (12 червня 2020). Thriving in a crowded and changing world: C++ 2006–2020. Proceedings of the ACM on Programming Languages. Association for Computing Machinery (ACM). 4 (HOPL): 1—168. doi:10.1145/3386320. ISSN 2475-1421. S2CID 219603741.
- Valentyn Korniienko (25 квітня 2023). С++20 Сoroutines та огляд бібліотек, які реалізують підтримку со-програм. DOU.
- Rainer Grimm (23 жовтня 2019). C++20: The Big Four.
- Coroutines (C++20). CPP Reference. 27 жовтня 2023. Процитовано 4 листопада 2023.
- Rainer Grimm (18 вересня 2023). C++23: Ranges Improvements and std::generator.
Джерела
- Енциклопедія кібернетики : у 2 т. / за ред. В. М. Глушкова. — Київ : Гол. ред. Української радянської енциклопедії, 1973.
- Дональд Кнут. Fundamental Algorithms // The Art of Computer Programming. — 3rd. — Massachusetts : Addison–Wesley, 1997. — Т. 1. — 650 с. — .(англ.)
Це незавершена стаття про інформаційні технології. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Spivprograma abo spivprocedura angl Coroutine komponent programi sho uzagalnyuye ponyattya pidprogrami dodatkovoyu pidtrimkoyu bezlichi tochok vhodu a ne odniyeyi yak pidprograma i zupinku ta prodovzhennya vikonannya iz zberezhennyam pevnogo polozhennya Spivprogrami ye gnuchkishimi i uzagalnenishimi nizh pidprogrami ale ridshe vikoristovuyutsya na praktici Zastosuvannya spivprogram buduchi metodikoyu she asemblera praktikuvalosya lishe deyakimi visokorivnevimi movami napriklad Simula i Spivprogrami dobre pridatni dlya realizaciyi bagatoh shozhih komponentiv program iteratoriv neskinchennih spiskiv kanaliv volokon Spivprograma maye pochatkovu tochku vhodu i roztashovani vseredini poslidovnosti povernen i nastupnih tochok vhodu Pidprogramma mozhe povertati keruvannya lishe odnogo razu spivprograma mozhe povertati keruvannya bagatorazovo Chas roboti pidprogrami vidznachayetsya principom LIFO ostannya viklikana pidprograma zavershuyetsya pershoyu chas roboti spivprogrami viznachayetsya yiyi vikoristannyam i neobhidnistyu Navedemo prostij priklad vikoristannya spivprogrami Nehaj neobhidno realizuvati zv yazok mizh spozhivachem i virobnikom de odna chastina programi stvoryuye elementi j pomishaye yih u chergu a insha vidalyaye yih ta vikoristovuye Nastupnij kod realizuye ce var q new queue coroutine produce loop while q is not full create some new items add the items to q yield to consume coroutine consume loop while q is not empty remove some items from q use the items yield to produceRealizaciyiC Pidtrimka spivprogram isnuvala v rannih versiyah C ale cherez nizku riznih prichin u standart spivprogrami ne uvijshli V 2012 roci komitet otrimav formalnu propoziciyu z vklyuchennya pidtrimki spivprogram Golovnim chinom voni buli potribni dlya stvorennya servernih zastosunkiv z pidtrimkoyu tisyach abo navit miljoniv odnochasnih kliyentiv V 2013 roci bula zaproponovana alternativna realizaciya Vidtodi trivali diskusiyi doslidzhennya sprobi uzgoditi ostatochnu versiyu Nareshti pidtrimka bezstekovih sivprogram uvijshla v standart movi C 20 Zokrema buli dodani novi klyuchovi slova co return co await ta co yield ale pidtrimka spivprogram u standartnij biblioteci bula minimalna Do togo mozhlivist roboti zi spivprogramami bula realizovana na rivni bibliotek zokrema Boost Coroutine Boost Coroutine2 ta inshimi standart radshe viznachiv karkas dlya roboti zi spivprogramami Tomu dlya zruchnosti rozrobnikiv buli stvoreni biblioteki klasiv dlya poshirenih vidiv spivprogram cppcoro libcoro QCoro ta inshi Standartom peredbacheno sho spivprograma mozhe viddati upravlinnya v odnomu potoci vikonannya a buti vidnovlena v inshomu V standarti C 23 buv dodanij tip generator yakij polegshuye stvorennya generatoriv poslidovnostej na osnovi spivprogram sumisnih z dodanimi v standarti C 20 diapazonami Takim chinom generator poslidovnosti Fibonachchi movoyu standartu C 23 mozhe mati takij viglyad include lt generator gt include lt ranges gt include lt iostream gt std generator lt int gt fib co yield 0 auto a 0 auto b 1 for auto n std views iota 0 auto next a b a b b next co yield next int main for auto f fib std views take 10 std cout lt lt f lt lt Div takozhVolokno programuvannya ta Kooperativna bagatozadachnist PidprogramaPrimitkiStroustrup Bjarne 12 chervnya 2020 Thriving in a crowded and changing world C 2006 2020 Proceedings of the ACM on Programming Languages Association for Computing Machinery ACM 4 HOPL 1 168 doi 10 1145 3386320 ISSN 2475 1421 S2CID 219603741 Valentyn Korniienko 25 kvitnya 2023 S 20 Soroutines ta oglyad bibliotek yaki realizuyut pidtrimku so program DOU Rainer Grimm 23 zhovtnya 2019 C 20 The Big Four Coroutines C 20 CPP Reference 27 zhovtnya 2023 Procitovano 4 listopada 2023 Rainer Grimm 18 veresnya 2023 C 23 Ranges Improvements and std generator DzherelaEnciklopediya kibernetiki u 2 t za red V M Glushkova Kiyiv Gol red Ukrayinskoyi radyanskoyi enciklopediyi 1973 Donald Knut Fundamental Algorithms The Art of Computer Programming 3rd Massachusetts Addison Wesley 1997 T 1 650 s ISBN 0 201 89683 4 angl Ce nezavershena stattya pro informacijni tehnologiyi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi