- Diusulkan backend baru yang mendukung pembuatan kode C++ untuk kompiler OCaml, untuk melengkapi keterbatasan backend berbasis C yang ada
- Kode hasil konversi ditulis dalam gaya fungsional murni, tanpa state yang dapat diubah maupun penggunaan pustaka standar, dengan mereimplementasikan sebagian modul
List
- Untuk menjalankannya diperlukan kompiler C++ (
g++), serta dukungan opsi untuk menonaktifkan batas kedalaman template atau mengoper argumen
- Performa berbeda tergantung kompiler, dan saat menerapkan algoritme sieve berbasis priority queue yang disempurnakan, kecepatan serta efisiensi memori meningkat
- Komunitas menilai ini sebagai eksperimen yang menggabungkan bahasa fungsional dan template metaprogramming, serta menyebut kemungkinan perluasan ke Rust
Usulan penambahan backend C++
- Diusulkan patch untuk menambahkan backend C++ ke kompiler OCaml (
ocamlc)
- Merupakan bentuk pengembangan dari backend C non-incremental yang sudah digunakan di runtime dan FFI
- Kode OCaml dapat dikonversi ke C++ dengan perintah
ocamlc -incr-c primes.ml
- Kode C++ hasil konversi ditulis dalam gaya fungsional murni sehingga tidak mendukung state yang dapat diubah
- Akibatnya pustaka standar tidak dapat digunakan, dan pada contoh ini sebagian modul
List direimplementasikan secara fungsional murni
- Output direpresentasikan sebagai struktur bertingkat berbentuk
Cons<hd, tl>, menggunakan struktur terpisah untuk menghindari benturan dengan operator :: di C++
- Untuk menjalankannya dibutuhkan kompiler C++ (
g++), dan argumen dapat diteruskan dengan opsi -Dlimit=100
- Hasil eksekusi ditampilkan dalam format pesan galat kompiler
- Untuk komputasi skala besar, batas kedalaman template dapat dinonaktifkan dengan opsi
-ftemplate-depth=999999
- Performa bervariasi tergantung kompiler
g++ membutuhkan sekitar 30 detik dan 11GiB memori untuk menghitung bilangan prima hingga 10000
clang++ memunculkan peringatan dalam kurang dari 1 detik lalu mengalami segmentation fault
- Saat menerapkan algoritme sieve O’Neill berbasis priority queue, hasilnya membaik menjadi 8 detik dan 3.1GiB
- Sebagai arah pengembangan berikutnya, disebutkan dukungan Rust
- Disebutkan bahwa jika Rust melengkapi
impl specialization parsial, program OCaml kemungkinan dapat dijalankan
Reaksi dan diskusi komunitas
-
Pengujian fitur dan umpan balik
redianthus menanyakan apakah ada dukungan untuk non-uniform recursive data type
stedolan memperbaiki galat akibat %predint yang belum diimplementasikan dan memastikan tipe tersebut berjalan dengan baik
-
Humor dan reaksi
avsm melontarkan candaan, “Kita butuh C--, tapi malah C++, jadi kompromi saja dengan C#”
stedolan menjawab, “Tahun depan saya akan mencoba bilangan kompleks ℂ”
- Banyak reaksi emoji seperti 😂, ❤️, dan 🚀 yang menunjukkan sambutan positif dari komunitas
-
Usulan teknis
AdelKS mengusulkan alternatif dengan memakai evaluasi constexpr alih-alih template
- Ia membagikan contoh kode yang menghitung bilangan prima saat waktu kompilasi lalu langsung memasukkannya ke dalam biner
LoganDark menjawab dengan humor bahwa “itu murni untuk kesenangan”, menjelaskan alasan penggunaan template
-
Diskusi tambahan
redianthus berkomentar bahwa “sekarang C++ akhirnya menjadi bahasa fungsional sejati”
- Ia menekankan bahwa struktur data fungsional murni milik OCaml kini bisa diimplementasikan di C++
dzmitry-lahoda juga menyebut proyek yang sudah memungkinkan eksekusi OCaml di Rust, yaitu contextgeneric/cgp
Contoh performa dan eksekusi
- Contoh dasar: program penghitungan bilangan prima
ocamlc -incr-c primes.ml → menghasilkan primes.cpp
- Menjalankan
g++ -Dlimit=100 primes.cpp akan menampilkan daftar bilangan prima
-
Konfigurasi performa tinggi
g++ -ftemplate-depth=999999 -Dlimit=10000 primes.cpp
- Sekitar 30 detik, menggunakan memori 11GiB
-
Saat memakai algoritme yang ditingkatkan
- Performa meningkat menjadi 8 detik dan 3.1GiB
Kesimpulan
- PR ini adalah eksperimen backend baru yang mengubah OCaml menjadi C++,
menunjukkan kemungkinan penggabungan bahasa fungsional dan template metaprogramming
- Komunitas menerimanya sebagai contoh perpaduan humor teknis dan eksperimen kreatif dan menanggapinya dengan antusias
- Kemungkinan perluasan ke bahasa lain seperti Rust juga telah disebutkan
1 komentar
Komentar Hacker News
Ini benar-benar luar biasa. Saya ingin memberi satu tips saat menulis kode C++ yang berjalan lama
Anehnya, interpreter C++ sama sekali tidak memiliki tail call optimization
Karena itu, sebagian besar kode C++ yang idiomatis mengimplementasikan langsung fungsi seperti
reverse,map,range, danfilteragar stack tidak meledakJika diimplementasikan seperti ini, orang yang memeliharanya akan jauh lebih nyaman. Sebaiknya gunakan pendekatan yang portabel dan jangan bergantung pada flag command line
Saya tertawa saat membaca kalimat, “Dengan menggunakan struktur data tingkat tinggi seperti ini, g++ dapat menghitung bilangan prima di bawah 10000 hanya dalam 8 detik, dan hanya memakai memori 3.1GiB”
Akhirnya saya bisa melakukan perhitungan bilangan prima di laptop saya juga
Saya benar-benar setuju saat membaca bagian, “Kode ini diterjemahkan menjadi C++ yang idiomatis dan mudah dibaca”
Sebagai orang yang menyukai C++, saya pikir ini benar-benar kode C++ yang enak dibaca
typedef I<((I<((n::val (p::val))>::val) != (I<0>::val))> res;benar-benar trik template setingkat sihirIni pertama kalinya saya melihat ekspresi kondisional dimasukkan ke dalam definisi tipe di C++
Belakangan saya sadar ini bukan kode nyata, melainkan bagian dari logika evaluasi template
Artinya, sebagian logika compiler bahasa tingkat tinggi ini pada dasarnya dialihkan ke template engine
Pendekatan seperti ini mungkin bisa lebih efisien daripada menghabiskan lebih banyak waktu pada parser
Karena itu, sekarang saya jadi berpikir untuk mencoba memakai C++ sebagai target lowering untuk framework compiler elevate yang sedang saya kembangkan
Saat melihat kalimat “C++ is a purely functional language”, awalnya saya mengira itu salah ketik dan alis saya langsung terangkat
Tapi setelah tahu itu memang bukan salah ketik, saya malah jadi lebih tertarik. Isi selebihnya juga sangat bagus
Tulisan ini membuat hari saya menyenangkan. Terima kasih
Stephen Dolan memang tidak pernah mengecewakan. Selalu memberi kejutan
Saat membaca bagian, “C++ adalah bahasa yang murni fungsional dan tidak mendukung state yang dapat diubah. Untuk menjalankan program C++, diperlukan interpreter C++”
Sesaat saya mengira ini lelucon April Mop. Padahal bulan April sudah lewat