Merhaba değerli okuyucularımız bu yazımızda LISP türevi bir dil olan Scheme programlama dili hakkında bilgi vereceğiz. LISP, John McCarthy'in 1958 yılında ortaya koyduğu dilden türetilmiş dillere verilen genel addır. LISP en eski ve oldukça güçlü programlama dillerinden birisidir. Scheme 1970 yılı ortalarında MIT profesörleri Guy Lewis Steele ve Gerald Jay Sussman tarafından geliştirilmiş fonksiyonel bir dildir. Bir LISP lehçesi olan Scheme, uzun yıllardır MIT'de lisans öğrencilerine ilk programlama dersi olarak verilmekteydi. (2008’de giriş seviyesinde Python programlama dilini kullanmaya başlamış olsalar da). MIT profesörlerinden Harold Abelson ve Gerald Jay Sussman tarafından yazılmış ve ilk baskısı 1984 yılında oluşturulmuş Structure and Interpretation of Computer Programs kitabı derslerde kullanılmaktadır. Bu kitap aynı zamanda birçok okulda kabul gören ders kitabıdır.

Orta Doğu Teknik Üniversitesi'nde de bölüme giren öğrenciler programlama dünyasındaki ilk adımlarını Scheme programlama dilini öğrenerek başlamaktadır. Ders kitabı olarak zamanın MIT profesörlerinden Brian Harvey(UC Berkeley) ve Matthew Wright tarafından yazılmış Simply Scheme adlı kitap kullanılmaktadır.

Şimdi Scheme programlama dilinin oluşumu hakkında biraz bilgi verelim.1973 yılında MIT profesörlerinden Carl Hewitt eşzamanlı hesaplamada 'actor model' adında matematiksel bir model geliştirdi. Sussman ve Steele bu modele daha iyi bir anlam kazandırmak amacıyla Scheme programlama dilini oluşturdular. Scheme programalama dilinin oluşması biraz zaman aldı. Başlangıçta Sussman ve Hewitt birlikte MDL(MIT Design Language) üzerinde bir çalışma yaptılar. Küçük bir bilgi: MDL, Carl Hewitt'in Planner adlı projesi için genişletilmiş bir LISP diyalektidir. 1971 yılında Sussman ve bir grup profesör Micro-planner'ı geliştirdiler. Ardından Conniver adında yine LISP tabanlı bir programlama dili geliştirdiler; ama bu çalışmaların sonuçlarını pek üretken bulamadılar ve farklı yollara yöneldiler. Bu arada Steele, öğrenimi süresinde dışarıdaki gelişmeleri düzenli olarak takip ediyordu. Steele, mezun olmasının ardından, Sussman ile birlikte MacLisp programlama dilini kullanarak kendilerine ait LISP'lerini geliştirdi. Daha sonra bu mekanizmayı geliştirerek, kendi modellerini actor oluşturabilecek ve mesaj gönderebilecek düzeye getirmeyi başardılar. Geliştirdikleri modelleme çalışmaları iyiye gidince bu modele Schemer adını verdiler; ama daha sonra ana sistem üzerine kurulmuş ITS dosya sisteminin 6 karakter limitine uymak için adını Scheme olarak değiştirdiler. Sussman ve Steele'in çalışmalarıyla küçük ve yeterli bir LISP diyalekti ortaya çıkmış oldu.

Scheme programlama dilinin oluşumunu kısaca özetledik. Biraz da Scheme programlama dilinin özelliklerinden bahsedelim. Bilgisayar bilimi ve mühendisliği eğitimlerinde Scheme'de yazılan programlar genelde yorumlayıcı tarafından yorumlanır. Bu işlem yavaş ve pek üretken olmayan bir yöntemdir; fakat temel algoritmik kavramların anlaşılmasını kolaylaştırdığından tercih edilir. Ek olarak Scheme aynı zamanda çeşitli derleyicilere (chicken,stalin,Chez,Ikarus gibi) de sahiptir. Bunun dışında Scheme birçok paradigmayı içinde barındıran bir programlama dilidir(fonksiyonel programlama başta olmak üzere). Eşzamanlı hesaplama dilinin bazı özelliklerini de taşımaktadır; ama tam olarak eşzamanlı hesaplama dili diyemeyiz. Scheme yorumlayıcısı (interpreter), eşzamanlayıcısı (synchronizers) ve değişken hücreleri için gereken temel özellikleri içinde barındırmamaktadır. Scheme bir paralel programlama dili olmasa da taşıdığı özelliklerle tam olarak bir fonksiyonel programlama dilidir. Ayrıca Scheme buyurgan bir yöne de sahiptir; ama bu dili gerek akademik dünyada gerekse sektörde öne çıkaran ve tercih edilmesine sebep olan yönü fonksiyonel paradigmaya olan uygunluğu olduğundan ben daha çok fonksiyonel yönü üzerinde durmak istiyorum.

Fonksiyonel bir dil nedir? Fonksiyonel bir dilde, programlamalar matematiksel fonksiyonlar kullanılarak yapılır, programda değişebilecek girdiler kullanılamaz, fonksiyonların aldıkları girdiler ve çıktıları sabittir.2 temel özelliği vardır: matematiksel fonksiyonların bütün özelliklerini taşır ve programa verilen girdiye tanımlanan fonksiyonu aynen uygular. Fonksiyon duruma göre sonucu değiştirebilecek fazladan bir işleme tabi tutulmaz.

(define (prosedur x) (/ (+ x 5) 2))

“define” komutu, anlaşıldığı üzere fonksiyon tanımlamak için kullandığımız komutumuzdur. Burada tanımladığımız fonksiyonumuz (prosedur) , bir argüman alarak (x) , bu argümanı 5 ile toplayıp, sonucu 2'ye bölüyor. Tanımladığımız fonksiyonu yorumlayıcımızda kullandığımızda bize yukarıdaki işlemleri yaparak sonucu verecektir. Bizim tanımlamadığımız herhangi bir işlem eklemeyecektir. Görüldüğü gibi Scheme, öğrenilmesi çok kolay ve pratik bir dildir. Scheme dilinde parantezler işlem sırasını belirler, bu yüzden çok fazla kullanılırla; Yani tanımladığımız fonksiyon işlem yapmaya en içteki parantezlerden başlar. Parantezler işlem sırası yanında işlemleri de belirtirler. Kullanacağımız prosedürler, tanımladığımız fonksiyonlar, vereceğimiz değişkenler ve bunun gibi çeşitli girdiler için parantez kullanmak zorundayız. Örneğin bir işlem yapacağımızda girdimizi şu şekilde yapmamız gerekir:

(+ 5 6)

Buradaki '+' sembolü toplama işlemi fonksiyonumuzu belirtiyor. Parantezlerimiz işlemimizi kapatmış durumda. Yorumlayıcı, toplama işlemini yapıp bize 11 çıktısına dönecektir. Görüldüğü gibi fonksiyonlarımızı parantezden sonra başa yazarak işleme girecek argümanları sonra sıralıyoruz. Scheme dilinde önceden tanımlı (built-in) bu tür fonksiyonlara Scheme dilinin temel fonksiyonları diyebiliriz. Özel argümanlar alan(örneğin fonksiyonları) veya işlemi yaparken yorumlayıcının izlediği yolun farklı olduğu özel durumlar da mevcut. Mesela 'if' prosedürü, özel bir prosedür. Üç argüman alan bu prosedür, verdiğimiz ilk argüman doğruysa ikinci argümanın, değilse üçüncü argümanın sonucunu bize döndürür. Buna da bir örnek vermek gerekirse;

(if (= (+ 4 5 ) 9) #t #f)

Burada ilk verdiğimiz argüman '(= (+ 4 5) 9)' işleminin doğru olup olmadığına bakar. Eğer işlem doğruysa çıktı olarak #t, yanlışsa #f döner. Anlayacağınız üzere bu özel durum prosedürü koşul gerektiren bir prosedür; bu durumda ilk verdiğimiz argüman da koşulu belirleyen parça oluyor. Önce o koşulu inceleyen yorumlayıcı da daha sonra verdiğimiz diğer argümanları koşula göre seçerek bize, gereken çıktıyı veriyor.

Değerli okuyucular, Scheme programlama dilinin doğuşu ve bazı temel özellikleri hakkındaki yazımın sonuna gelmiş bulunuyorum. En basit şekilde anlatmaya çalıştım. Umarım yazdıklarım anlaşılır olmuştur. Aslında yazıdaki bilgiler çok sığ kalıyor, eğer araştırırsanız Scheme programlama dili kendi içinde koca bir dünyayı barındırıyor.

Kaynaklar