1 puan yazan GN⁺ 27 일 전 | 1 yorum | WhatsApp'ta paylaş
  • 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 List modü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.ml komutuyla 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 List modü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
  • Çalıştırma için C++ derleyicisi (g++) gerekiyor ve -Dlimit=100 seç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=999999 seç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ıyor
    • clang++, 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

Topluluk tepkileri ve tartışmalar

  • Özellik testi ve geri bildirim

    • redianthus, heterojen olmayan özyinelemeli veri türü desteği olup olmadığını soruyor
    • stedolan, %predint uygulanmadığı 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ıyor
    • stedolan, “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 yerine constexpr değ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.mlprimes.cpp oluşturulur
    • g++ -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

 
GN⁺ 27 일 전
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, filter gibi işlevleri doğrudan kendisi uygular
    Bu ş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

    • Büyük ölçüde katılıyorum ama 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