1 Ağustos 2017 Salı

PROGRAMLAMA DİLBİLİMİ VE PROGRAMLAMA PARADİGMALARI

Bu yazıda programlama dilleri ile programlama dilbilimi kavramları üzerinde duracağız ve aralarındaki ilişkiyi inceleceğiz. Sonra programlama kavramlarını ve programlama paradigmalarına değineceğiz. En sonda da her zaman yaptığımız gibi bir müzik molası vereceğiz. Xecê’den Gitme’yi dinleyip biraz hüzünleneceğiz. Eğer yazılarımla ilk defa ilgileniyorsanız bu size ilginç gelebilir, ancak her yazımın sonunda bir parça müzik olmadan olmaz anlayışıyla sizlere müzik videoları da paylaşıyorum.


“Programlama dilbilimi” kavramını muhtemelen daha önce duymadınız. Bu kavram, “programlama dilleri” kavramını da içerecek şekilde daha geniş bir kavram olarak kullanılıyor. Programlama dillerini öğreten kaynakların çoğu, bir yada birkaç programlama dillinin sentaksını(yazımını), operatörlerini-operandlarını, derleme ve yorumlamaya yönelik dilin işlemlerini konu alır. Öte yandan “programlamaya” ilişkin eserler sadece “programlama dillerini” anlatan eserlerden ibaret değildir. Programlama dili öğretmenin yanında programlama dili tasarımı ve tasarıma yönelik “kavram” ve “paradigmalar” ile” semantiğini” (anlambilimini) inceleyen eserler de bulunmaktadır. Şüphesiz her bir programlama dili bir paradigmanın ürünü olarak ortaya çıkmıştır ve bu dillerin her biri farklı bir semantiğe-anlama- sahipler. Eldeki probleme en iyi çözümü sağlayacak programlama dili yada dillerinin seçimi, o programlama dilinin paradigması ve semantiğiyle yakından ilişkilidir. Bu çerçevede programlamaya ilişkin daha geniş bir kavram olan “programlama dilbilimi-programming linguistics” kavramı gündeme gelmektedir. Bu kavram “programlama dili-programming language” kavramından daha geniş bir kavram olup onu da kapsayan bir anlama sahip olacak şekilde kullanılmaktadır. Davit A. Watt, “Programming Language Design Concepts” adlı kitabında “programlama dilbilimi” ifadesini, “programlama dilleri” üzerinde yapılan çalışmaları ifade etmek için kullandıklarını belirtmiştir.(sayfa 3,2004) Kitabın tamamına buradan ulaşabilirsiniz.
Watt’ın yaklaşımını incelerken güncelliğini bu günde koruyan ilginç bir tespiti dikkatimi çekti. Şöyle diyor Watt: ”1950’li yıllar yüksek seviyeli programlama dillerinin tasarlandığı yıllardı. O zamandan beri programlama dilleri ilgi çekici ve üretken bir inceleme alanı olmaya başladı. Programcılar, tuttukları programlama dillerinin göreli üstünlüklerini dini tutuculukla tartışırken, daha akademik seviyede bilim insanları ifade gücünü basitlik ve etkililikle birleştiren programlama dillerini tasarlama yollarını arıyorlardı.” Watt’ın bu tespiti günümüzün “tutucu programcı” kişiliğinin tarihsel bir arka planını verir gibi. Tutucu programcı, sadece tek bir programlama dilini savunan ve o dilden başka üstün bir dil tanımayan ve hatta çoğu kullandığı dilin dahi paradigma ve semantiğini bilmeyen programcılardır.  Watt’ın akademik seviyede bilim insanlarının programlama dili arayışları içerisinde olduğunu belirtmesi, bana MIT’nin (The Massachussets Institute of Technology) daha elverişli dilleri geliştirme çabasını hatırlattı.


Neyse biz konumuza dönelim. ”Programlama dilbilimi” kavramı, “doğal dillerin(anadilinin) dilbilimine”  benzetilir. Tıpkı doğal diller gibi programlama dilleri de bir sentaksa (biçime) ve bir semantiğe (anlama) sahiptir. Programlama dilbilimi sadece programlama dillerini analizini yapmaz, yeni bir programlama dili belirleyip tasarlayabilir ve bilgisayara uygulayabilir.


Programlama dilbiliminin pek çok yönü bulunmaktadır:


Programlama dilbilimi, programlama dillerinin konsept (kavram) ve paradigmaları ile ilgilenir. Her bir programlama dili belli bir bilinçle bir amaç için tasarlanmıştır. Programlama dillerinin sahip oldukları özellikler programlama dilbiliminin ilgi alanına girer. Örneğin bir programlama dilinin evrenselliği, doğallığı, uygulanabilirliği, etkililiği gibi kavramlar programlama dilbiliminin incelediği kavramlardır. Şimdi bu kavramları kısaca bakalım:
  • Evrensellik: Bir programlama dilinde çözülebilecek her problemi çözebilen, bir programlama dilinin sahip olması gereken tüm özelliklere sahip olmasıdır. Tüm özeliklere sahip olma evrensellik kavramıyla açıklanır. Eğer bir programlama dili evrensel değilse programlama dili olarak kabul edilmez.


  • Doğallık: Bir problemin çözümü için bir programlama dilinin seçimi, doğal olarak o problemin çözümü için en doğal seçim olmalıdır. Örneğin bir yapay zeka problem için, veri türleri sayılar ve diziler olan bir programlama dilinin seçimi doğal değildir.


  • Uygulanabilirlik: Bilgisayarda uygulanabilirliği olmayan diller programlama dili sayılmazlar. İyi bir programlama dili bir bilgisayarda uygulanabilir olmalıdır. İyi düzenlenmiş her programı yürütmesi gerekir. Örneğin matematiksel gösterimler ve doğal diller,  çözümü her zaman mümkün olmadığından programlama dili sayılamazlar. Yani insan dili ve bir matematiksel formül bilgisayara bir şeyleri tek başına yaptıramazlar, uygulanabilir değildir ve bu nedenle programlama dili de sayılmazlar.


  • Etkinlik: Programlama dillerinin etkililiğini etkileyen pek çok faktör söz konusudur. Bilgisayarın mimarisi etkinliği etkiler. Programcılar, belirli programlama dillerinin diğerlerine göre daha düşük verimlilikle çalıştığını bilmeli ve programın geliştirildiği dili tercih etmenin haklı gerekçelerini belirleyerek dil seçiminin en doğal seçim olduğuna kendileri karar vermelidir.


Yukarıda açıkladığımız kavramlar bir programlama dilinin sentaksı ile ilgili olmayan, semantik yönüyle ilgili olan kavramlar. Peki bir programlama dilinin üzerinde temellendiği kavramlar nelerdir? Bir programlama dili tasarımının daha çok sentaksı ile ilgili olan kavramlar da şöyle sıralanır:


  • veri (data)
  • veri tipleri (data types
  • değişkenler (variables)
  • saklama (storage)
  • bağlantı (bindings)
  • kapsam (scope)
  • prosedürel soyutlama (procedurel abstraction)
  • veri soyutlama (data abstraction)
  • soysal soyutlama (generic abstraction)
  • tip sistemleri (type systems)
  • kontrol (control)
  • eşzamanlılık (concurrency)


Bu kavramlar bilmek ne işimize yarar?


Yeni bir programlama diline başladığımızda, bu kavramları öğrenmek zorundayız. Bu programlama dilinin nasıl daha etkili ve verimli kullanılacağını öğrenmek, eldeki problemin çözümünde hangi programlama dilini seçmenin daha uygun olacağına karar vermek konularında, programlama dili kavramlarını iyi bilmek kaçınılmaz olmaktadır. Programcı olarak hedef iyi bir programcı olmak ise tüm programlama dillerinde ortak olan bu kavramları bilmemiz gerekir.


Programlama paradigmaları


Paradigma, bilimde gerçekliğin kavramsallaştırılması, zihinsel bir resim çizilmesi yoluyla bir model oluşturmak olarak tanımlanır. Yukarıda saydığımız birkaç programlama dili kavramının etkili bir şekilde kullanılarak oluşturulan programlama tarzına programlama paradigması denir. Programlama stili de denilen tarzın seçilmesiyle diğer tarzlardan köklü bir farklılaşmaya gidilmiş olur. Altı temel programlama paradigaması vardır:


  • Zorunlu programlama(imperative programming)
  • Fonksiyonel programlama(functional programming)
  • Nesne yönelimli programlama(object oriented programming)
  • Eşzamanlı programlama(concurrent programming)
  • Mantıksal programlama(logic programming)
  • komut-grubu programlama (scripting programming)


Programlama paradigmalarının geniş açıklamalarına bir başka yazıda yer vereceğim. Bu yazıdaki amaç programlama dillerinin tüm yönlerini ele alan programlama dilbilimi kapsamında yer alan programlama paradigmaları ve kavramlarına genel bir bakış atmaktı.


***
Xece’nin o eşssiz yorumuyla bir hasret şarkısı…
Sesindeki hüzün şarkının hüznüyle birleştiğinde...
Derin duygulara doğru yola çıkmaya hazırsınız demektir..


Sevdan dağlardan da yüce,
Nazlı yar bırakıp gitme

Gidersen içimde sancı
Beden yolcu, ruhum hancı
Karışır tatlıma acı
Gündüz geceye yabancı

Gitme aylar yıl'a döner
Gitme gönül sensiz neyler
Düşer kor ateşlerine
Yanıp yanıp küle döner

Hasret acıtır bu canı
Çektirme gel bu cefayı
Gidersen içimde sancı
Beden yolcu, ruhum hancı
Karışır tatlıma acı
Gündüz geceye yabancı...