Kompiler bersertifikat dan optimisasi dalam Coq / Agda

9

Saya tertarik pada kompiler terverifikasi yang diformalkan dalam teori tipe Martin-Löf, yaitu Coq / Agda. Saat ini saya sudah menulis contoh mainan kecil. Dengan demikian saya dapat membuktikan bahwa optimasi saya benar. Misalnya penambahan dengan nol dapat dihilangkan, yaitu ekspresi seperti "x + 0".

Adakah optimasi yang sulit dilakukan dengan kompiler biasa, yang akan berfungsi sebagai contoh yang baik? Apakah mungkin untuk membuktikan sifat-sifat tertentu dari suatu program yang memungkinkan optimasi yang tidak mungkin dilakukan dengan kompiler biasa? (Yaitu tanpa inferensi yang dimungkinkan dengan teorema teorema)

Saya akan tertarik dengan ide atau contoh dan juga referensi tentang topik tersebut.

Pertanyaan terkait: Bukti kebenaran kompiler

sunting: Seperti yang dikatakan Tsuyoshi dengan baik di komentar: Saya mencari teknik optimasi yang sulit untuk diterapkan jika kompiler ditulis dalam (katakanlah) C tetapi lebih mudah untuk diterapkan jika kompiler ditulis dalam (katakanlah) Coq. Ketika Agda mengkompilasi ke C (melalui haskell) dimungkinkan untuk melakukan segala sesuatu yang mungkin dalam Agda juga dalam C. Mungkin satu-satunya manfaat pembalik teorema seperti Coq / Agda adalah bahwa kompiler dan optimisasi dapat diverifikasi.

sunting2: Seperti yang disarankan oleh Vijay DI tulis apa yang sudah saya baca sejauh ini. Saya terutama berfokus pada Xavier Leroy dan proyek CompCert di INRIA (ada kertas 80 halaman yang merupakan bacaan yang baik, saya pikir). Minat kedua adalah karya Anton Setzer pada program interaktif. Saya pikir itu mungkin karyanya dapat digunakan untuk membuktikan properti tentang program IO dan bisimulasi program IO. Terima kasih telah menyebut Sewell. Saya pernah mendengar ceramahnya "Kisah-kisah dari hutan" di ICFP dan mungkin membaca 2-3 makalahnya. Tetapi saya belum secara khusus melihat pekerjaannya dan rekan penulisnya.
Saya belum menemukan di mana harus memulai atau mencari makalah tentang mengoptimalkan kompiler; misal, optimasi mana yang menarik untuk dilihat dalam pengaturan kompiler terverifikasi.

mrsteve
sumber
1
“Apakah ada optimasi yang sulit dilakukan dengan kompiler reguler”: Bukankah itu tidak mungkin? Jika saya menghapus bukti kebenaran dari kompiler terverifikasi, saya akan mendapatkan kompiler biasa. Oleh karena itu, apa pun yang dapat dilakukan oleh kompiler terverifikasi dapat dilakukan juga oleh kompiler biasa. Inti dari kompiler yang terverifikasi adalah ia tidak dapat melakukan optimasi yang tidak benar. (Pengetahuan saya tentang kompiler dan verifikasi program minimal. Maaf jika saya tidak mengerti intinya.)
Tsuyoshi Ito
@ Tsuyoshi terima kasih atas komentar Anda. Maksud saya: Dapatkah saya membuktikan properti tertentu (yang dijamin tahan) untuk suatu program (misalnya, subrutin adalah tidak masuk dan tidak pernah dapat menyebut dirinya sendiri) yang memungkinkan untuk melakukan optimasi yang biasanya tidak mungkin dilakukan. Beberapa invarian mungkin sulit untuk memverifikasi suatu program dan mungkin optimasi ini tidak dilakukan oleh kompiler yang biasa digunakan. Tapi mungkin saya benar-benar salah.
mrsteve
1
Apakah Anda berbicara tentang kompiler yang ditulis dalam Coq / Agda atau kompiler untuk Coq / Agda? Saya pikir pertanyaan Anda adalah tentang kompiler yang ditulis dalam Coq / Agda, tapi kemudian saya tidak berpikir bahwa kompiler yang ditulis dalam Coq / Agda dapat membuktikan lebih banyak properti tentang program target daripada kompiler yang ditulis dalam C.
Tsuyoshi Ito
2
Akan bagus untuk menambahkan apa yang telah Anda baca ke pertanyaan. Apakah Anda terbiasa dengan pekerjaan kompilasi yang terverifikasi - Xavier Leroy, misalnya? Atau Peter Sewell dan kolaboratornya?
Vijay D
1
Tidak ada optimasi seperti itu, kecuali jika Anda lebih membatasi pertanyaan Anda. Dalam kasus ekstrem, kompiler C dapat secara diam-diam mengimplementasikan prover teorema dalam ususnya (dan sebagian besar melakukannya dengan cara yang terbatas). Saya pikir tidak jelas apa yang Anda maksud dengan "kompiler biasa".
Andrej Bauer

Jawaban:

5

makalah ini oleh Yves Bertot, Benjamin Gr'egoire, dan Xavier Leroy membangun kompiler pengoptimalisasi untuk bahasa mirip-C yang murni berdasarkan pada spesifikasi Coq. beberapa teknologi ini tampaknya digunakan dalam kompiler C CompCert .

Pendekatan terstruktur untuk membuktikan optimisasi kompiler berdasarkan analisis aliran data

itu mempertimbangkan kebenaran dari dua optimisasi, propagasi konstan (CP) dan eliminasi subekspresi umum (CSE), bagian 4. optimisasi ini lebih maju daripada yang terkait dengan kompiler berbasis non-Coq (s) untuk bahasa yang sama. lihat misalnya grafik benchmark ini dibandingkan dengan gcc. (Kompilator berbasis Coq mungkin lebih lambat untuk dikompilasi meskipun ini jarang disebutkan!)

Aspek asli ConCert adalah bahwa sebagian besar kompiler ditulis langsung dalam bahasa spesifikasi Coq, dengan gaya fungsional murni. Kompiler yang dapat dieksekusi diperoleh dengan ekstraksi otomatis kode Caml dari spesifikasi ini.

Namun pada akhir makalah mereka mencatat bahwa ada beberapa optimasi kompiler dalam kompiler nyata yang tidak dapat dimodelkan dalam kerangka kerja mereka.

peningkatan optimasi bukan satu-satunya unsur pertimbangan di sini, aspek lain adalah bahwa logika optimisasi kompiler dapat dikenakan cacat halus karena sifatnya yang kompleks. selama bertahun-tahun gcc telah ditemukan memiliki bug dalam berbagai rutinitas logika optimasinya. misalnya bug gcc?

vzn
sumber
3

Dapatkah saya membuktikan sifat-sifat tertentu (yang dijamin tahan) untuk suatu program (misalnya, subrutin adalah non-peserta dan tidak pernah dapat menyebut dirinya) yang memungkinkan untuk melakukan optimasi yang biasanya tidak mungkin dilakukan.

Ini sama dengan memperluas typechecker untuk menyediakan beberapa properti program ke optimizer. Saya percaya Tsuyoshi Ito benar dan Anda mungkin sedikit salah kaprah tentang Coq. Ini adalah alat yang hebat untuk menyediakan kompiler bug-kurang, tetapi dalam kasus yang Anda jelaskan, itu tidak memberikan lebih banyak kekuatan untuk analisis statis.

Satu-satunya hal yang dapat saya pikirkan tentang memperkuat analisis statis dengan Coq, adalah melengkapi bahasa Anda dengan pernyataan yang mengandung beberapa bukti yang ditulis pengguna. - Jika kompiler itu sendiri akan diterjemahkan ke dalam bahasa termasuk bulu untuk pemeriksaan ketik dinamis, dan jika bukti yang ditulis pengguna akan dapat dikonversi ke fungsi, maka akan mungkin untuk menerapkan fungsi-fungsi tersebut sebagai properti prasyarat untuk beberapa subtipe atau optimisasi. - Ini memang, akan memberikan daya lebih kepada kompiler.

Namun, sejauh yang saya bisa lihat, ini akan lebih berguna untuk memperkuat subtyping. - Sulit membuat programmer mengetahui, properti apa di tempat apa yang akan membantu pengoptimal.

Number47
sumber