Может ли вызов / cc Схемы реализовать все известные структуры потока управления?

13

На странице «Продвинутая схема: некоторые непослушные биты» говорится:

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

Я думал, что схемы call/cc, связанные (*) с оператором J Питера Лэндена, могут быть использованы для реализации любой известной структуры потока управления?

Что касается «структуры потока управления», то я специально думаю об их описании в Википедии , например, об исключениях, сопрограммах, зеленых нитях и так далее.

В частности, есть ли примеры структур управления потоками, которые нельзя реализовать с помощью call/cc?

(*) Мне не удалось выкопать какую-либо бумагу, в которой говорится, что call/ccона так же мощна, как оператор J. Статья Феллайзена (которую я не читал и, по общему признанию, испытываю проблемы с ее полным пониманием) исследует это и, похоже, приходит к выводу, что, хотя они находятся в разных классах сложности, они формально эквивалентны.

(Также обратите внимание, что я обновил вопрос, основываясь на комментариях ниже)

Обновить

Основываясь на превосходном ответе @Neel ниже, я посмотрел сайты, комментирующие ограниченные и неограниченные продолжения , и действительно кажется, что call/cc, будучи неограниченным, этого недостаточно. Между тем, кажется, что первоклассные продолжения с разделителями (вроде shift/reset) могут использоваться для выражения любой структуры потока управления.

CSL
источник
5
Каково формальное определение «структуры потока управления»?
Гек Беннетт
4
Re: неограниченные продолжения. Вы читали справочную статью Хайо Тилеке? Фактическое утверждение состоит в том, что неограниченные продолжения, как это предусмотрено,call/cc не могут выражать исключения в отсутствие состояния . (Как продолжает Тилеке, исключения могут быть реализованы путем передачи двух продолжений, одного для программы и другого для обработчика исключений, но для этого требуется больше, чем просто call/cc.)
rici
@Rici: я просмотрел только первые несколько страниц. (Чтение газет занимает у меня много времени). Спасибо за комментарий!
csl
@HuckBennett У меня нет формального определения, но неофициально я имею в виду то, что оно описывало на en.wikipedia.org/wiki/Control_flow - в частности, я имею в виду, что вы можете использовать продолжения для выражения и, что более важно, для реализации сопрограмм, зеленые потоки, исключения, escape-операторы, оператор amb-оператор и так далее.
csl
2
@csl В дополнение к более точному пониманию того, что означает «структура потока управления», вам также необходимо уточнить, что означает «выражать» что-либо. Это сложная проблема, и ответ на ваш вопрос сильно зависит от того, что вы считаете выражением. В конце концов, вы всегда можете каким-то образом кодировать машину Тьюринга, которая кодирует интерпретатор языка с исключениями (например, Java). Но это, вероятно, не то, что вы имеете в виду, поэтому вам нужно наложить жесткие ограничения на понятие «выражение» (например, композиционность и / или полная абстракция).
Мартин Бергер

Ответы:

11

В этом ответе я возьму слово «выразимый» в значении «макроэкспрессируемый» в смысле Феллайзена, 1991 г. « О выразительной силе языков программирования» . (Интуитивно понятно, что языковая функция может быть выражена макросом, если вы можете определить ее как преобразование локального источника, без использования преобразования всей программы.)

При таком определении ответ будет отрицательным : элемент управления с разделителями не может быть выражен макросом в лямбда-исчислении + call / cc. Для выражения управляющих операторов с разделителями используйте call / cc. Чтобы реализовать разделители управления (часть сброса смещения / сброса), вам необходимо некоторое состояние для имитации меток продолжения, по существу, для кодирования стека для имитации динамического времени жизни меток продолжения.

Однако контроль с разделителями является универсальным эффектом в следующем смысле. В своей докторской диссертации , Анджей Filinski показал , что любой выразим побочный эффект является кодируемым с использованием либо разграниченные продолжений, или вызова / см и одну ячейки состояния. Грубо говоря, «выраженный побочный эффект» - это любой эффект, монадический тип которого может быть определен в терминах типов языка программирования.

Удивительно, но эта идея кажется довольно интересной на практике. За последнее десятилетие Гордон Плоткин и Джон Пауэр выступили за идею использования алгебраической семантики теорий эффектов : идея заключается в том, что вы задаете интересующие вас побочные эффекты и уравнения, которые вы ожидаете, что они удовлетворят, а затем вы можете получить семантику, взяв свободную монаду за эту теорию.

Матия Претнар и Андрей Бауэр взяли этот математический подход, а затем реализовали его на своем языке Eff, чтобы изобрести новую языковую конструкцию, называемую «обработчиками эффектов»: вы можете написать код, который использует набор императивных функций, а затем дать императивным функциям семантику написав набор обработчиков, которые говорят, как реализовать каждую эффективную операцию.

Нил Кришнасвами
источник
Но если определение таково: «Можете ли вы реализовать какую-либо структуру потока управления, используя Scheme и call / cc» (без эмуляции), тогда ответ должен быть « да» ? Глядя на обсуждение LtU lambda-the-ultimate.org/node/966, кажется, что Олег Киселев реализовал все четыре F-оператора в Схеме с помощью call / cc: okmij.org/ftp/continuations/… - excerpt "Код полагается по вызову / cc для захвата неограниченных продолжений и использует одну глобальную изменяемую ячейку. Оказывается, это эффективно для реализации [...] других F-операторов ". ... "-F- до + F + F".
csl
Я признаю, что вы использовали «макроэкспрессивность» Феллайзена в качестве основы для вашего ответа, но, как вы можете видеть, я уже изменил свой вопрос, чтобы специально означать «реализовать [в Схеме] с помощью call / cc». И хотя Олегу Киселеву нужно ввести глобальную изменяемую ячейку для реализации всех четырех F-операторов для продолжения с разделителями, я не думаю, что это означает «серьезную глобальную реструктуризацию программы» - практически говоря, конечно.
csl
Я собираюсь принять этот ответ. Я также хотел бы указать на текст по адресу okmij.org/ftp/continuations/undelimited.html#delim-vs-undelim, в котором есть дополнительные указатели. Также кажется, что первоклассные продолжения с разделителями, такие как shift / reset, можно использовать для реализации любой структуры потока управления. По ссылке: «Первоклассные продолжения с разделителями могут выражать любой выражаемый вычислительный эффект, включая исключения и изменяемое состояние».
csl