Haskell Programlama Diline Kısa Bir Bakış

Bir önceki yazımda fonksiyonel programlamayı konu alarak, öneminden ve yapay zeka/makine öğrenimi açısından yerinden kısaca bahsetmiştim. Yazıya başlar başlamaz kesinlikle Haskell üzerine de başka bir yazı yazmalıyım diye düşündüm!

Neden? Fonksiyonel programlama denildiğinde LISP ile birlikte akla gelen ilk ve en güçlü programlama dillerinden olduğuna şüphe yok.

Haskell ile şu zamana kadar hiç çalışmadım ve öğrenmedim ama kişisel olarak duyduğum yoğun ilgiden dolayı hep takip etmeye ve tanımaya çalıştım. Dolayısıyla cüretkar bir şekilde, Haskell nedir? Neden kullanılır? Haskell öğrenmek neler kazandırır? Yapay zeka/makine öğrenimi açısından nerededir? soruları üzerine benim de söyleyebilecek bir şeyim olduğunu düşündüm. 

Haskell Nedir?

Haskell, 1990 yılında ortaya çıkışından günümüze kadar iyi test edilmiş, zaman içerisinde kendini kanıtlamış gerçekten derin bir programlama dilidir. Temeli, lambda kalkülüse dayanmaktadır ve logo olarak da lambda sembolünü kullanır. Arı işlevsel (pure-functional) bir paradigmaya sahiptir. Yani, fonksiyonel programlama ve matematiksel programlama/modelleme için resmen biçilmiş kaftandır! Ancak bu sadece fonksiyonel programlama yapmak için tasarlandığı anlamına gelmemelidir. Genel amaçlı geliştiricilik maksadıyla da gayet güzel kullanılabilir. Bu sebepten hem akademik işler hem de sektörel geliştiricilik işleri (belirli konularda) bakımından eşsiz bir konumda bulunur. *Haskell’in yazılım endüstri açısından nerede olduğunu ve ne tarz projelerde kullanıldığını buradan inceleyebilirsiniz.

Çoğu programlama dilinden daha farklı bir yapıya sahiptir. Haskell öğrenmenin; programlama kültürünü iyi tanıyan, deneyimli geliştiriciler için bile zor olabildiği telaffuz edilmektedir. Bugüne kadar Haskell’in ticari olarak benimsenmesi, öğrenmesinin zor olması, bir araya getirilmesi zaman alan açık kaynaklı bir araç zinciri ve benimsenmesi için zorlayacak ticari bir tedariğinin olmaması nedeniyle geride kalmıştır. Buna rağmen kullanım alanlarını genişleterek, popülaritesini gün geçtikçe artırmaktadır. Hammer Principle Programming Languages anketinde listelenen 51 programlama dilinden biri olan Haskell, 1.821 geliştirici tarafından birinci sırada yer almıştır. Ankette Haskell’i listelerinin ilk sırasına alan geliştiriciler şu şekilde tanımlamışlardır: “Çoğu programcının, özel bir ihtiyaçları olup olmadığına bakılmaksızın bu dili öğrenmesini tavsiye ederim.” 

İsmini matematikçi ve mantıkçı Haskell Brooks Curry’den almaktadır. Miranda dilinin semantikleri üzerine kurulmuştur. Haskell’i birçok programlama dilinden ayıran özellikleri tembel değerlendirme (lazy evaluation), monadlar ve tür sınıflarıdır. Haskell programları, alt katmanların (derleyici, çalışma zamanı (run-time) ve kütüphaneler) yineleme gibi sıradan düşük düzeyli ayrıntıları işlemesine izin veren bir dizi yüksek düzey genelleştirilebilir işleve sahiptir. Güçlü bir statik tip güvenlik ve çıkarım sistemine sahiptir. Haskell’de her değer değişmez (immutable) objedir. Derleyici, tip kontrolünü dayatmaktadır ve küçük yan etkilerle temiz, kısa ve doğru kod üretilmesini teşvik eder. Kısaca, hataları olabildiğince minimize etmeyi sağlar.

Bazı Kullanım Örnekleri

Büyük şirketler; güvenlik, fintech, donanım arka ucu, blok zinciri, büyük veri gibi farklı alanlarda karmaşık ve atipik görevleri yürütmek için Haskell’i kullanmaktadırlar. 

  • Facebook

Facebook, spam ile savaşmak için Haskell’i kullanıyor. Facebook mühendisleri performansı, etkileşimli geliştirme desteği sebebiyle Haskell’i Sigma projeleri için en iyi seçenek olarak görüyor.

  • NVIDIA

NVIDIA, GPU’larının arka uç geliştirmesi için Haskell‘den faydalanmaktadır.

  • Microsoft

Microsoft, Bond projesinde Haskell’i kullanıyor. Bond, şematize edilmiş verilerle çalışmak için platformlar arası bir çerçevedir. Bu çerçeve genel olarak yüksek ölçekli hizmetlerde kullanılmaktadır.

  • JP Morgan

Amerika Birleşik Devletleri’ndeki en büyük banka, yeni ürün geliştirme ekibinde bir Haskell grubuna sahiptir.

IBM, AT&T, Barclay Capital ve Bank of America’da bazı projeleri için Haskell ve işlevsel programlama çözümlerini tercih etmektedir.

  • Gerçek dünya uygulamaları:

Part 1: Databases and Persistent

Part 2: Servant and Web Servers

Part 3: Redis and Caching

Part 4: Testing with Docker

Part 5: Esqueleto and Complex Queries

Review: Production Checklist

Yapay Zeka Geliştiriciliği Açısından Haskell

Yapay zeka/makine öğrenimine yeni başlayan biriyseniz daha büyük ve destekleyici bir yapay zeka/makine öğrenimi topluluğu olan bir dil ile ilerlemek çok daha mantıklıdır. Bunun için en mantıklı tercihin Python olduğu kesinlikle su götürmezdir!
Ancak makine öğrenimi konusunda geçmişiniz var ise ve kendinizi fonksiyonel programlama, tip teorisinde geliştirmek istiyorsanız Haskell veya LISP’in kapısını çalmak hoş olabilir.

Facebook’un yapay zeka direktörü, dünyaca ünlü bilgisayar bilimci Yann Lecun’unaşağıdaki yazısına da bir göz atılabilir:Neural Networks, Types, and Functional Programming
Posted on September 3, 2015 Deep learning, despite its remarkable successes, is a young field. While models called…colah.github.io

Monday Morning Haskell blogunda yapay zeka/makine öğrenimi açısından Haskell üzerine çok faydalı bir seri bulunmaktadır:

En Önemli Özellikleri

  1. Bellek güvenliği (Memory safety): C/C++‘da hatalı bellek yönetimi genellikle arabellek taşmalarına, bellek sızıntılarına ve bellekle ilgili diğer hatalara yol açar. C/C++’da ki bu esnek yapı deneyimsiz programcıların ellerinde adeta her patlayabilecek bir dinamite dönüşür. Haskell’de yazılan yazılımın otomatik bellek yönetimi sayesinde bu tür sorunların ortaya çıkması olası değildir. Bellek güvenliği; Java, Python, Go, JavaScript, Rust ve diğerleri de dahil olmak üzere modern diller arasında genel olarak gözlemlenen ortak bir özelliktir ve güvenli yazılımlar oluşturma noktasında işlevsel olduğu söylenebilir.
  2. Çöp toplama (Garbage collection): Bellek güvenliğini sağlamanın iki yolu bulunmaktadır: bunlar yaygın olarak çöp toplama (garbage collection) ve Rust stili bir yol olarak statik ömür kontrolü (static lifetime) olarak karşımıza çıkar. Çöp toplama, daha iyi soyutlamalar ve daha yüksek geliştirici verimliliği sağlar. Haskell’de sahip olduğu çöp toplayıcı (garbage collector) ile bu verimlilik ve güvenlikten faydalanır.
  3. Yerel kod (Native code): Python, Ruby, JavaScript, Lua ve diğer yorumlanmış dillerden farklı olarak, Haskell doğrudan yerel makine koduna derlenir. Ara bir katman bulunmaz. Derleyici (GHC) optimizasyona sahip ve verimli yürütülebilir dosyalar üretmede oldukça iyidir. Bu, Haskell’i yüksek verimli veri işleme gibi iyi performans gerektiren uygulamalar için mükemmel bir seçim haline getirir.
  4. Statik tipler (Static types): Java ve JavaScript’in aksine, Haskell, geliştirme sırasında kodu doğrulayan bir tip denetleyicisine sahiptir.
  5. Zengin tipler (Rich types):Haskell’in tip sistemi kolaylık sağlayacak kadar güçlüdür. Cebirsel veri türleri, parametrik polimorfizm, sınıf tabanlı (ad-hoc) polimorfizm, tip aileleri, tip eşitlikleri, varoluşsal niceleme, daha üst düzey polimorfizm, tip polimorfizmi, çalışma zamanı (run-time) tipi denetimi desteği ile Haskell, statik olarak kod yazmak için son derece çok yönlü bir araç seti sunmaktadır.
  6. Saflık (Purity): Haskell’in tasarımı saf işlevler ve değişmez objeler etrafında toplanmıştır. Bu özelliklerin, doğru yazılım yazmak için gerekli olduğu fazlasıyla ortadadır. Haskell programcıya bu karmaşıklık kaynaklarını önlemek veya en aza indirmek için tüm araçları sağlar.
  7. Tembellik (Laziness): En başından beri, Haskell tembel bir dil olarak tasarlanmıştır ve bu güne kadar tembel değerlendirme onun dönüm noktası özelliği olmaya devam etmektedir. Tembel değerlendirme, sonuçlara ihtiyaç duyulana kadar hesaplamayı erteler ve sonuçları yeniden düzenleme kolaylığı, özel kontrol yapılarını tanımlama yeteneği ve iyileştirilebilir kompoze edilebilirlik sağlar.
  8. Eş zamanlılık (Concurrency): Birçok dilde sorun olabilen eş zamanlılık, Haskell için sorun teşkil etmez.
  9. Metaprogramlama (Metaprogramming): Haskell, programın soyut söz dizimi ağacının incelenmesini ve oluşturulmasını destekler. Bu özelliğe Şablon Haskell denir ve derleme zamanı değerlendirmesi için kullanılır.
  10. Ekosistem (Ecosystem): Hackage, 15000’in üzerinde paket içeren açık kaynaklı Haskell yazılımının merkezi bir deposudur. Stackage, 2000’den fazla bakımlı paketi içeren kütüphaneler arasındaki uyumluluğu garanti eden paket sürümlerinin derlemesidir. Çözmeye çalıştığınız sorunlar yüksek ihtimalle açık kaynak kodlu bir kütüphane olarak bu ekosistem içinde sunulmuş olacaktır. 
  11. Haskell, yüksek kaliteli yazılım üretmenize yardımcı olabilecek potansiyelde bir teknolojidir. Yazılım kalitesini değerlendirmek için çeşitli kriterler vardır, ancak en önemlileri doğruluk, performans ve sürdürülebilirliktir.

Haskell programlama dili bu gerekliliklerle aşağıdaki şekilde başa çıkar:

  1. Doğruluk (Correctness): Güçlü statik tipleme, saf ve değişmez veriler, spesifikasyonlara uygun kod yazmak için gereklidir. Haskell’de yazılmış yazılımlar yukarıda da söylediğimiz üzere güvenli ve hatasız olma eğilimindedir.
  2. Performans (Performance):GHC (Glasgow Haskell Compiler) optimize edilmiş, yerel yürütülebilir dosyalar üretir. Bu sebepten Haskell, web geliştiriciliğinin arka uç rolünde gayet iyi bir tercih olabilir.
  3. Sürdürülebilirlik (Maintainability): Haskell, işletme alanını modellemek ve varsayımları açık hale getirmek için tür sistemini kullanmayı teşvik eder. Sonuç olarak, kodu yeniden düzenlemek ve değişen gereksinimlere uyarlamak çok daha kolaydır.

Haskell Öğrenmek İçin Kaynaklar

Keşfettiğim bazı kaynakları da aşağıya listeliyorum:

Documentation
Learn Haskell Fast and Hard
Haskell Book | Haskell from the Very Beginning
Learn You a Haskell for Great Good!
Real World Haskell

Yazı ile ilgili görüşleriniz, sorularınız için bana dilediğiniz zaman Twitter aracılığıyla ulaşabilirsiniz.

Twitter: @IAMDTRULY