Adakah yang menggunakan defactalisasi polimorfik Pottier dan Gauthier dalam kompiler modular?

15

Defungsionalisasi adalah transformasi program yang mengubah program tingkat tinggi menjadi program tingkat pertama. Idenya adalah bahwa diberikan suatu program, hanya ada banyak lambda-abstraksi, sehingga Anda dapat mengganti setiap lambda dengan id, dan setiap aplikasi fungsi dengan panggilan ke prosedur yang berlaku yang bercabang pada id itu. Ini kadang - kadang digunakan dalam kompiler untuk bahasa fungsional, tetapi penerapannya dibatasi oleh fakta bahwa defungsionalisasi adalah transformasi seluruh program (Anda harus secara statis mengetahui semua fungsi dalam program), dan hanya kompiler seluruh program yang menggunakan Itu.

Namun, Pottier dan Gauthier telah diberikan algoritma defactalization diketik polimorfik menggunakan pengetikan yang lebih canggih yang melibatkan GADTs. Sekarang, mengingat penyandiannya, dimungkinkan untuk menambahkan case catch-all ke datatype lambda mereka yang bukan tag, tetapi yang berisi fungsi orde tinggi. Ini berarti bahwa itu harus dimungkinkan untuk menggunakan pengkodean mereka untuk melumpuhkan pada basis modul-demi-modul.

Adakah yang melakukan ini, dan arahkan saya ke kompiler menggunakan ide ini? (Kompilator Toy tidak apa-apa, dan sebenarnya lebih disukai.)

Neel Krishnaswami
sumber

Jawaban:

6

Satu pendekatan dijelaskan oleh

Georgios Fourtounis dan Nikolaos S. Papaspyrou. 2013. Mendukung Kompilasi Terpisah dalam Kompilator yang Berfungsi Kembali. SLATE 2013.

Seperti @gasche menyebutkan:

Pendekatan yang berbeda untuk masalah ini adalah untuk mempertimbangkan bahwa setiap modul dapat mendefinisikan sendiri jenis "fungsi yang tidak berfungsi" dan operator / penangan.

nsaya0<saya<nn-saya

Blaisorblade
sumber
4

Sekarang, mengingat penyandiannya, dimungkinkan untuk menambahkan case catch-all ke tipe data lambda mereka yang bukan tag, tetapi yang berisi fungsi orde tinggi. Ini berarti bahwa itu harus dimungkinkan untuk menggunakan pengkodean mereka untuk melumpuhkan pada basis modul-demi-modul.

Bisakah Anda menguraikan sedikit lebih banyak tentang apa yang Anda maksud di sini? Saya tidak mengerti bagaimana menambahkan case dasar (apakah itu pada tipe data, ke pola yang cocok dari fungsi pengiriman, atau keduanya?) Membantu modularitas dalam cara Anda menggambarkan; ngomong-ngomong, mengapa maksudmu persis dengan basis "modul demi modul"?

Saya bisa membayangkan "kasus dasar" sedang digunakan, di dalam modul / program yang diberikan, untuk defungsionalisasi selektif : Anda akan memiliki konstruktor tambahan untuk jenis fungsi yang Anda tentukan yang bukan sebuah tag, tetapi hanya menyematkan semua 'a -> 'bfungsi, sehingga mengemas semua fungsi, sehingga mengemas suatu fungsi dalam konstruktor ini, alih-alih memberikannya tag reified, akan mencegah defungsionalisasi.

Pendekatan yang berbeda untuk masalah ini adalah untuk mempertimbangkan bahwa setiap modul dapat mendefinisikan sendiri jenis "fungsi yang tidak berfungsi" dan operator / penangan. Fungsi dari modul M1akan memiliki tipe M1.arrowdan diterapkan menggunakan M1.apply, dll. Sementara itu berfungsi dengan baik untuk penggunaan fungsi urutan pertama, saya tidak cukup baik melihat bagaimana Anda dapat memperluasnya ke fungsi tingkat tinggi (yang seharusnya tidak harus tahu dari mana argumen fungsionalnya berasal): jika Anda menggabungkan suatu fungsi dengan dispatchernya, Anda memasukkan kembali bidang pemanggilan fungsi tidak langsung.

Akhirnya, ada dalam makalah yang Anda referensikan dengan cepat menyebutkan seluruh program vs pendekatan modular, tapi saya tidak melihat bagaimana itu berkaitan dengan proposal Anda. Apa yang mereka gambarkan dinyatakan dalam "ekstensi terbuka" dari kedua fungsi dan tipe data (fungsi dan tipe yang dapat didefinisikan di beberapa modul independen). Ini sebagian besar merupakan cara ML untuk menggambarkan fakta bahwa Anda dapat menunda kombinasi analisis / transformasi modul independen pada waktu-tautan, mengendurkan perlunya transformasi seluruh program.

gasche
sumber