- Bir geliştirici, prodüksiyonda 8 yıl Haskell ve 8 ay OCaml kullanma deneyimine dayanarak iki fonksiyonel dilin gerçek geliştirme hissini karşılaştırıyor
- Haskell daha özlü bir söz dizimi ve güçlü tip özellikleri sunuyor; ancak seçeneklerin çokluğu tasarım ve soyutlamaya fazla zihinsel enerji harcatabiliyor
- OCaml, özellik sayısı daha az olsa da first-class modules, pratik değiştirilebilirlik ve öngörülebilir kod stili sayesinde uygulamaya odaklanmayı kolaylaştırıyor şeklinde değerlendiriliyor
- Ekosistem Haskell’de daha büyük; fakat kütüphane seçimi başlı başına ayrı bir beceri gibi hissedilebiliyor. OCaml ise küçük olsa da gerekli araçlar beklenenden iyi çalışıyor
- Her iki dil de ana akım dillere göre küçük ve standart kütüphaneleri neredeyse minimal; ancak belirli bir SDK bağımlılığı çok kritik değilse endüstriyel uygulama geliştirmek için yeterince kullanılabilir
Karşılaştırmanın çıkış noktası
- Ölçüt, prodüksiyonda 8 yıl Haskell, 8 ay OCaml kullanma deneyimi
- Karşılaştırma eksenleri söz dizimi, dil özellikleri, ekosistem, araçlar, derleyici mesajları ve standart kütüphane
- Her iki dil de gerçek endüstriyel gereksinimleri destekleyecek kadar gelişmiş durumda; ancak mevcut tercih OCaml tarafına daha yakın
Söz dizimi: Haskell daha özlü, OCaml de ML ailesinin avantajlarına sahip
- Haskell, fikirleri çok az karakterle ifade edebildiği için söz dizimsel zarafeti güçlü biçimde hissettiriyor
- OCaml de ML ailesi bir dil olarak çok iyi; ancak Haskell daha örtük (tacit) bir stil sunuyor
- Bir string içindeki sayıların toplamı örneğinde Haskell bunu
sum . map read . wordsile kısa biçimde ifade ederken, OCaml pipeline ile string’i bölme, dönüştürme ve fold etme adımlarını açıkça gösteriyor - İkili ağaç tipi tanımı, iki dilde de cebirsel veri tiplerini doğal biçimde ifade ediyor
- Ayrıştırma örneklerinde iki dil de pattern matching ve option değerleri kullanıyor; ancak Haskell do notasyonu ve
guard, OCaml iseOption.bindve açıkmatchkullanıyor
Özellikler: Haskell zengin, OCaml daha az dikkat dağıtıyor
- Haskell’de özellik sayısı o kadar fazla ki karşılaştırma noktası olarak C++ akla gelebiliyor
- Birçok özellik, sorunları incelikli çözmek için araç sağlıyor; fakat gerçek uygulamaya geçmeden önce çözümü nasıl tasarlamak gerektiğini düşündürebiliyor
- Haskell’de
TypeFamilies,DataKinds,GADTsgibi seçenekler arasında tasarıma dalmak kolay - Mevcut OCaml projelerinde kötü durumlar genelde yetersiz değişken adları, eksik dokümantasyon ve 200 satırdan uzun fonksiyonlar düzeyinde kalıyor; bunlar yönetilebilir görülüyor
- Buna karşılık mevcut Haskell projeleri, 8 yıllık deneyimle bile hazırlıklı olmanın zor olduğu karmaşıklıklarla karşılaştırabiliyor
- Bu fark nedeniyle OCaml’de daha üretken hissediliyor
-
İki dilin paylaştığı özellikler
- İfade merkezli söz dizimi, varsayılan immutability, higher-order fonksiyonlar, anonim fonksiyonlar, cebirsel veri tipleri ve pattern matching sunuyorlar
- Parametrik polimorfizm, tip çıkarımı, monad söz dizimi şekeri, garbage collector, multithreading ve GADTs de ortak olarak kullanılabiliyor
-
Haskell tarafında daha belirgin özellikler
- Haskell varsayılan saflık, birleştirilebilir lazy evaluation, type class’lar, higher-kinded type’lar ve isteğe bağlı dil uzantıları sunuyor
- Çok sayıda güçlü özelliğe sahip olduğu için soyutlama biçimi projeden projeye büyük ölçüde değişebiliyor
-
OCaml tarafında daha belirgin özellikler
- OCaml first-class modules, polymorphic variants, nesneler, sınıflar ve kalıtım ile kullanımı kolay değiştirilebilirlik sunuyor
- Özellik yelpazesi Haskell’den daha dar; ancak bu durum kod tabanını daha öngörülebilir kılma avantajına dönüşüyor
Ekosistem: Haskell daha büyük, OCaml’de gerekli çözümler var
- Her iki dil de niş fonksiyonel programlama dilleri olduğu için en yeni framework’lerde first-class destek beklemek zor
- Yine de genel işlerin çoğu için çözümler var; bazı durumlarda daha fazla custom binding yazmak gerekebiliyor
- OCaml’de de pratikte gerekli paketler aşağıdaki gibi bulunabiliyor
- otoml: TOML ayrıştırıcı
- Mint Tea: TUI framework’ü
- ocaml-opentelemetry: OpenTelemetry enstrümantasyonu
- awsm: OCaml AWS istemcisi
- petrol: Hızlı OCaml SQL API’si
- Haskell ekosisteminde daha fazla paket ve hazır kullanılabilir çözüm var
- Stripe API istemci kütüphanesi Haskell’de 13 adet, OCaml’de 1 adet; OCaml tarafındaki son değişiklik 8 yıl önce olduğundan fiilen 0’a yakın görülüyor
- Haskell’de çözümü bulduktan sonra bile çok fazla seçenek arasından hangi kütüphaneyi seçeceğine karar vermek gerekiyor
- Kütüphane seçimi ayrı bir beceri gibi ele alındığından, kütüphane değerlendirme yöntemi üzerine yazılmış bir yazı da var
- Yeni bir Haskell kütüphanesi çoğu zaman başka bir sorunu çözmekten ziyade farklı bir soyutlama ya da yeni bir özellikle başka türlü yazmak istemekten doğuyor
- GitHub API istemcisi yapıp bolca JSON ayrıştırmaktansa, comonad’larla logger tasarlamak daha ilginç gelebiliyor
Araçlar: Haskell güçlü ama dalgalı, OCaml iyi çalışıyor
- Haskell araçlarında güçlü avantajlar ile kullanılabilirlik sorunları bir arada bulunuyor
- Hoogle, yalnızca tip imzasıyla tüm ekosistemde arama yapmayı sağlayan güçlü bir araç
- Buna karşılık build aracı hata mesajları, çalışan bir projede build planı bulamama durumları, paket değişikliği sonrası IDE’nin yeniden derleme yapması, belirli sürüm standart kütüphane dokümantasyonunun bulunmaması gibi sorunlar var
- Haskell araç deneyiminde, diğer dillerin bu tür araçlar olmadan nasıl kullanıldığına şaşırılan anlar ile Haskell kullanıcılarının temel kullanılabilirlik olmadan nasıl idare ettiğine şaşırılan anlar bir arada yaşanıyor
- OCaml ekosistemi daha küçük olduğu için bir şeyin çalıştığını görmek her seferinde şaşırtıcı olabiliyor
- LSP tabanlı VSCode OCaml eklentisi ek ayar gerektirmeden çalıştı ve sorun çıkarmadı
- OCaml araçlarına giriş deneyimi en konforlu olmasa da sezgisel, sağlam ve çoğu durumda düzgün çalışıyor
-
Araç karşılaştırması
- Derleyici: OCaml’de ocaml, Haskell’de ghc
- REPL: OCaml’de utop, Haskell’de ghci
- Build aracı: OCaml’de dune, Haskell’de cabal ve stack
- Paket yöneticisi ve depo: OCaml’de opam, Haskell’de cabal ve Hackage
- Linter: OCaml’de zanuda, Haskell’de hlint
- Formatter: OCaml’de ocamlformat ve topiary, Haskell’de fourmolu, stylish-haskell, hindent, ormolu
- Tip arama ve kod arama: OCaml’de Sherlodoc ve Sherlocode, Haskell’de Hoogle ve Hackage Search
- Çevrimiçi playground ve LSP: OCaml’de TryOCaml ve ocaml-lsp, Haskell’de Haskell Playground ve HLS
Derleyici mesajları: Haskell uzun, OCaml öz
- Fonksiyonel dillerde derleyici, kodun amaçlanan varsayımları neden karşılamadığını anlamak için temel araçtır
- Bu nedenle hata mesajları gerekli bilgiyi erişilebilir biçimde göstermeli
- Haskell derleyici mesajları çok bağlam bilgisi içeriyor, uzun oluyor ve yinelenen ya da dikkat dağıtan bilgiler barındırma eğiliminde
- OCaml derleyici mesajları oldukça kısa ve bazen fazla kısa
- Örnek hatalı program, Haskell’de
x = 1 + [3, 1, 2]ve OCaml’delet x = 1 + [3; 1; 2]gibi bir tamsayı ile listeyi toplamaya çalışan kod
Standart kütüphane: İkisi de minimal, dokümantasyon kalitesinde Haskell öne çıkıyor
- Standart kütüphane, dilde yazılan ilk programı ve sonraki kullanım deneyimini şekillendirir
- İyi bir standart kütüphane bir programlama dilinin başarısının temelidir; yetersiz bir standart kütüphane ise alternatif standart kütüphane tartışmalarını sürekli doğurabilir
- İdeal standart kütüphanenin batteries-included yaklaşıma yakın olması gerektiği düşünülüyor
- İstenen içerikte Option benzeri tipler, UTF-8 string’ler, Map ve HashMap, JSON ve XML ayrıştırıcıları, asenkron primitifler gibi şeyler yer alıyor
- Build aracı ve bağımlılık izleme implementasyonu öğrenmek istemiyorsanız standart kütüphanede daha fazla işlev gerekir
- Build Systems a la Carte, bağımlılık izleyicileri ve build araçları alanını analiz eden bir kaynak
- Haskell ve OCaml’in standart kütüphaneleri görece minimal
- Haskell’de Map ve HashMap bulunmuyor
- OCaml’de non-empty lists ve Bitraversable yok
- Haskell standart kütüphanesi
base, OCaml ise OCaml standard library kullanıyor - Haskell dokümantasyon kalitesi bazen deneyimli geliştiricileri bile şaşırtacak kadar iyi olabiliyor
- Haskell dokümantasyonunda kaynak koda gitme gibi avantajlar da var; OCaml’de de böyle bir özelliğin hazırlık aşamasında olduğu söylendiği aktarılıyor
-
Dokümantasyon örnekleri
- Haskell List dokümantasyon örneği
- OCaml List dokümantasyon örneği
- Sonucu apaçık olan fonksiyonlarda bile örnek odaklı dokümantasyon, API’nin nasıl kullanılacağına dair anında fikir verir
Sonuç: İkisi de endüstriyel kullanım için uygun, ancak mevcut tercih OCaml
- Her iki dil de gerçek endüstriyel gereksinimleri destekleyecek kadar gelişmiş durumda
- Ana akım dillerle karşılaştırıldığında hâlâ küçük diller sayılırlar
- Belirli bir SDK’nın varlığına kritik biçimde bağımlı değilseniz, bu iki dilden hangisini seçerseniz seçin bir sonraki uygulamanızı keyifle geliştirebilirsiniz
- Şu anda OCaml ile gerçekten bir şeyler üretmeye odaklanmak daha kolay görülüyor
Henüz yorum yok.