Kompilator Stalin secara brutal mengoptimalkan, tetapi bagaimana?

14

Pernyataan penelitian JM Siskind menyatakan:

Stalin adalah kompiler pengoptimalisasi untuk Skema yang melakukan analisis statis seluruh program dan menggunakan hasil analisis itu untuk menghasilkan kode yang sangat efisien. Stalin menggunakan banyak koleksi teknik analisis statis. Ini melakukan bentuk baru dari analisis aliran polivarian yang menggunakan analisis aliran monovarian berulang untuk melakukan pemisahan yang diarahkan pada aliran: kloning salinan prosedur khusus dan penugasan target panggilan per lokasi untuk klon-klon tersebut. Ini menggunakan hasil analisis aliran untuk melakukan analisis seumur hidup, analisis pelarian, analisis point-to, dan analisis must-alias. Analisis ini mendukung bentuk baru konversi penutupan ringan yang menghilangkan sebagian besar slot penutupan, menggunakan teknik seperti variabel globalisasi dan lokalisasi, kompres rantai belakang statis, dan biasanya menghilangkan sebagian besar penutupan dari program. Ini juga menggunakan analisis di atas untuk mendukung manajemen penyimpanan berbasis wilayah diarahkan aliran, di mana pengumpulan sampah run-time diganti dengan alokasi statis dan deallokasi pada basis per-nilai-abstrak dan per-program-poin. Ia juga melakukan konversi CPS ringan terarah aliran, menggunakan ekstensi teknik yang dipelopori dengan Screamer, untuk mendukung kelanjutan kelas satu yang sangat efisien. Akhirnya, ia mendukung pemilihan inlining yang diarahkan aliran dan tingkat rendah untuk memilih implementasi (atau non implementasi) dari tag, pengecekan tag, dan pengiriman tag berdasarkan basis per-nilai-abstrak dan per-program-titik. Ini menghilangkan sebagian besar tag run-time, pengecekan tag, penandaan, pengupasan tag, pengiriman tag, tinju, dan unboxing dari program. di mana pengumpulan sampah run-time diganti dengan alokasi dan deallokasi statis berdasarkan nilai per abstrak dan per poin program. Ia juga melakukan konversi CPS ringan terarah aliran, menggunakan ekstensi teknik yang dipelopori dengan Screamer, untuk mendukung kelanjutan kelas satu yang sangat efisien. Akhirnya, ia mendukung pemilihan inlining yang diarahkan aliran dan tingkat rendah untuk memilih implementasi (atau non implementasi) dari tag, pengecekan tag, dan pengiriman tag berdasarkan basis per-nilai-abstrak dan per-program-titik. Ini menghilangkan sebagian besar tag run-time, pengecekan tag, penandaan, pengupasan tag, pengiriman tag, tinju, dan unboxing dari program. di mana pengumpulan sampah run-time diganti dengan alokasi dan deallokasi statis berdasarkan nilai per abstrak dan per poin program. Ia juga melakukan konversi CPS ringan terarah aliran, menggunakan ekstensi teknik yang dipelopori dengan Screamer, untuk mendukung kelanjutan kelas satu yang sangat efisien. Akhirnya, ia mendukung pemilihan inlining yang diarahkan aliran dan tingkat rendah untuk memilih implementasi (atau non implementasi) dari tag, pengecekan tag, dan pengiriman tag berdasarkan basis per-nilai-abstrak dan per-program-titik. Ini menghilangkan sebagian besar tag run-time, pengecekan tag, penandaan, pengupasan tag, pengiriman tag, tinju, dan unboxing dari program. menggunakan ekstensi teknik yang dipelopori dengan Screamer, untuk mendukung kelanjutan kelas satu yang sangat efisien. Akhirnya, ia mendukung pemilihan inlining yang diarahkan aliran dan tingkat rendah untuk memilih implementasi (atau non implementasi) dari tag, pengecekan tag, dan pengiriman tag berdasarkan basis per-nilai-abstrak dan per-program-titik. Ini menghilangkan sebagian besar tag run-time, pemeriksaan tag, penandaan, pengupasan tag, pengiriman tag, tinju, dan unboxing dari program. menggunakan ekstensi teknik yang dipelopori dengan Screamer, untuk mendukung kelanjutan kelas satu yang sangat efisien. Akhirnya, ia mendukung pemilihan inlining yang diarahkan aliran dan tingkat rendah untuk memilih implementasi (atau non implementasi) dari tag, pengecekan tag, dan pengiriman tag berdasarkan basis per-nilai-abstrak dan per-program-titik. Ini menghilangkan sebagian besar tag run-time, pemeriksaan tag, penandaan, pengupasan tag, pengiriman tag, tinju, dan unboxing dari program.Analisis dan optimisasi ini memungkinkan Stalin untuk menghasilkan kode yang sangat efisien yang mengungguli semua kompiler Skema lainnya dengan faktor-faktor yang berkisar antara dua dan seratus, terutama untuk kode intensif numerik. Stalin sering menghasilkan kode yang mengungguli tulisan tangan c dan kode Fortran.

Saya dapat menemukan makalah yang sangat menarik berikut tentang implementasi penutupan / pemanggilan fungsi: Flow-Directed Conversion Penutupan Ringan . Saya juga telah mengirim email kepada penulis untuk bertanya tentang makalah tentang topik lain, yang disebutkan ditulis dalam makalah konversi penutupan:

Siskind, JM 2000a. Konversi CPS ringan terarah aliran. Dalam persiapan.

Siskind, JM 2000b. Polivarians terarah aliran. Dalam persiapan.

Siskind, JM 2000c. Pemilihan representasi terarah-aliran. Dalam persiapan.

Siskind, JM 2000d. Manajemen penyimpanan yang diarahkan pada aliran. Dalam persiapan

Sayangnya, dia tidak pernah sempat menulis makalah itu. Pertanyaan saya kepada Anda adalah: adakah alternatif atau makalah terkait yang membahas topik ini? Saya sangat tertarik untuk mempelajari bagaimana Stalin (atau kompiler lain) dapat mengkompilasi bahasa tingkat tinggi seperti Skema yang dikumpulkan sampah, diketik secara dinamis, mendukung fungsi-fungsi kelas satu, dan bahkan kelanjutan kelas satu, dapat secara statis dikompilasi ke kode efisien seperti itu . Meskipun makalah tentang analisis aliran cukup banyak, makalah tentang menggunakan hasil analisis tersebut untuk melakukan optimasi yang disebutkan di atas tidak.

Jules
sumber

Jawaban:

11

Kuncinya mungkin adalah fakta bahwa ia menggunakan analisis seluruh program dan optimasi seluruh program. Semakin banyak Anda tahu tentang bagaimana suatu program berperilaku, semakin Anda dapat mengkhususkan diri dan sebaris dan membuat pemain.

Kompiler MLton untuk ML Standar melakukan hal serupa ( http://mlton.org/ ). Ada satu presentasi (setidaknya) tentang itu: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Pekerjaan sebelumnya dilakukan oleh Craig Chambers dan kelompoknya di Universitas Washington (misalnya: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). Ini dilakukan dalam konteks Diri dan kemudian Cecil / Vortex.

Mungkin ada lebih banyak pekerjaan di komunitas Skema / Lisp. Anda mungkin ingin mempertimbangkan googling "optimasi seluruh program".

Dave Clarke
sumber