Ruby Maceralarım

Merhaba Arkadaşlar,

Kırklı yaşlarına gelmekte olan bir yazılımcıyım ve uzun zamandır bu işin içerisindeyim. Fark ettim ki yeni bir şeyler araştırmadan rahat edemiyorum. Belki hep .Net üzerine yoğunlaştım ancak zaman zaman farklı alanlara da göz atıyorum. Bu düşüncelere sahip olduğum dönemlerde ağırlıklı olarak farklı programlama dillerini tanımaya çalışıyorum. 

Zamanında az da olsa Haskell, Scala, Go gibi dillere bakmıştım. Hatta çok uzun zaman önce ciddi olarak Java platformu ile ilgilenmiştim. Farklı programlama dillerini incelemek bir yazılımcı için önemli. Bu sayede örneğin fonksiyonel programlama gerçekten ne anlama geliyor veya dinamik dil denince ne ifade edilmek isteniyor daha kolay anlaşılabiliyor.

Belli bir yaştan sonra öğrendiklerimizi sürekli tekrar ettiğimizi düşünecek olursak kendimizi farklı konular üzerinde eğitmeye çalışmak, bizi takip eden nesillere aktarmak istediğimiz tecrübe yoğunluğu açısından önemli. 

Tabii araştırma için de zaman ayırabilmek lazım. İş ve gündelik yaşantımızdaki yoğunluk düşünüldüğünde zaman zaman ciddi fedakarlıklar yapmamız gerektiği de ortada. Ben de sık sık olmasa da öğle aralarımı veya bazı günler mesai sonrası saatlerimi(Her ne kadar hollandalı patronum bu durumu zaman zaman içerlese de) yeni bir şeyleri araştırmaya ayırıyorum. 

Yine böyle günlerden birisinde kendimi bir anda "çocuklara programlamayı nasıl öğretebiliriz?" sorusuna cevap ararken buldum. Bu konuda en çok duyduğum ifade MIT'nin Scratch isimli çalışmasıydı. Hatta bu konuda Türkçe kaynak ve eğitim setleri bulmak bile mümkündü. Fakat araştırmalarım sırasında gözüm Ruby diline de takıldı. Özellikle 10 yaş üzeri çocukların programlama mantığını öğrenmesi için bir kitap bile buldum ve hiç vakit kaybetmeden Amazon'dan getirttim.


Bir süredir bu dil üzerinde çalışıyorum. Çok yoğun vakit ayıramasam da bir "Merhaba Dünya" demenin zamanı geldi diye düşünüyorum. Öyleyse başlayalım.

Temel Bilgiler

Ruby, Japon bilgisayar ve yazılım uzmanı Yukihiro "Matz" Matsumoto tarafından geliştirilmiş bir programlama dilidir. Matz bu dili inşa ederken özellikle kolay yazılabilir ve aynı zamanda güçlü bir dil olmasına gayret etmiştir. Dilin felsefesini kendisi şu paragraf ile özetlemiştir.

I wanted to minimize my frustration during programming, so I want to minimize my effort in programming. That was my primary goal in designing Ruby. I want to have fun in programming myself.

- Yukihiro Matsumoto(Matz), creator of Ruby -

Dili daha iyi tanıyabilmek için diğer karakteristik özelliklerine bakmamızda yarar var. Bunlar temel olarak aşağıdaki maddeler halinde sıralayabiliriz. 

  • Her şeyden önce nesne yönelimli(Object Oriented) bir dildir.
  • İngilizce dilbilgisine çok yakındır bu yüzden kolay okunur ve anlaşılırdır.
  • Yeri geldiğinde procedural veya fonksiyonel bir dil olarak kullanılabilir.
  • Dinamik bir programlama dildir.(Dynamic Programming Language)
  • Söz dizimi kolaylığı ve OOP gibi özellikleri sayesinde DSL(Domain Specific Language) geliştirilmesi kolaydır.
  • Meta programlama(Metaprogramming) yetenekleri içerir.
  • Ruby geliştirilirken Ada, Eiffel, Lisp, Smalltalk, Perl gibi diller dikkate alınmıştır.
  • Kaynak kodu açık, özgür bir programlama dili olarak tasarlanmıştır.

Ruby platform bağımsızdır. Yani bir makinede geliştirilen Ruby kodları farklı bir platform için de geçerlidir. Bunun yanında özellikle öğrencilere programlama mantığını eğlenceli bir şekilde öğretebilmek için ideal bir dildir. Quora' daki bilgilere göre GitHub ve Twitter, Ruby on Rails kullanmışlardır. Zaman içerisinde Sun Microsystems, Microsoft, Intel, Apple ve Amazon gibi büyük çaplı firmaların Ruby programlama dilini kullandığı belirtilmiştir(Kaynak:Beginning Ruby:From novice to professional-Apress)

Pek tabi kullanım alanları düşünüldüğünde özellikle bilimsel çalışmalar için de ideal olduğu ifade edilebilir. Güçlü Regex desteği sayesinde metinsel sorgulama ve işleme alanında, CGI programlamada, Network operasyonlarında, XML işlemede, prototip geliştirmede yoğun bir şekilde kullanılmaktadır. Desteklediği platform yelpazesi son derece geniştir. Windows, Linux, MacOs bir yana Java Symbion yüklü cihazlarda dahi programlama yapabileceğimiz ifade edilmektedir. Hatta kaynaklara göre Amiga üzerinde bile Ruby kodlaması yapılabilinir. (Bunu denemek istiyorum gerçekten de.)

Kurulum ve İlk Kodlar

Ruby dili tercih edilen platforma göre şu adresten indirilip kurulabilir. Ben klasik olarak Windows platformu üzerinde bir kurulum gerçekleştirdim. Ancak ilerleyen zamanlarda Linux ve MacOSx üzerinde de denemeler yapmayı planlıyorum. Kurulum işlemi tamamlandığında hemen kodlamaya başlayabileceğimiz Interactive Ruby isimli komut satırı aracının da yüklendiği görülebilir. İlk kodlarımızı irb komut satırında aşağıdaki gibi yazabiliriz.

Yukarıdaki ekran görüntüsünde yer alan kod parçası dilin İngilizce' ye ne kadar yakın olduğunu da göstermektedir. Bu sebepten söz dizimi okunurluğu oldukça kolaydır. (Aslında böyle bir söz dizimini yazmak ve okumak oldukça eğlencelidir de. En azından ben çok eğlendiğimi ifade edebilirim. İnsan kod yazarken gülümser mi? Evet gülümser.)

Her Şey Bir Nesnedir

Ruby dili OOP(Object Oriented Programming) özelliklerini taşır. Bu yüzden her şey bir nesne olarak düşünülebilir. Aşağıdaki kod parçasını bu anlamda göz önüne alabiliriz.

Burada Ruby' nin temel nesne yapısı da az çok görülmektedir. C# veya Java dili ile uğraşanlar için her şeyin nesne olarak ifade edilebilmesi aslında her şeyin bir super/base sınıftan türemesi anlamına da gelmektedir. Aşağıdaki şekil Ruby' nin temel tip hiyerarşisini göstermektedir. (Tabi bunun en güncel halini bulmamız da yarar var. Buraya not düşelim)

Var Olan Tipleri Genişletmek

Ruby' de sınıfları genişletmek oldukça kolaydır. Yani var olan bir tipe yeni bir fonksiyonellik kazandırmak basittir. Bu anlamda aşağıdaki kod parçasını göz önüne alabiliriz.

class String
	def KarizmatikYap
		newWord=""
		self.split("").each{|c| newWord<<c<<" "}
		newWord.chop
	end
end

if __FILE__ == $0
	puts "Mesajiniz nedir?"
	mesaj=gets
	karizmatikHali=mesaj.KarizmatikYap
	puts karizmatikHali
end

Hemen şunu ifade edelim. Yukarıdaki kod parçasını rb uzantılı bir dosya olarak kaydedip normal komut satırından ruby programı ile aşağıdaki gibi çalıştırabiliriz. Dejavuuu :)

String zaten ruby diline ait bir sınıftır. def ve end bloğu arasında tanımlanan kod parçası, KarizmatikYap isimli bir metoda aittir.String tipinde herhangi bir değişken üzerinden KarizmatikYap isimli metod kullanılabilir. Bunu C# tarafındaki genişletme metodlarına(Extension Methods) benzetebiliriz. 

Metod içerisinde kullanılan self anahtar kelimesi ile çalışma zamanındaki string değişkeni işaret edilir. Bu yüzden self üzerinden de String sınıfına ait olan metodlar çağırılabilir. split bunlardan birisidir. Hemen arkasında gelen each ifadesinde süslü paranetezler içerisinde bir operayon gerçekleştirildiği gözden kaçmamalıdır. 

Bu ifadeye benzer bir yapı LINQ(Language INtegrated Query) tarafında da mevcuttur. c ile self'in işaret ettiği ve split ile ayrıştırılarak karakter katarı haline getirilmiş dizinin elemanları işaret edilir. Sonrasında newWord isimli değişkene << operatörü ile sağdan olmak üzere o anki karakter ile bir boşluk eklenir. chop metodu en sondaki boşluk karakterini atmak için idealdir. 

__FILE__ bloğu içerisinde ise öncelikle komut satırından bir bilgi istenmekte ve sonrasında KarizmatikYap metodu çağırılarak sonuçlar ekrana yazdırılmaktadır. puts bir alt satıra geçirecek şekilde ekrana bilgi yazarken, gets ile ekrandan mesaj alınması sağlanır. Bu arada self sonrası kullanımlarda bir metod zinciri oluştuğunu ve hafiften Fluent bir söz dizimine gidildiğine de dikkat edelim derim.

Ruby' nin Büyük Sayılar ile Arası

Oldukça iyidir :) Bunu ifade etmek için aşağıdaki kod parçasını göz önüne alabiliriz.

def Faktoryel(sayi)
	if sayi==0
		1
	else
		sayi*Faktoryel(sayi-1)
	end
end

if __FILE__ == $0
	puts "Bir sayi giriniz"
	sayi=gets.to_i
	f=Faktoryel sayi
	puts f
end

Yine bu kod parçasını rb uzantılı bir dosya adı ile kaydedip komut satırından ruby aracı ile aşağıdaki ekran görüntüsünde yer aldığı gibi çalıştırabiliriz.