Сопрограмма
Сопрограмма () — программный модуль, особым образом организованный для обеспечения взаимодействия с другими модулями по принципу кооперативной многозадачности: модуль приостанавливается в определённой точке, сохраняя полное состояние (включая стек вызовов и счётчик команд), и передаёт управление другому, тот, в свою очередь, выполняет задачу и передаёт управление обратно, сохраняя свои стек и счётчик. Наряду с , сопрограммы являются средством обеспечения «легковесной» программной многопоточности в том смысле, что могут быть реализованы без использования механизмов переключений контекста операционной системой.

Сопрограммы являются более гибкими и обобщёнными, чем подпрограммы: в сравнении с подпрограммой, имеющей всегда одну входную точку, сопрограмма имеет стартовую точку входа и размещённые внутри последовательность возвратов и следующих за ними точек входа. Подпрограмма может возвращаться только однажды, сопрограмма может возвращать управление несколько раз. Время работы подпрограммы определяется принципом LIFO (последняя вызванная подпрограмма завершается первой), время работы сопрограммы определяется её использованием и необходимостью.

Появление понятия сопрограммы относят к конструкции, применённой в 1958 году в практике программирования на языке ассемблера, в 1960-е — 1970-е годы сопрограммы практиковались в некоторых высокоуровневых языках (Клу, Симула, Модула-2), но заметное распространение получили лишь в 2000-е годы, когда появились многочисленные библиотеки поддержки сопрограмм в популярных языках программирования, а в некоторые новые языки (такие как Lua, Ruby, Go, Julia) встроены изначально. Сопрограммы используются для реализации многих похожих компонентов программ, таких как генераторы и итераторы, бесконечные списки с использованием ленивых вычислений, каналы, конечные автоматы внутри одной подпрограммы (где состояние определяется по текущей точке входа и выхода), реализации обработки исключений и модели акторов.
Q40056
программный
Concept
Q192969
кооперативной многозадачности
Concept
Q759899
стек вызовов
Concept
Q814194
счётчик команд
Concept
Q1064412
многопоточности
Concept
Q1061424
переключений контекста
Concept
Q190686
подпрограммы
Concept
Q1142376
LIFO
Concept
Q165436
языке ассемблера
Concept
Q211496
высокоуровневых языках
Concept
Q775159
Клу
MEDIA
Q212569
Симула
MEDIA
Q777358
Модула-2
MEDIA
Q207316
Lua
MEDIA
Q161053
Ruby
MEDIA
Q37227
Go
MEDIA
Q2613697
Julia
MEDIA
Q1326388
генераторы
Concept
Q1326388
итераторы
Concept
Q573952
ленивых вычислений
Concept
Q5072250
каналы
UNK
Q176452
конечные автоматы
Concept
Q471748
обработки исключений
Concept
Q344524
модели акторов
UNK
Q1339231
Сопрограмма
UNK
1958-01-01T00:00:00Z^^http://www.w3.org/2001/XMLSchema#dateTime
в 1958
DATE
1960-01-01T00:00:00Z^^http://www.w3.org/2001/XMLSchema#dateTime
в 1960
DATE
1970-01-01T00:00:00Z^^http://www.w3.org/2001/XMLSchema#dateTime
1970
DATE
2000-01-01T00:00:00Z^^http://www.w3.org/2001/XMLSchema#dateTime
в 2000
DATE
+1970^^http://www.w3.org/2001/XMLSchema#decimal
1970
NUMBER
-2^^http://www.w3.org/2001/XMLSchema#decimal
-2
NUMBER
influenced by
influenced by
influenced by
influenced by
influenced by