OCaml derleyicisi için yeni bir C++ arka ucu
(github.com/ocaml)- C++ kod üretimini destekleyen yeni bir arka uç, OCaml derleyicisi için önerildi; böylece mevcut C tabanlı arka ucun sınırlamaları tamamlanıyor
- Dönüştürülen kod saf fonksiyonel tarzda yazılıyor ve değiştirilebilir durum ya da standart kütüphane kullanmadan
Listmodülünün bir kısmını yeniden uyguluyor - Çalıştırma için C++ derleyicisi (
g++) gerekiyor; şablon derinliği sınırını kaldırma ve argüman iletimi için seçenekler destekleniyor - Performans derleyiciye göre değişiyor; geliştirilmiş öncelik kuyruğu tabanlı Elek algoritması uygulandığında hız ve bellek verimliliği artıyor
- Topluluk bunu fonksiyonel dil ile şablon metaprogramlamanın birleşimini deneyen bir çalışma olarak değerlendiriyor; Rust'a genişleme olasılığına da değiniliyor
C++ arka ucu ekleme önerisi
- OCaml derleyicisine (
ocamlc) C++ arka ucu ekleyen bir yama önerildi- Mevcut çalışma zamanı ve FFI'da kullanılan artımlı olmayan C arka ucunun geliştirilmiş bir biçimi
ocamlc -incr-c primes.mlkomutuyla OCaml kodu C++'a dönüştürülebiliyor
- Dönüştürülen C++ kodu saf fonksiyonel tarzda yazılıyor ve değiştirilebilir durumu desteklemiyor
- Bu nedenle standart kütüphane kullanılamıyor; örnekte
Listmodülünün bir kısmı saf fonksiyonel biçimde yeniden uygulanıyor - Çıktı,
Cons<hd, tl>biçiminde iç içe yapılarla ifade ediliyor; C++'ın::operatörüyle çakışmayı önlemek için ayrı bir yapı kullanılıyor
- Bu nedenle standart kütüphane kullanılamıyor; örnekte
- Çalıştırma için C++ derleyicisi (
g++) gerekiyor ve-Dlimit=100seçeneğiyle argüman iletilebiliyor- Çalıştırma sonucu derleyici hata mesajı biçiminde yazdırılıyor
- Büyük ölçekli hesaplamalarda
-ftemplate-depth=999999seçeneğiyle şablon derinliği sınırı kaldırılabiliyor
- Performans derleyiciye göre değişiyor
g++, 10000'e kadar asal sayı hesaplamasında yaklaşık 30 saniye ve 11GiB bellek kullanıyorclang++, 1 saniyeden kısa sürede bir uyarı verdikten sonra segmentation fault ile sonlanıyor- O’Neill'in öncelik kuyruğu tabanlı Elek algoritması uygulandığında sonuç 8 saniye ve 3.1GiB'ye iyileşiyor
- Gelecekteki genişleme yönü olarak Rust desteğinden söz ediliyor
- Rust kısmi
impl specializationözelliğini tamamladığında OCaml programlarını çalıştırmanın mümkün olacağı belirtiliyor
- Rust kısmi
Topluluk tepkileri ve tartışmalar
-
Özellik testi ve geri bildirim
redianthus, heterojen olmayan özyinelemeli veri türü desteği olup olmadığını soruyorstedolan,%predintuygulanmadığı için oluşan hatayı düzeltiyor ve ilgili türün düzgün çalıştığını doğruluyor
-
Mizah ve tepkiler
avsm, “C-- gerekiyordu ama C++ olmuş, bari C#'ta uzlaşalım” diye şaka yapıyorstedolan, “Gelecek yıl karmaşık sayı kümesi ℂ'yi deneyeceğim” diye yanıt veriyor- 😂, ❤️, 🚀 gibi çok sayıda emoji tepkisi, topluluğun olumlu yaklaşımını gösteriyor
-
Teknik öneriler
AdelKS, şablonlar yerineconstexprdeğerlendirmesi kullanan bir alternatif öneriyor- Derleme zamanında asalları hesaplayıp doğrudan ikiliye gömen örnek kod paylaşıyor
LoganDark, “O iş saf eğlence için” diyerek şablon kullanım nedenini esprili bir şekilde açıklıyor
-
Ek tartışmalar
redianthus, “Artık C++ gerçekten fonksiyonel bir dil oldu” diyor- OCaml'ın saf fonksiyonel veri yapılarının C++ içinde uygulanabildiğini vurguluyor
dzmitry-lahoda, Rust'ta da OCaml çalıştırabilen bir projenin (contextgeneric/cgp) zaten var olduğunu belirtiyor
Performans ve çalıştırma örnekleri
- Temel örnek: asal sayı hesaplama programı
ocamlc -incr-c primes.ml→primes.cppoluşturulurg++ -Dlimit=100 primes.cppçalıştırıldığında asal sayı listesi yazdırılır
-
Yüksek performans ayarı
g++ -ftemplate-depth=999999 -Dlimit=10000 primes.cpp- Yaklaşık 30 saniye, 11GiB bellek kullanımı
-
Geliştirilmiş algoritma uygulandığında
- Performans 8 saniye ve 3.1GiB'ye yükseliyor
Sonuç
- Bu PR, OCaml'ı C++'a dönüştüren yeni bir arka uç deneyi olarak, fonksiyonel diller ile şablon metaprogramlamanın birleşme olasılığını gösteriyor
- Topluluk bunu teknik mizah ile yaratıcı deneyin birleştiği bir örnek olarak görüyor ve aktif biçimde tepki veriyor
- Rust gibi diğer dillere genişleme olasılığı da ortaya konuyor
1 yorum
Hacker News yorumları
Gerçekten harika bir içerik. Uzun süre çalışan C++ kodu yazarken bir ipucu vermek istiyorum
Garip bir şekilde C++ yorumlayıcısında tail call optimization hiç yok
Bu yüzden çoğu idiomatik C++ kodu, yığının taşmaması için
reverse,map,range,filtergibi işlevleri doğrudan kendisi uygularBu şekilde uygularsanız bakımını yapan kişi için çok daha rahat olur
Komut satırı bayraklarına güvenmek yerine taşınabilir bir yaklaşım kullanmak daha iyi
“Bu tür gelişmiş veri yapıları kullanıldığında g++, 10000'den küçük asal sayıları yalnızca 8 saniyede hesaplıyor ve sadece 3.1GiB bellek kullanıyor” cümlesini görünce güldüm
Sonunda dizüstü bilgisayarımda da asal sayı hesaplayabilecek oldum
“Bu kod idiomatik ve okunması kolay C++'a çevriliyor” kısmına gerçekten katıldım
C++'ı seven biri olarak bunun gerçekten okunması güzel C++ kodu olduğunu düşünüyorum
typedef I<((I<((n::val (p::val))>::val) != (I<0>::val))> res;gibi kısımlar gerçekten büyü düzeyinde template numaralarıC++'ta type definition içinde koşul ifadesi gördüğümü hiç hatırlamıyorum
Sonradan bunun gerçek kod değil, template değerlendirme mantığının bir parçası olduğunu fark ettim
Yani yüksek seviyeli bir dilin derleyici mantığının bir kısmı template motoruna offload edilmiş
Böyle bir yaklaşım, parser'a daha fazla zaman harcamaktan daha verimli olabilir
Bu yüzden şimdi, üzerinde çalıştığım elevate compiler framework için lowering hedefi olarak C++ kullanmayı düşünmeye başladım
“C++ is a purely functional language” cümlesini görünce önce yazım hatası sandım ve kaşlarım kalktı
Ama hata olmadığını anlayınca daha da ilginç geldi. Geri kalanı da harikaydı
Bu yazı sayesinde günüm güzelleşti. Teşekkürler
Stephen Dolan yine hayal kırıklığına uğratmadı. Her seferinde şaşırtıyor
“C++ saf fonksiyonel bir dildir ve değiştirilebilir durumu desteklemez. C++ programlarını çalıştırmak için bir C++ yorumlayıcısı gerekir” kısmını görünce
Bir an bunun 1 Nisan şakası olduğunu sandım. Oysa Nisan çoktan geçti