Ключевым отличием является то, что операторы goto
на языках, которые их поддерживают, позволяют переходить в любое место в программе практически без ограничений. Хотя сопрограммы на первый взгляд могут показаться похожими, они очень разные.
Сопрограммы позволяют приостанавливать (со всем их контекстом) процедуры и возобновлять их в определенных местах. Таким образом, в то время как сопрограммы делают паузу и yield
контролируют другие процедуры, прежде чем они завершатся, а затем возобновят позже, точки, в которых процедуры завершаются и возобновляются, известны заранее.
Невозможно просто перейти к произвольной строке в процедуре, рассматриваемая процедура должна ждать возобновления в определенном месте. Несмотря на то, что передача управления намного более структурирована, чем с goto
, можно написать непонятный код, используя этот мощный механизм. Опять же, разве это не так со всеми мощными функциями языка программирования? ; -)