Чи може виклик / куб.схеми реалізувати всі відомі структури потоків управління?


13

На сторінці "Розширена схема: деякі неслухняні біти" зазначено:

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

Я думав, що схеми call/cc, пов'язані (*) з оператором J Петра Ландіна, можуть бути використані для реалізації будь-якої відомої структури потоку управління?

Маючи "структуру потоку управління", я конкретно замислююсь над описом Вікіпедії , наприклад, винятками, коруптиками, зеленими нитками тощо.

Зокрема, чи є приклади структур управління потоком, які неможливо реалізувати за допомогою call/cc?

(*) Я не зміг викопати жодного паперу, який би встановив call/ccтакий потужний, як оператор J. Дослідження Феллейсена (яку я не читав і, правда кажучи, має проблеми з розумінням цього в повному обсязі), досліджує це, і, здається, робить висновок, що хоча вони знаходяться в різних класах складності, вони формально рівноцінні.

(Також зауважте, що я оновив питання на основі коментарів нижче)

Оновлення

Виходячи з чудової відповіді @Neel нижче, я переглянув сайти, коментуючи обмежене та неохочене продовження , і справді здається, що, хоча call/ccбути невизначеним, це недостатньо. Тим часом першокласне обмежене продовження (на кшталт shift/reset) може бути використане, як видається, для вираження будь-якої структури контрольних потоків.


5
Яке формальне визначення "структури керуючого потоку"?
Гек Беннетт

4
Re: небажане продовження. Чи читали ви посилався документ Hayo Thielecke? Фактична заява полягає в тому, що непередбачені продовження , передбаченіcall/cc не можуть виражати винятки за відсутності держави . (Як зазначає Тієлке, винятки можуть бути реалізовані, пропустивши два продовження, одне для програми, а інше для обробника винятків, але для цього потрібно більше, ніж просто call/cc.)
rici

@ Rici: Я лише промальовував перші кілька сторінок. (Читання паперів займає у мене тривалий час). Дякуємо за коментар!
csl

@HuckBennett У мене немає формального визначення, але неофіційно я маю на увазі те, що було описано на en.wikipedia.org/wiki/Control_flow - конкретно я маю на увазі те, що ви можете використовувати продовження для вираження, і що ще важливіше, для реалізації, процедур, зелені нитки, винятки, повідомлення про аварійні зміни, ambоператор тощо.
csl

2
@csl Крім того, щоб зробити більш точним, що означає "структура потоку управління", ви також повинні бути більш зрозумілими, що означає щось "виразити". Це складна проблема, і відповідь на ваше запитання сильно залежить від того, що ви вважаєте висловом. Зрештою, ви завжди можете якось кодувати машину Тюрінга, яка кодує інтерпретатора мови за винятком (наприклад, Java). Але це, мабуть, не те, що ви маєте на увазі, тому вам потрібно обмежувати поняття "експресія" (наприклад, композиційність та / або повна абстракція).
Мартін Бергер

Відповіді:


11

У цій відповіді я візьму "експресивне", щоб означати "макро-експресивний" у значенні Felleisen 1991, Про виразну силу мов програмування . (Інтуїтивно зрозуміла, що мовна функція є макровиразною, якщо ви можете визначити її як перетворення локального джерела, не використовуючи перетворення цілої програми.)

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

Однак обмежений контроль - це універсальний ефект у наступному розумінні. У своїй докторській дисертації , Анджей Filinski показав , що будь-який висловимо побічний ефект є кодованим з використанням або розмежовані продовжень, або виклику / см і одну осередку стану. Приблизно, "виражений побічний ефект" - це будь-який ефект, монадичний тип якого можна визначити з точки зору типів мови програмування.

Дивно, але ця ідея здається досить цікавою на практиці. Впродовж останнього десятиліття Гордон Плоткін та Джон Пауер виступали за ідею взяти алгебраїчну семантику теорій ефектів : ідея полягає в тому, що ви вказуєте побічні операції, які вас цікавлять, і рівняння, які ви очікуєте, що вони задовольнять, а потім ви можете отримати загальну семантику, взявши вільну монаду над цією теорією.

Матія Претнар та Андрій Бауер застосували цей математичний підхід, а потім реалізували його своєю мовою Eff, щоб винайти нову мовну конструкцію, яка отримала назву "обробники ефектів": ви можете написати код, що використовує набір імперативних особливостей, а потім надати імперативним ознакам семантику написавши набір обробників, які говорять, як реалізувати кожну ефективну операцію.


Але якщо визначення таке: "Чи можете ви реалізувати будь-яку структуру потоку управління за допомогою Scheme and call / cc" (без емуляції), то відповідь має бути так ? Дивлячись на обговорення LtU lambda-the-ultimate.org/node/966, здається, що Олег Кисельов реалізував усі чотири F-оператори в Scheme з call / cc: okmij.org/ftp/continuations/… - excerpt "Код покладається on call / cc для зйомки непередбачених продовжень і використовує одну глобальну змінну комірку. Виявляється, це ефіцієнт для впровадження [...] інших операторів F ". ... "-F- через + F + F".
csl

Я визнаю, що ви використовуєте Felleisen "макро-експресивність" як кадр для вашої відповіді, але, як ви бачите, я вже змінив своє питання, щоб конкретно означати "реалізувати [у схемі] за допомогою call / cc". І хоча Олегу Кисельову потрібно запровадити глобальну змінну клітинку для впровадження всіх чотирьох операторів F для обмеженого продовження, я не думаю, що це означає "велику, глобальну перебудову програми" - практично кажучи, звичайно.
csl

Я прийму цю відповідь. Я також хотів би вказати на текст на okmij.org/ftp/continuations/undelimited.html#delim-vs-undelim, який має додаткові вказівники. Також здається, що першокласні обмежені продовження, такі як зсув / скидання, можуть використовуватися для реалізації будь-якої структури потоку управління. За посиланням: "Першокласне обмежене продовження може виражати будь-який виражений обчислювальний ефект, включаючи винятки та стан змін".
csl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.