C++ співпрограми

Ця публікація в блозі є частиною серії з двох частин.

Частина 1: co_yield, co_return і первинне сито Частина 2: co_wait і Fizz Buzz

C++ відстає в співпрограмі порівняно з іншими мовами програмування, але вони є частиною C++20. До співпрограм у програміста на C++ було два варіанти:

Синхронний (прямолінійний) код легше зрозуміти, але менш ефективний. Асинхронний код (наприклад, зворотні виклики) ефективніший (дозволяє виконувати інші дії під час очікування), але також складніший (ручне збереження та відновлення стану).

Сопрограми, «функції, виконання яких можна перервати», спрямовані на досягнення найкращого з обох світів: програми, які виглядають як код синхронізації, але працюють як асинхронний код.

Загалом, дизайн мови C++ наголошує на ефективності, налаштуваннях і принципі відсутності накладних витрат над такими речами, як зручність використання, безпека чи «батареї включені».

Це не є ані «хорошими», ані «поганими» принципами проектування, але оскільки C++ не запозичений і не постачається з системою виконання, це означає, що співпрограми C++ потребують швидкого навчання. Льюїс Бейкер, як і Реймонд Чен, написав кілька чудових дописів у блозі, але серіал Чена — це епопея з 61 частини, і все ж його сторінка змісту закінчується словами «Я не маю нічого, що не закінчив із співпрограммами». "! Не дивно (враховуючи його доменне ім’я), що cppreference.com має гарний довідковий матеріал, але він не є чудовим посібником.

Мої дві публікації в блозі не мають на меті бути вичерпними, а радше надають короткий огляд трьох фундаментальних механізмів (нових операторів, пов’язаних із співпрограмою в C++20): co_yield, co_return і co_await. Дві публікації в блозі представляють повну та просту програму, схожу на літературне програмування.

Перше сито

Решето Ератосфена є одним із найдавніших зареєстрованих алгоритмів, якому понад дві тисячі років, який генерує ряд простих чисел: 2, 3, 5, 7, 11 тощо.

Протягом останнього тисячоліття Даг Макілрой і Кен Томпсон винайшли конвеєри Unix як спосіб підключення одночасних процесів. МакІлрой написав односторінкову C-версію Sieve, яка використовує процеси та канали Unix. Згідно з цим посиланням, суть цієї програми також з’являється у впливовій статті Тоні Хоара про зв’язок послідовних процесів (CSP). Зовсім недавно з’явилася 36-рядкова версія Sieve на ігровому майданчику Go.

Цей дизайн можна перенести на співпрограми C++. «Процеси» в CSP — це не те саме, що процеси Unix. Наша програма (на відміну від Макілроя) є однопоточною та однопроцесною (у розумінні процесу Unix). Ось «бізнес-логіка»:

джерело генератора (кінець int) { for (int x = 2; x < end; x++) { co_yield x; } } Генератор фільтра (генератор g, int prime) { while (std::optional optional_x = g.next()) { int x = optional_x.value(); if ((x простий %) != 0) { co_yield x; } } } int main(int argc, char** argv) { Генератор g = джерело (40); while (std::optional optional_prime = g.next()) { int prime = optional_prime.value(); std::cost

Ця публікація в блозі є частиною серії з двох частин.

Частина 1: co_yield, co_return і первинне сито Частина 2: co_wait і Fizz Buzz

C++ відстає в співпрограмі порівняно з іншими мовами програмування, але вони є частиною C++20. До співпрограм у програміста на C++ було два варіанти:

Синхронний (прямолінійний) код легше зрозуміти, але менш ефективний. Асинхронний код (наприклад, зворотні виклики) ефективніший (дозволяє виконувати інші дії під час очікування), але також складніший (ручне збереження та відновлення стану).

Сопрограми, «функції, виконання яких можна перервати», спрямовані на досягнення найкращого з обох світів: програми, які виглядають як код синхронізації, але працюють як асинхронний код.

Загалом, дизайн мови C++ наголошує на ефективності, налаштуваннях і принципі відсутності накладних витрат над такими речами, як зручність використання, безпека чи «батареї включені».

Це не є ані «хорошими», ані «поганими» принципами проектування, але оскільки C++ не запозичений і не постачається з системою виконання, це означає, що співпрограми C++ потребують швидкого навчання. Льюїс Бейкер, як і Реймонд Чен, написав кілька чудових дописів у блозі, але серіал Чена — це епопея з 61 частини, і все ж його сторінка змісту закінчується словами «Я не маю нічого, що не закінчив із співпрограммами». "! Не дивно (враховуючи його доменне ім’я), що cppreference.com має гарний довідковий матеріал, але він не є чудовим посібником.

Мої дві публікації в блозі не мають на меті бути вичерпними, а радше надають короткий огляд трьох фундаментальних механізмів (нових операторів, пов’язаних із співпрограмою в C++20): co_yield, co_return і co_await. Дві публікації в блозі представляють повну та просту програму, схожу на літературне програмування.

Перше сито

Решето Ератосфена є одним із найдавніших зареєстрованих алгоритмів, якому понад дві тисячі років, який генерує ряд простих чисел: 2, 3, 5, 7, 11 тощо.

Протягом останнього тисячоліття Даг Макілрой і Кен Томпсон винайшли конвеєри Unix як спосіб підключення одночасних процесів. МакІлрой написав односторінкову C-версію Sieve, яка використовує процеси та канали Unix. Згідно з цим посиланням, суть цієї програми також з’являється у впливовій статті Тоні Хоара про зв’язок послідовних процесів (CSP). Зовсім недавно з’явилася 36-рядкова версія Sieve на ігровому майданчику Go.

Цей дизайн можна перенести на співпрограми C++. «Процеси» в CSP — це не те саме, що процеси Unix. Наша програма (на відміну від Макілроя) є однопоточною та однопроцесною (у розумінні процесу Unix). Ось «бізнес-логіка»:

джерело генератора (кінець int) { for (int x = 2; x < end; x++) { co_yield x; } } Генератор фільтра (генератор g, int prime) { while (std::optional optional_x = g.next()) { int x = optional_x.value(); if ((x простий %) != 0) { co_yield x; } } } int main(int argc, char** argv) { Генератор g = джерело (40); while (std::optional optional_prime = g.next()) { int prime = optional_prime.value(); std::cost

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow