среда, 7 октября 2015 г.

[prog.c++17.flame] Что-то начинаю опасаться появления сопрограмм в C++ :(

Пролистал презентацию про сопрограммы в C++ с конференции CppCon 2015... Есть у меня смутное подозрение, что с добавлением сопрограмм в C++ случится такая же фигня, как и с активным использованием JavaScript в Web-е: поначалу все хорошо, но со все большим проникновением в массы и с накоплением кодовой базы дела будут идти не так, чтобы уж очень. Для JS альтернатив почти что и нет, а вот писать на JS, да еще и сопровождать большой чужой проект на JS -- это, насколько я понимаю, то еще удовольствие. Чего-то подобного ожидаю и по отношению к сопрограммам в C++.

Хочется надеяться, что главная причина -- это моя тупость. Ну реально, когда дело доходит до понимания тонкостей работы сопрограмм, особенно когда присутствует некоторая неявная магия со стороны компилятора, то начинаю жестко и долго тупить.

С многопоточностью и то как-то проще: есть линейный код, который в любой момент может быть вытеснен с процессора. Тем не менее, это один непрерывный кусок линейного кода. Тогда как в сопрограммах появляется дополнительная линия романа: несколько квазипараллельно работающих кусков кода, передающих управление друг другу. И все это на контексте рабочей нити, которая, в принципе, может быть вытеснена с процессора. Кроме того, если сопрограммы работают не на одной общей рабочей нити, а на пуле нитей, то ситуация становится еще интереснее.

Собственно, как раз то, что многое начинает происходить "под ковром" и не нравится. С++ и так далеко не самый простой язык. И даже если ты видишь в коде простое выражение вроде z=x()*y(), то за ним может скрываться очень непростая логика по перемножению матриц с использованием GPU, для разбирательства с деталями которой придется потратить немало времени. Но пока это еще линейный код, в котором смена контекста или передача команд другому потоку исполнения вписывается явно. А вот когда придется столкнуться с await z = (await x())*(await y())...

В безопасных языках со сборкой мусора сопрограммы, имхо, менее страшны и сложны. Но ведь в C++ нет ни безопасности (вышел за пределы массива и жди сюрпризов), ни сборки мусора (удалил объект раньше времени или повторно и опять жди сюрпризов). И как в этих условиях разбираться с контекстами немереного количества сопрограмм?

Отправить комментарий