В чем разница между продолжением (как в Smalltalk) и прерыванием (как в ассемблере)? - PullRequest
3 голосов
/ 02 мая 2009

Я изо всех сил пытаюсь понять концепцию Continuations (как используется в Seaside с Smalltalk). Фрагмент из Википедии гласит:

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

Разве это не просто еще один способ выразить то, что программист на ассемблере сделает при программировании прерывания? Или я полностью упустил суть!

Ответы [ 3 ]

12 голосов
/ 07 мая 2009

Продолжение можно рассматривать как копию моментального снимка запущенного процесса. Запись продолжения означает, что текущий процесс скопирован и отложен. После этого код продолжает нормально выполняться. Оценка продолжения означает, что текущий процесс завершается, а скопированный возобновляется точно в том состоянии, в котором он был захвачен. Продолжения обычно можно возобновить несколько раз.

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

3 голосов
/ 03 мая 2009

Продолжения примерно эквивалентны setjump / longjump в C. Вы можете ожидать, что ваш контекст останется нетронутым, когда вы вызовете продолжение (стек, флаги, регистры, указатель инструкций и т. Д.) После его выхода. Таким образом, это похоже на программный вызов прерывания, за исключением того, что вам не нужно возвращаться (или, точнее, вызывать продолжение) после завершения обработчика, и продолжение не является неявным.

1 голос
/ 02 мая 2009

В чем-то они похожи. Однако продолжения вызываются самой программой, а прерывания обычно генерируются процессором или устройствами на компьютере. Кроме того, прерывание больше похоже на сигнал C, оно просто вызывается, а затем управление возвращается в программу. Прерывание отвечает за сохранение состояния и его восстановление после этого.

Также следует отметить, что вы можете довольно легко реализовать продолжения в ассемблере.

...