Fonksiyonel Programlamanın Yeri ve Önemi

Fonksiyonel programlamanın çıkış noktasını, Amerikalı matematikçi Alonzo Church ve Amerikalı mantıkçı J. Barkley Rosser’ın Church–Rosser teoremini ortaya atması ve Lambda kalkülüsü (λ-calculus 1936) oluşturmaları olarak varsayarsak ve ilk mihenk taşı olarak görürsek elimizde neredeyse bir asırlık bir hesaplama paradigması bulunuyor.

1960’lı yıllara kadar geçen süreçte çoğunlukla saf matematiksel bir paradigma konsepti olarak kalıyor ve gelişimini yavaş yavaş sürdürüyor, 1960 yılı itibariyle ilk bilgisayarların da yaygınlaşması ve gelişimi ile kendisine “programlama” eyleminde sağlam ve oturaklı bir pozisyon oluşturmaya başlıyor. Bunun öncülüğünü bilgisayar bilimine sayısız katkı sunan, “yapay zeka” terimini icat eden, ilk fonksiyonel programlama dili ve hala kullanımda olan ikinci en eski programlama dili (FORTRAN’dan sonra) olan LISP’i geliştiren, John McCarthy gerçekleştiriyor. Sembolik farklılaşma için tasarladığı bir algoritmadan başlayarak, sembolik veriler üzerinden hesaplamaları programlamak için bir sistem oluşturan McCarthy LISP’in de ortaya çıkışını takip eden süreçte fonksiyonel programlamanın kendisine müthiş bir kullanım alanı yaratıyor. Ve programlama tarihinde bir sürü önemli mihenk taşları daha oluşuyor.

Bunların en önemlileri aşağıda yer alıyor:

  • Algol 60 (Naur et al. 1963)
  • ISWIM (Landin 1966)
  • PAL (Evans 1968)
  • SASL (1973–83)
  • Edinburgh (1969–80) — NPL, early ML, HOPE
  • Miranda (1986)
  • Haskell (1992 . . . )

Uzun bir tarihe sahip olan fonksiyonel programlama, son 25 yıl nesne-kullanıcı-sistem üçgenine odaklı olması itibariyle görece daha yeni olan nesne tabanlı programlama (OOP) paradigmasına göre daha az kullanıma sahip. Ancak popülaritesi azalmış gibi görünse de hali hazırda, fonksiyonel programlama, bir şeyler geliştirmeye başlamadan önce bilmeniz gereken önemli bir şeye dönüşmüş durumda. Diğer bir yandan makine öğreniminin (machine learning) ve büyük verinin (big data) müthiş ivmelenmesiyle birlikte, saf fonksiyonların paralelleştirilebildiği basitliği nedeniyle fonksiyonel programlama popülaritesini hızla arttırmakta.

Yazılım geliştiricileri olarak, yazılımlarımızın karmaşıklığını kontrol etmek ve azaltmak pek tabi bizim sorumluluğumuzdadır. Bir programın karmaşıklığını azaltmak için, onu iyi yapılandırmak çok önemlidir. Fonksiyonel programlamada mevcut olan bu modülerlik, bir programı yapılandırırken onu hayati derecede önemli kılmaktadır. Saf yapısı nedeniyle, bilgisayar biliminin ayrılmaz bir parçasıdır. Bu açıdan veri analizi, veri hatları geliştirme, makine öğrenimi, paralel programlama ve workflow görevleri için kod geliştirmede, gelecekte fonksiyonel paradigmayı kullanarak geliştirme yapmak, test etmek ve sürdürmek de büyük ölçüde daha kolay olacaktır. Sağladığı güç hakkında tam bilgi sahibi olduktan sonra tercihe göre kullanıp kullanmamayı seçmek geliştiriciler olarak bizlerin veya şirketlerin tercihinde olan bir durum tabi.

Fonksiyonel programlama, değişmezlik (immutable) ve eşzamanlılık (concurrency) için nesne yönelimli programlamaya tercih edilse de, nesne yönelimli programlamayı kullanım dışı bırakmaktan çok çok uzaktadır. Yazılım geliştiriciliği dünyası, bu iki paradigmayı sıklıkla birbirine bir kıyas durumunda tutup, birbirlerini dışlıyorlarmış gibi lanse ediyor. Esasında bu iki paradigma birbiriyle kombin durumunda oldukça verimli ve efektif sistemler ortaya çıkarabilirler. Kodun yeniden kullanılabilirliği, veri soyutlaması, etkili problem çözme ve çok biçimlilik (polimorfizm) esnekliği yalnızca nesne yönelimli programlama yoluyla elde edilebiliyor olsa da makine öğrenimi, veri analizi, veri manipülasyonu konusunda önde gelen fonksiyonel programlama, geleceğin uygulamalarında ve sistemlerinde çok büyük çoğunlukta bir arada kullanılacaktır.

Paradigma Kıyameti

Nesneye yönelik programlama, yazılım geliştirmenin temel ve kritik bir bileşeni haline gelmiştir. C++, C# ve Java gibi çok sayıda programlama dilinin kullanıldığı yerler haricinde, mobil yazılım geliştirmek isteyen geliştiriciler için nesne yönelimli yaklaşım olmazsa olmazdır. Benzer durum, web tabanlı uygulama geliştiricileri de için de geçerlidir. Buna rağmen geliştiriciler ve bilgisayar bilimciler arasında nesne yönelimli programlamanın eskimiş olduğunu ve bu nedenle OOP kavramlarına yoğunlaşmanın bir zaman kaybı olduğunu düşünenlerde yok değildir.

Nesne yönelimli programlamanın sahip olduğu “composition over inheritance” ilkesi, “polimorfizm”, “veri soyutlama” gibi daha birçok sebepten bu paradigma kıyametinden fazlasıyla uzakta olduğumuzu söyleyebiliriz.

Yapay Zekaya Fonksiyonel Bakış

Yapay zeka ve makine öğrenimi çalışmaları için şu anda kullanılan en yaygın programlama dilleri C++, Python, R, Scala, Go ve Julia programlama dilleridir. Lisp ve Haskell gibi eski fonksiyonel diller, onlarca yıl önce yapay zeka belirsiz bir araştırma alanı iken makine öğrenimi algoritmalarını uygulamak için kullanılmışlardır. Yeterli donanımsal ve yazılımsal eksiklikten kaynaklı olarak pek fazla ilerleme yaşayamamıştır.

Lisp ve Dr. Racket üzerine Dr. Sadi Evren Şeker tarafından yapılan bir soru-cevap etkinliği.

Çok yaygın olmasa da halen daha Lisp, günümüzde yapay zeka uygulamaları için kullanılır çünkü semboller, sembolik ifadeler ve bunlarla hesaplama Lisp’in merkezinde yer alır. Bu da onu, yapay zeka öğrenimi ve geliştirmesi için biçilmiş bir kaftan yapmaktadır. Özellikle Lisp’in lehçesi olan Common Lisp (CL), sembolik yapay zeka için mükemmeldir.

Ancak, birçok yeni makine öğrenimi kütüphanesi ve çerçevesi daha yaygın dillerde kodlanmıştır, örneğin TensorFlow C++ ve Python’da kodlanmıştır. Yapay zeka programlarının iyi çalışması için, işlemciyle daha hızlı iletişim için dilin düşük seviyeli bir uygulamaya sahip olması gerekir. Bu nedenle, hızlı performans elde etmek için birçok makine öğrenimi/derin öğrenme kitaplığı C++ ile oluşturulur. Yapay zeka büyük ölçüde matematiğe dayandığından, Python ve R gibi diller şu anda yaygın olarak kullanılan dillerdir. R, istatistiksel veri analizine yöneliktir ancak makine öğrenimini/sinir ağı algoritmalarını destekler. Python ise, matematiksel hesaplamalar için daha hızlı ve sayısal paket desteği ile makine öğrenimi ve yapay zekada akla gelen bir numaralı seçenektir.

Değişken nesneler ve nesne oluşturma ile OOP, yüksek seviyeli yazılımları geliştirme için daha uygundur, bunun aksine algoritmalar ve verilerle çalışan yapay zeka programlarında çok kullanışlı değildir.

Fonksiyonel yaklaşım, netlikten taviz vermeden daha az kod satırı kullanmayı sağlar. Kod satırlarını yazmaktan çok, fonksiyonlara odaklanmak için gereken zamanı kazandırır.

Bir diğer önemli konu ise; fonksiyonel yaklaşımın, kritik hesaplamaları ve hızlı karar verme için hataya dayanıklı (fault-tolerant) algoritmaları daha tutarlı hale getirdiğidir. Geleceğin, sürücüsüz arabaları, savunma sistemlerinin güvenliği vb. birçok konudan ötürü hataya dayanıklılık gereklidir. Bu tür sistemlerdeki herhangi bir hata ciddi etkilere sahip olabilir. Değişmezlik (immutable) sistemi daha güvenilir kılar, tembel değerlendirme (lazy evaluation) hafızayı korumaya yardımcı olur, paralel programlama sistemi daha hızlı hale getirir. Bunun gibi sebeplerden fonksiyonel programlamanın yaklaşımlarının biz geliştiriciler açısından önemi büyüktür.

Temel Özellikler

  • Immutable: Bir x değişkeni bildirilir ve programda kullanılırsa, değişkenin değeri programın herhangi bir yerinde daha sonra asla değiştirilmez. x değişkeni her çağrıldığında, başlangıçta atanan aynı değeri döndürür. Bu, program boyunca durum değişikliğini düşünme ihtiyacını ortadan kaldırarak onu oldukça basit hale getirir.
  • Referential transparency: Bu özellik, bir ifadenin veya hesaplamanın programın herhangi bir bölümünde/bağlamında her zaman aynı değerle sonuçlandığı anlamına gelir. Referans olarak şeffaf bir programlama dilinin programları, cebirsel denklemler olarak değiştirilebilir. Referans olarak şeffaf olan (referential transparency) hesaplamalar, ne zaman yapıldığına bakılmaksızın aynı sonucu verir.
  • Lazy evaluation: Gerekli olana/çağrılana kadar değerlerin hesaplanmasını ertelemeyi sağlar. Tembel değerlendirme (lazy evaluation), gereksiz hesaplamaları önlemeye yardımcı olur ve bellekten tasarruf sağlar.

Higher-order functions: Bağımsız değişken olarak bir veya daha fazla işlevi alabilir. Sonuç olarak bir işlevi de döndürebilir. Kodu yeniden düzenlemek ve tekrarlamayı azaltmak için kullanışlıdır. Birçok programlama dilinde bulunan map() fonksiyonu, higher-order functions örneğidir.

Medium:@dogukantuna

Twitter: @IAMDTRULY

Fonksiyonel Programlama Üzerine Okumalar

Bütün bu sebeplerden dolayı bu paradigmayı daha yakından tanımak isteyenler için aşağıdaki güncel ve faydalı kaynakları da buraya eklememek olmaz.

Nedir bu fonksiyonel programlama?

Slant – 21 Best functional programming languages for programming beginners as of 2020

Functional programming for deep learning

Functional Vs. Object-Oriented Programming in Python

How and why to use Functional Programming in modern JavaScript

Why developers are falling in love with functional programming

What is better — Functional programming or Object Oriented?

Video Derlemeleri

Programlama paradigmalarına dair harika bir yayın.
Fonksiyonel programlamaya dair kısa bir özet ve Haskell.
Rigetti Computing’den Robert Smith’in Lisp’e bakış açısı ve önemi.

One thought on

Fonksiyonel Programlamanın Yeri ve Önemi

Bir cevap yazın