SMALLTALK PROGRAMLAMA DİLİ
• Dilin tarihcesi
Smalltalk, Alan Kay önderliğinde, aralarında Adele Goldberg, Dan Ingalls, Ted Kaehler'in bulunduğu bir grup tarafından Xerox PARC'ta (Palo Alto Research Center) geliştirilmiş nesne yönelimli bir programlama dilidir.
1969 yılında geliştirilmeye başlanmış , ilk sürümü 1972 yılında ortaya cıkmıstır ve ilk kararlı sürümü Smalltalk-80 dir. Nesneye yönelik programlamanın atası diyebiliriz yeni bir programlama tekniğine öncülük etmiştir.
Lisp , simula gibi dillerinden de etkilenmiştir ve bir çok dili de etkilemiştir.
• Dilin tasarım amacları(design goals)
Smalltalk projesinin amacı, herkesin yaratıcı ruhu için bilgisayar desteği sağlamaktır. İşimiz, yaratıcı bir bireyi ve mevcut en iyi bilgisayar donanımı içeren bir vizyona dayanır.
İki ana araştırma alanına yoğunlaşmayı seçildi ve modeller arasında bir arayüz görevi gören programlama dili, bilgisayarın insan iletişim sistemi denilebilir.
Grafik kullanıcı arabirimleri alanında çok derin çalışmalar yapan Xerox PARC'ta geliştirilmesi sonucu olarak, Smalltalk WIMP (Windows, Icons, Menus, Pointers) sistemlerinin prototiplerini üretmede kullanılması amaclandı ve kullanıldı. Ayrıca söyle bir olayda gerceklesmiştir , Smalltalk-80 projesinin önemli bir etkisi Steve Jobs adında genç bir adamdı. PARC'da bir tur için geldi ve Smalltalk'un bir demosunu gördü. Üç şey gösterildi: Smalltalk kullanıcı arayüzü, Smalltalk dili ve nesne tabanlı programlama fikri. Gördüğü kullanıcı arabirimi fikirlerini tam olarak takdir etti, ancak Smalltalk'u veya nesne yönelimli programlamayı anlamadı. Bununla birlikte, şirketine geri döndü ve mühendislerinden kullanıcı arabirimini kopyalamalarını istedi. Macintosh işletim sistemini oluşturarak yanıt verdi.
• Programlama dilinin hedef kitlesi
Smalltalk , her dilinde olduğu gibi yazılımcılar icin , proje geliştirmek isteyenler icin geliştirilmiş bir uygulamadır. Ama biraz derine inersek bir kesimi wimp tarzı sistemleri prototiplerini üretecek , kullanıcı arayüzlerini sekillendirecek kişiler icin
tasarlanmıştır diyebiliriz.
• Programlama dilinin kullanım alanları
Smalltalk WIMP (Windows, Icons, Menus, Pointers) sistemlerinin prototiplerini üretmede kullanıldı. Bu tip kullanıcı arayüzleri kişisel bilişimi şekillendirmiş ve günümüzde halen GNOME, KDE, Mac OS X, Microsoft Windows v.s. sistemlerinde kullanılmaktadır.
• Desteklediği paradigmalar(imperative, declarative, functional, object oriented etc.)
Smalltalk dili Object Oriented programlamaya dayanan bir dildir ve bu paradigmanın öncüsüdür yani ilk nesneye dayalı programalama dilidir.Saf nesne yönelimli bir dil olan ,
Smalltalk dilinde her şey bir nesne olarak ele alınır, integer bile bir sınıftır. Smalltalk, günümüzde yaygın olmasa da kendisini takip eden bütün nesne yönelimli diller onun konseptinden etkilenmiştir.
Bu yüzden önemli bir kilometre taşıdır.
• Aritmetik islem notasyonu (infix/prefix/postfix)
Bilgisayarlarda infix yazım türünün çözümlenmesi zordur. Acaba x=a/b−c+d*e−a*c şeklindeki bir ifadeyi çözümlerken, ((4/2)−2)+(3*3)−(4*2) gibi bir ifadenin değerini hesaplarken ya da a/(b−c)+d*(e−a)*c gibi parantezli bir ifadeyi işlerken derleyiciler sorunun üstesinden nasıl geliyor? 32*(55-32-(11-4)+(533-(533-(533+(533-(533+212)))*21-2))) gibi birçok operatör(+, -, /, *, ^) ve operand(A, B, C… gibi isimler ya da sayılar) içeren bir işlemde nasıl operatör önceliklerine göre işlem sıralarını doğru belirleyip sonuç üretebiliyorlar? Bir ifadede farklı önceliklere sahip operatörler yazılma sırasıyla işlenirse ifade yanlış sonuçlandırılabilir. Örneğin 3+4*2 ifadesi 7*2=14 ile sonuçlandırılabileceği gibi 3+8=11 ile de sonuçlandırılabilir.
Bilgisayarlarda infix yazım türünün çözümlenmesi zordur. Bu yüzden ifadelerin operatör önceliklerine göre ayrıştırılması, ayrılan parçaların sıralanması ve bu sıralamaya uyularak işlem yapılması gerekir. Bu işlemler için prefix ya da postfix notasyonu kullanılır.
Çoğu derleyici, kaynak kod içerisinde infix notasyonunu kullanmaktadır ve daha sonra stack veri yapısını kullanarak prefix veya postfix notasyonuna çevirir.
Infix notasyonu:
Alışa geldiğimiz ifadeler infix şeklindedir. Operatörlerin işlenecek operandlar arasına yerleştirildiği gösterim biçimidir. Bu gösterimde operatör önceliklerinin değiştirilebilmesi için parantez kullanılması şarttır. Örneğin infix notasyonundaki 2+4*6 ifadesi 2+24=26 ile sonuçlanır. Aynı ifadede + operatörüne öncelik verilmesi istenirse parantezler kullanılır; (2+4)*6. Böylece ifade 36 ile sonuçlandırılır.
Prefix notasyonu:
Prefix notasyonunda (PN, polish notation) operatörler, operandlarından önce yazılır. Örneğin 2+4*6 ifadesi infix notasyonundadır ve prefix notasyonunda +2*46 şeklinde gösterilir.
Benzer biçimde (2+4)*6 ifadesi *+246 şeklinde gösterilir. Görüldüğü gibi prefix notasyonunda işlem önceliklerinin sağlanması için parantezlere ihtiyaç duyulmamaktadır.
Postfix notasyonu:
Postfix notasyonunda (RPN, reverse polish notation) ise önce operandlar ve ardından operatör yerleştirilir. Aynı örnek üzerinden devam edersek; infix notasyonundaki 2+4*6 ifadesi prefix notasyonunda 2 4 6 * + şeklinde, benzer biçimde (2+4)*6 ifadesi de 2 4 + 6 * şeklinde gösterilir. Yine prefix’te olduğu gibi bu gösterimde de parantezlere ihtiyaç duyulmamaktadır.
Bazı bilgisayarlar matematiksel ifadeleri postfix olarak daha iyi saklayabilmektedir.
Yani kısacası Smaltalkta işlem önceliği şu şekilde ilerlemektedir:
1- Parantez içi
2- Üs alma
3- Çarpma/Bölme
4- Toplama Çıkarma
• Bellek yonetimi(programcı denetimli/cop toplayıcı)
Smalltalk'un kod yazmayı daha kolay hale getiren özelliklerinden biri Çöp Toplayıcısı'dır. Nesneler olduğunda
Artık ihtiyaç duyulmadığı için bunları diğer çoğu nesne yönelimli dillerde olduğu gibi açıkça yok etmeniz gerekmez.
Bunun yerine, artık başka bir nesne tarafından başvurulmadıklarında otomatik olarak çöp toplanırlar. Bu
Çöp toplama, uygulama soruna konsantre olmanızı sağlar, ne yapacağınızı merak etmeyin
Nesnelerinize olur. Artık ihtiyaç duyulmazlarsa ortadan kaybolurlar ve hafıza kaybolur.
• Degisken kapsamları (Lexical(Sozluksel) scope/dynamic(Dinamik) scope)
Kapsam kuralları, bir programlama dilindeki adların görünürlük kurallarını tanımlar. Programın farklı bölümlerinde adlı bir değişkene referanslar varsa ne olacak ? Bunlar aynı değişkene mi yoksa farklı değişkenlere mi atıfta bulunuyor?
Smalltalk'daki bloklar da sözlü olarak kapsamlidir ve tanımlama ortamlarını içerir. Bloklar yöntemlerden, genel değişkenlere atanmış vb. Döndürülebilir - böylece yerel değişkenler için depolama alanı her zaman Smalltalk'daki bir yığın üzerinde tahsis edilemez.
Sozluk Kapsamlaştırma(Lexical)
Değişkenler bu kapsamda bildirilebilir ve dışarıdan görülemez. Bununla birlikte, kapsama alanının dışındaki değişkenler - kapsamları kapatmada - geçersiz kılınmadıkça (gölgelenir) görülür.
Dinamik Kapsamlaştırma(Dynamic)
Bazı eski diller dinamik kapsamı kullanır . Bu kapsam kuralını kullanarak, öncelikle bir değişkenin yerel bir tanımı ararız. Bulunmazsa, tanım için çağrı yığını ararız. Dinamik kapsamlandırma, Common Lisp'den önceki Lisp sürümlerinde normdu ve aynı zamanda SNOBOL ve APL gibi daha eski, yorumlanmış dillerde de kullanılmaktadır. Bir değişkeni, defvar(ancak Şema içinde değil) kullanarak, Dinamik olarak Kapsamlı Lisp'de kapsayıcı olarak bildirebiliriz .
Smalltalk'daki bloklar da sözlü olarak kapsamlidir ve tanımlama ortamlarını içerir. Bloklar yöntemlerden, genel değişkenlere atanmış vb. Döndürülebilir - böylece yerel değişkenler için depolama alanı her zaman Smalltalk'daki bir yığın üzerinde tahsis edilemez.
• Tip sistemi (guclu(strong)/zayıf(weak)) ve tip kontrolu (static type checking/dynamic type checking)
Programlama dillerinde yapılan her işlem öncesi hataları önlemek için verilerin tip kontrolü yapılır. Bu tür kontrollere ”Checking” adı verilir. Checking işlemleri compile-time (derleme esnasında) veya run-time (çalışma esnasında) olarak yapılır. İşte bu farklılık Statik Tipli ve Dinamik Tipli dillerin temel ayrım noktalarından biridir.
Statik Tipli dillerde her değişkenin değişmez bir tipi olmak zorundadır. Uygulama geliştire ya bu tipi bizzat belirler yada Derleyici tarafından belirlenir
Statik Tipli dillerde yapılan işlemlerden önce Tip Konrolü yapıldığı için, operandların tiplerinin belirlenmesi gerekir. Tip kontrolleri compile (derleme) esnasında yapılır.
Dinamik Tipli dillerde değerler değişmez bir tipe sahiptir. Ancak değişkenler ve ifadelerin belirli bir tipe sahip olma zorunlulukları yoktur. Her bir işlem esnasında, operandlar değişik değerler üretebilir. Değişkenlerin ve ifadelerin tipleri run-time (çalışma) esnasında belirlenir. Yani kısacası Smalltalk dili dinamik tip kontrolüne sahiptir.
Smalltalk'da her nesne, örnekleri üzerinde taşınan işlemleri (ve nasıl) tanımlayan tür sınıfına sahiptir. Dolayısıyla, bazı nesnelere bir ileti gönderirken sınıfı bu iletinin işlenip işlenemeyeceğini denetler.
Öte yandan statik olarak yazılan dillerin aksine değişken, programın ömrü boyunca farklı türde farklı nesneler içeriyor denilebilir, dolayısıyla değişken (veya argüman) tabanlı tür denetimi yoktur.
• Basit bir “Merhaba dünya !(Hello world!)”
self inform: 'Hello, World!'.
• Fibonacci Sayısı Hesaplama
fibonacci: n
| numbers a b |
numbers := OrderedCollection new.
a := 1.
b := 1.
[ numbers size < n ] whileTrue: [
| temp |
numbers add: a.
temp := b.
b := a + b.
a := temp.
].
^ numbers.s
• Faktoriyel Hesaplama
factorial
"Answer the factorial of the receiver." //Alıcının faktöriyeli hesaplaa!!
self = 0 ifTrue: [^ 1].
self > 0 ifTrue: [^ self * (self - 1) factorial].
self error: 'Not valid for negative integers'
• Collatz Sanısı Hesaplama
Integer >> collatz
"Answer the Collatz steps and the maximum value reached, of the receiver."
^ self collatzSteps: 0 max: self
Integer >> collatzSteps: steps max: upto
self = 1 ifTrue: [^ steps+1 -> upto].
self even ifTrue: [^ (self/2) collatzSteps: steps+1 max: (self max: upto)].
self odd ifTrue: [^ (3*self + 1) collatzSteps: steps+1 max: (self max: upto)]
Recep Yiğit Kader
Yorumlar
Yorum Gönder