Dapatkah panggilan / cc Skema menerapkan semua struktur aliran kontrol yang dikenal?

13

Halaman "Skema Lanjutan: Beberapa Bit Nakal" menyatakan:

Lanjutan adalah konstruksi aliran kontrol yang kuat dari mana hampir semua struktur aliran kontrol lainnya [...] dapat diturunkan.

Saya berpikir bahwa Skema ini call/cc, yang terkait (*) ke operator J Peter Landin ini, dapat digunakan untuk mengimplementasikan setiap struktur kontrol aliran dikenal?

Dengan "control flow structure" Saya secara khusus memikirkan deskripsi Wikipedia tentang mereka, misalnya pengecualian, coroutine, benang hijau dan sebagainya.

Secara khusus, apakah ada contoh struktur aliran kontrol yang tidak dapat diimplementasikan menggunakan call/cc?

(*) Saya belum bisa menggali kertas yang menetapkan yang call/ccsekuat operator J. Sebuah makalah oleh Felleisen (yang saya belum baca dan diakui memiliki masalah untuk memahaminya sepenuhnya) menyelidiki ini, dan tampaknya menyimpulkan bahwa meskipun mereka berada di kelas kompleksitas yang berbeda, mereka secara formal setara.

(Perhatikan juga bahwa saya telah memperbarui pertanyaan berdasarkan komentar di bawah)

Memperbarui

Berdasarkan jawaban yang sangat baik dari @Neel di bawah ini, saya telah melihat situs-situs yang mengomentari kelanjutan yang dibatasi dan tidak didahulukan , dan memang terlihat bahwa sementara call/cc, yang tidak direvisi, tidak cukup. Sementara itu, kelanjutan kelas pertama, dibatasi (seperti shift/reset) dapat digunakan, tampaknya, untuk mengekspresikan struktur aliran kontrol apa pun.

csl
sumber
5
Apa definisi formal dari "struktur aliran kontrol"?
Huck Bennett
4
Re: kelanjutan yang tidak direvisi. Apakah Anda membaca makalah yang dirujuk oleh Hayo Thielecke? Klaim yang sebenarnya adalah bahwa kelanjutan yang tidak ditentukan seperti yang disediakan olehcall/cc tidak dapat mengungkapkan pengecualian jika tidak ada negara . (Seperti yang ditunjukkan oleh Thielecke, pengecualian dapat diimplementasikan dengan mengedarkan dua kelanjutan, satu untuk program dan yang lainnya untuk penangan pengecualian, tetapi itu membutuhkan lebih dari sekadar call/cc.)
rici
@Rici: Saya hanya membaca beberapa halaman pertama. (Membaca makalah membutuhkan waktu lama bagi saya ). Terima kasih atas komentarnya!
csl
@HuckBennett Saya tidak memiliki definisi formal, tetapi secara informal saya maksudkan apa yang dijelaskan di en.wikipedia.org/wiki/Control_flow - secara khusus saya maksudkan bahwa Anda dapat menggunakan lanjutan untuk mengekspresikan, dan yang lebih penting, untuk mengimplementasikan, coroutine, utas hijau, pengecualian, pernyataan ambkabur, -operator, dan sebagainya.
csl
2
@csl Selain membuat lebih tepat apa artinya "struktur aliran kendali", Anda juga harus lebih jelas apa artinya "mengekspresikan" sesuatu. Ini adalah masalah yang sulit, dan jawaban atas pertanyaan Anda sangat bergantung pada apa yang Anda anggap sebagai ekspresi. Setelah semua, Anda selalu bisa entah bagaimana kode mesin Turing yang mengkode penerjemah bahasa dengan pengecualian (misalnya Jawa). Tapi itu mungkin bukan yang Anda pikirkan, jadi Anda perlu memberi batasan kuat pada konsep "ekspresi" (mis. Komposisionalitas dan / atau abstraksi penuh).
Martin Berger

Jawaban:

11

Dalam jawaban ini, saya akan mengambil "ekspresif" dengan maksud "makro-ekspresif" dalam arti Felleisen 1991, On The Expressive Power of Programming Languages . (Secara intuitif, fitur bahasa dapat diekspresikan makro jika Anda dapat mendefinisikannya sebagai transformasi sumber lokal, tanpa menggunakan transformasi seluruh program.)

Dengan definisi ini, jawabannya adalah tidak : kontrol dibatasi tidak makro-ekspresif dalam lambda-calculus + call / cc. Untuk mengekspresikan operator kontrol yang dibatasi menggunakan panggilan / cc. Untuk menerapkan pembatas kontrol (bagian reset shift / reset), Anda perlu beberapa negara untuk mensimulasikan tanda kelanjutan, pada dasarnya untuk menyandikan tumpukan untuk mensimulasikan masa dinamis dari tanda kelanjutan.

Namun, kontrol terbatas adalah efek universal, dalam arti berikut. Dalam tesis PhD-nya , Andrzej Filinski menunjukkan bahwa efek samping yang dapat diekskripsikan dikodekan menggunakan salah satu kelanjutan yang dibatasi, atau panggilan / cc dan sel tunggal negara. Secara kasar, "efek samping yang dapat diekspresikan" adalah setiap efek yang tipe monadiknya dapat didefinisikan berdasarkan jenis-jenis bahasa pemrograman.

Secara mengejutkan, ide ini tampaknya cukup menarik dalam praktiknya. Selama dekade terakhir, Gordon Plotkin dan John Power telah menganjurkan gagasan untuk mengambil semantik aljabar teori efek : idenya adalah bahwa Anda menentukan operasi efek samping yang Anda minati, dan persamaan yang Anda harapkan dapat mereka penuhi, dan kemudian Anda secara umum bisa mendapatkan semantik dengan mengambil monad gratis atas teori ini.

Matija Pretnar dan Andrej Bauer mengambil pendekatan matematis ini, dan kemudian mengimplementasikannya dalam bahasa Eff mereka untuk menciptakan konstruksi bahasa baru yang dijuluki "effect handler": Anda dapat menulis kode yang menggunakan serangkaian fitur imperatif, dan kemudian memberikan fitur imperatif semantik dengan menulis satu set penangan yang mengatakan bagaimana menerapkan setiap operasi yang efektif.

Neel Krishnaswami
sumber
Tetapi jika definisinya adalah: "Dapatkah Anda menerapkan struktur aliran kontrol menggunakan Skema dan panggilan / cc" (tanpa emulasi), maka jawabannya harus ya ? Melihat diskusi LtU lambda-the-ultimate.org/node/966 tampaknya Oleg Kiselyouv mengimplementasikan keempat operator F dalam Skema dengan panggilan / cc: okmij.org/ftp/continuations/… - excerpt "Kode ini bergantung pada on call / cc untuk menangkap kelanjutan yang tidak dilakukan sebelumnya, dan menggunakan satu sel yang bisa berubah global. Ternyata, ini cukup untuk mengimplementasikan [...] operator F lainnya ". ... "-F- melalui + F + F".
csl
Saya mengakui bahwa Anda menggunakan "ekspresi makro" Felleisen sebagai bingkai untuk jawaban Anda, tetapi seperti yang Anda lihat, saya telah mengubah pertanyaan saya untuk secara khusus berarti "mengimplementasikan [dalam Skema] menggunakan panggilan / cc". Dan sementara Oleg Kiselyov perlu memperkenalkan sel global yang bisa berubah untuk mengimplementasikan keempat operator F untuk kelanjutan yang dibatasi, saya tidak berpikir ini sama dengan "restrukturisasi besar-besaran global dari program ini" --- secara praktis, tentu saja.
csl
Saya akan menerima jawaban ini. Saya juga ingin menunjukkan teks di okmij.org/ftp/continuations/undelimited.html#delim-vs-undelim yang memiliki petunjuk tambahan. Tampaknya juga kelanjutan kelas terbatas , seperti shift / reset dapat digunakan untuk mengimplementasikan struktur aliran kontrol apa pun. Dari tautan: "Kelanjutan terbatas kelas satu dapat mengekspresikan efek komputasi yang dapat diekspresikan, termasuk pengecualian dan status yang dapat berubah."
csl