Ответ 1
Пока мы не получаем сообщение от кого-то, кто действительно знает, вот мое понимание вопроса, FWIW.
Подпрограмма и функция по существу одно и то же, с одним отличием: функция возвращает какое-то значение (обычно через стек или регистр CPU), а подпрограмма - нет. Подпрограмма или функция, это блок исполняемого кода, имеющий ровно одну точку входа. Совместная процедура также является блоком исполняемого кода, и, подобно подпрограмме, она имеет одну точку входа. Однако он также имеет один или несколько пунктов повторного входа. Подробнее об этом позже.
Перед тем, как перейти к потокам, давайте рассмотрим: компьютерная программа, также известная как процесс, обычно имеет выделение памяти, организованное в кодовое пространство, кучу и стек. Кодовое пространство хранит один или несколько блоков исполняемого кода. В стеке хранятся параметры, автоматические переменные и обратные адреса подпрограмм, функций и ко-подпрограмм (и другие вещи тоже). Куча - это широко открытое пространство памяти, доступное для процесса в любых целях. В дополнение к этим пространствам памяти регистры CPU, каждый из которых хранит набор бит. Эти биты могут быть целочисленным значением, адресом памяти, связкой флагов состояния или любым другим. Большинство программистов не должны знать о них много, но они там и необходимы для работы процессора. Вероятно, те, о которых стоит знать, это счетчик программ, указатель стека и регистр состояния, но мы не будем вдаваться в них здесь.
Нить - это один логический поток выполнения. В примитивной вычислительной системе для процесса имеется только один поток. В современных вычислительных системах процесс состоит из одного или нескольких потоков. Каждый поток получает свой собственный стек и набор регистров процессора (что обычно физически невозможно, но сделано виртуально логически - деталь, которую мы пропустим здесь). Однако, хотя в каждом потоке процесса есть свой собственный стек и регистры, все они будут обладать одним и тем же куском и кодовым пространством. Они также (предположительно) работают одновременно; что действительно может случиться в многоядерном процессоре. Таким образом, две или более части вашей программы могут работать одновременно.
Назад к совместному подпрограмме: как упоминалось ранее, у него есть одна или несколько точек повторного входа. Точка повторного входа означает, что совместная подпрограмма может позволить некоторому другому блоку кода за пределами себя иметь некоторое время выполнения, а затем в какое-то время будет возвращать время выполнения в своем собственном блоке кода. Это означает, что параметры и автоматические переменные co-подпрограммы сохраняются (и восстанавливаются, если необходимо), когда выполнение выполняется во внешний блок кода, а затем возвращается к кодовому подпрограмме. Совместная подпрограмма - это то, что непосредственно не реализовано на каждом языке программирования, хотя оно является общим для многих языков ассемблера. Во всяком случае, концептуально можно реализовать совместную процедуру. Существует хорошая статья о совлокальных процедурах на http://en.wikipedia.org/wiki/Coroutine.
Мне кажется, что существуют две основные мотивации в реализации совместного плана проектирования: (1) преодоление ограничений однопоточного процесса; и (2) в надежде добиться более высокой вычислительной производительности. Мотивация (1) понятна, чтобы понять, когда процесс должен решать многие вещи сразу, когда один поток является обязательным. Мотивация (2) может быть не столь понятной, поскольку она связана с множеством подробностей о системном оборудовании, дизайне компилятора и языковом дизайне. Я могу только представить себе, что вычислительные усилия могут быть уменьшены за счет сокращения использования манипуляций со стеком, избежания повторных инициализаций в подпрограмме или уменьшения некоторых из накладных расходов на поддержание многопоточного процесса.
НТН