Ruby ile Merhaba Dünya
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. Uzun yıllardır .NET üzerine yoğunlaşmış olsam da zaman zaman farklı alanlara hatta farklı programlama dillerine de göz atı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.
Geçtiğimiz aylarda kendimi “ç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ü. 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.
Bu araştırmaların sonucunda bir süredir Ruby dili üzerinde çalışıyorum. Çok yoğun vakit ayıramasam da bir “Merhaba Dünya” demenin zamanı geldi diye düşünüyorum. Bu yazıda sizlere Ruby dilinin temel bilgilerini, karakteristik özelliklerini ve dile giriş yapmak için birkaç kod örneğini anlatmaya çalışacağım. Ö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)
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.
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. 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.
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.
Ruby ile Varolan Tipleri Genişletmek
Ruby’ de sınıfları genişletmek oldukça kolaydır. Yani var olan bir tipe, örneğin string sınıfına 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.
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 metot kullanılabilir. Bunu C# tarafındaki genişletme metodlarına(Extension Methods) benzetebiliriz.
Metot 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.
İlginç Bir Kod Parçası
Pek tabi Ruby dili ile uğraşırken bana enteresan gelen kod parçaları da öğrenmedim değil. Örneğin bir metoddan birden fazla parametre nasıl döndürülebilir sorusuna cevaben aşağıdaki kod parçasında olduğu gibi.
def Hesapla(x,y) return x+y,x-y,x*y,x/y end toplam,fark,carpim,bolum=Hesapla 8,3.14 puts "#{toplam}\n#{fark}\n#{carpim}\n#{bolum}"
Özellikle toplam, fark, carpim ve bolum değişkenlerin Hesapla metodunun çalışma sonuçlarının nasıl atandığına dikkat edelim. puts’dan sonra gelen ifade içerisinde yer alan #{toplam} gibi terimler ile kod dosyası içerisindeki değişkenlere erişip metin içerisine gömdüğümüzü belirtebiliriz. Çok basit ve eğlenceli değil mi?
Ruby is designed to make programmers happy. -Yukihiro Matsumoto(Matz)
Sonuç Olarak
Görüldüğü üzere Ruby ile programlama oldukça eğlenceli. Dilin gerçekten çok güçlü özellikleri var. OOP temellerini taşıyor olması bunun en büyük sebebi. Diğer yandan İngilizce diline çok yakın tasarlanması, kolay okunabilir kod yazılabilmesi, “aklın yolu bir” dedirten ifadeleri ile Fluent yapıların ve doğal olarak Domain’e özgü dillerin geliştirilmesi için de ideal.
Ruby ile ilişkili olarak çalışmalarıma devam etmekteyim. Yeri geldikçe öğrendiklerimi @burakselyum twitter hesabım üzerinden #Ruby #ILoveRuby hashtag’leri altında paylaşıyorum.