Anasayfa / FAQ / Rakip Kardeşler Python ve Ruby Programlama Dillerinin Benzerlikleri ile Farkları

Rakip Kardeşler Python ve Ruby Programlama Dillerinin Benzerlikleri ile Farkları

Bir yandan yazılmaya çalışılan bir kurgu roman bir yandan aslında Manga olarak çıkması planlanmış ama gerçekleşmemiş “Kızıl Karanlık” isimli projenin devam çalışmaları ve diğer işler güçlerin arasında mümkün olduğunca bilgilendirici olmasını umduğum yazılar paylaşmaya çalışacağım her gün. Yeterince ilgi görürse ücretsiz olarak Gitbook üzerinde kitaplaştırılıp özgür bir lisans ile paylaşılacak bir projedir bu. Blog üzerindeki ilk paylaşım da hazır yeni başlayanlara tavsiye niteliğinde iken bu yazıda da ülkemizde çok popüler bir dil olan Python ile Ruby’nin hikayeleri, misyonları ve benzeyen yanları ile birbirinden ayrılan yanları hakkında birikimim yettiğince bilgi vermeye çalışacağım.
Başlamadan önce önemle belirtmem gerekir ki, ben bir Python gurusu değilim. Yakın dönemde olmayacağım da inkar edecek olsam bile aşikar.
Bilmeyenler ama merak edenler için bir kez daha tekrar edelim: Python, nesne yönelimli, yorumlanan, modüler ve etkileşimli bir yüksek seviyeli programlama dilidir.
Söz dizimi sade ve kodlama bloklarının hiyerarşisinin girintilerle belirleniyor olması öğrenilmesini ve akılda kalmasını bir hayli kolaylaştırmaktadır.  Vikipedi üzerinde de belirtildiği gibi:

“Modüler yapısı, sınıf dizgesini (sistem) ve her türlü veri alanı girişini destekler. Hemen hemen her türlü platformda çalışabilir. (Unix , Linux, Mac, Windows, Amiga, Symbian). Python ile sistem programlama, kullanıcı arabirimi programlama, ağ programlama, uygulama ve veritabanı yazılımı programlama gibi birçok alanda yazılım geliştirebilirsiniz. Büyük yazılımların hızlı bir şekilde prototiplerinin üretilmesi ve denenmesi gerektiği durumlarda da C ya da C++ gibi dillere tercih edilir.”

Gelelim Python Programlama Dilinin Tarihçesine, öncelikle Monthy Python grubu ekremist hassasiyetleri olmayan, açık görüşlü herkesin izleyip tadına varması gereken bir İngiliz komedi topluluğudur diye belirtelim. 1990 yılnıda özgürlükler şehri Amsterdam’da bilgisayar bilimci Guido van Rossum dili geliştirmeye başladığında isim için bu komedi grubunun Monty Python’s Flying Circus isimli gösterisinden esinlenmiştir. Python 1.0 sürümünün yayınlanması ise 1994 yılında mümkün olmuştur. Şu an 2 sürümünün desteği 2020 yılına kadar sürücek olup, 3 sürümü kararlı olarak 3.5.2 sürüm numarası ile yayınlanmış haldedir. İki sürüm birbirine uyumlu değildir ama birbirine dönüştüren araçlar geliştirilmiştir.

Eğer Python’un söz diziminden bahsedecek olursak küme parantezleri vb simgeler kullanmaksızın sade bir yazım belirlenmiştir. Döngü ya da karşılaştırma gibi işlemlerde kodların gruplanması girintilerle olur.
Python’da ifade bloklarını sınırlandırmak için süslü ayraçlar ya da anahtar kelimeler yerine beyaz boşluk girintileme kullanılır. Belli ifadelerden sonra girinti artar; girintinin azalması geçerli blokun sonlandığını gösterir. (Vikipedi alıntı.)
* / + – < > == <= >= != ** gibi işlem, karşılaştırma ve and or not true false gibi mantıksal işleçler sunar.

Python ifadeleri şunları içerir: (Vikipediden aldım ve bir kaç ekleme çıkarma yaptım.)

  • if ifadesi, bir kod blokunu belli bir koşula bağlı olarak, else ve elif (else-if’ın kisaltmasi) ile birlikte çalıştırır. Sadece if için else opsiyoneldir. Elif ikiden fazla koşulun gerektirdiği durumlar için olduğundan else ile kullanılır.
  • for ifadesi, yinelenebilir bir nesne üzerinden yineleme yapar, bu sırada ilgili bloktaki her ögeyi bir yerel değişkene atar.
  • while ifadesi, koşulu doğru olduğu sürece o kod blokunu çalıştırır.
  • try ifadesi, eklenmiş kod blokundan dolayı oluşan hataları yakalar ve except maddeleriyle; ayrıca finally blokundaki temizleme kodunun blok nasıl sonlanırsa sonlansın çalıştırılmasını sağlar.
  • class ifadesi, bir kod blokunu çalıştırır ve onun yerel adalanını bir sınıfa atar, bu sayede o sınıf Nesne Yönelimli Programlamada kullanılabilir.
  • def ifadesi ile fonksiyon tanımlanır.
  • with ifadesi, bir kod blokunu bir içerik yöneticisine hapseder (örneğin bir kod bloku çalışıtırılmadan önce bir kilit edinir ve sonrasında bu kilidi çözer)
  • pass ifadesi bir NOP görevi görür ve geçici kod bloku yerine kullanılabilir.
  • print ifadesi bir ekrana yazdırma görevi görür.
  • # tek satırlık yorumların önünde, “”” işareti çok satırlı yorumların başlangıç ve sonunda yer alır.
  •  input Kullanıcıdan veri girişi alır.

Her ifadenin kendi sözdizimi vardır, örneğin def ifadesi diğer ifadelerin genelinin aksine blokunu anında çalıştırmaz. Nesne üzerindeki nesnenin sınıfına eklenmiş fonksiyonlara metot denir. 

Her dil için çalıştığnın ilk emaresi olan kodu yazalım:

# -*- coding: utf-8 -*-
print(“Selâmün aleyküm  Dünya”)

Bu kod dünyamıza gayet geleneksel bir selam verecektir. Peki, kullanıcadan basitçe bir veri girişi alsak:
# -*- coding: utf-8 -*-
isim = input(“Sen kim köpeksin?”)
print(isim) # Bu ismi ekrana yazma için.
Python dili için ayrıntılı Türkçe döküman ve oldukça kapsamlı ücretsiz Türkçe bir kitabı http://belgeler.istihza.com/py3/ adresinden bulabilirsiniz.
Ruby Programlama Dilinden bahsedecek olursak o da Python gibi ve hatta fazlasıyla nesne yönelimli, modüler, dinamik, reflektif bir programlama dilidir. Geliştiricisi Yukihiro Matsumoto’nun da belirttiği üzere Perl diliyle özellikle başlangıçta oldukça benzer noktaları oup Smalltalk, Eiffel, Ada ve Lisp gibi dillerden de bir hayli etkilenmiştir. Yine “Matz” lakaplı Yukihiro bir çok konferansta Python kaynak kodunu incelediğini ve bir çok noktada ilham aldığını belirtmiştir. Ruby programlama dili çoklu programlama paragdigmalarını destekler bu sayede nesne yönelimli, fonksiyonel ya da emirli programlama paradigmalarından tercih ettiğiyle çalışma özgürlüğü sunar geliştiricilere.
Duck typing olarak da ifade edilen dinamik yazma yapısıyla değişken tipini taşıdığı değer belirler (ördek gibi vaklıyorsa ördektir.) ve Garbage Collector ile bellek yönetimi otomatik olarak yapılır. Bu iki özellik Python ile ortak noktalarındandır.
Ruby’nin yaratıcısı Matz şöyle demiş:
“Perl dilinden daha güçlü, Python dilinden daha object-oriented bir script dili olmasını istedim.”
Pek çok programlama dilinde sayılar primitive (ilkel/basit) tiplerdir, nesne değildirler. Halbuki Ruby’de sayılar dahil herşey nesnedir. Yani sayının da method’ları vardır.

Ruby’nin sözdizimi günümüzde de yoğun olarak kullanılan Perl ve Python ile büyük benzerlikler gösterir. Sınıf ve metot tanımlamaları anahtar kelimelerle belirlenir. Ruby’de Perl’in aksine, değişken adlarının başında belirleyici karakterler ($, @@, % gibi) kullanmak bir zorunluluk değildir. Python’un tersine girintilerin dilin sözdiziminde bir etkisi yoktur.
Ruby, çoklu kalıtıma Java gibi izin vermemesine rağmen mixin adı verilen nesnelerle bir çeşit arayüz tanımlama imkânı verir. Ayrıca paketler üzerinden de bu sınırlama geçiştirilebilir. (Vikipedi alıntı.)

Detaylandıracak olursak, Ruby’de bir Class (sınıf) sadece tek bir sınıftan türeyebilir. Yani A class’ı B’den türer ama aynı anda hem B’den hem C’den türeyemez. Bu Python’da mümkün olan bir şeydir. Ruby’de ise bunun üstesinden gelmek için class’lar Module’leri kullanır. Bir Class N tane Module içerebilir, işte bu tür nesnelere Mixin denir.
Ortak kullanılacak metodları ya da değişkenleri ayrı bir Module olarak tasarlayıp, gerektiği yerde include ederek Class + Module karışımından oluşan Mixin’ler ortaya çıkar.
Diğer dillerdeki gibi Exception Handling, Garbage Collector özelliklerinin yanı sıra, C-Extension’ı yazmak diğer dillere göre daha kolaydır. İşletim sisteminden bağımsız threading imkanı sunmaktadır. Pek çok işletim sisteminde Ruby kullanmak mümkündür: Linux – Unix – Mac OS X – Windows – DOS – BeOS – OS/2 gibi…
Test Driven Development yani test’le yürüyen geliştirme mentalitesinin en iyi oturduğu dildir.
Matz der ki:
“Ruby programlamak eğlencelidir!”
Her dil için çalıştığnın ilk emaresi olan kodu Ruby ile yazacak olursak:
# -*- coding: utf-8 -*-
print “Selâmün aleyküm  Dünya”
tabi bu print muthod’unun çıktısını bir yani satır izlesin dersek “n” ekleyeceğiz ya da sadece print yerine puts kullanacağız.
# -*- coding: utf-8 -*-

puts “Selâmün aleyküm  Dünya”

Kullanıcıdan girdi de alalım:

# -*- coding: utf-8 -*-
print “Sen kim köpeksin?”
isim = gets.chomp
puts isim
Ruby programlama dili geliştiricisi temel felsefe olarak, makinelerin hızına, talebine ya da mutluluğuna diyelim odaklanmaktansa geliştiricinin çalışma hızının artışı, rahat ve hızlı çalışabilmesine ve mutlu olmasına odaklanmayı benimsemiştir. Python dilinin aksine bir şeyi birden fazla şekilde yapma özgürlüğü verilmesinden yana bir yapıdadır dil. Magic denilen ufak numaralara izin vermekten çekinmez.
Ruby ve Python dillerinin benzerliklerinin kısaca üzerinden geçecek olursak.
  • Ruby ile de etkileşimli komut satırı kullanabilirsiniz. (irb yani interaktif Ruby ismiyle anılır ve irb komutuyla çalışır.)
  • İşlem operatörleri ayndır.
  • Python’daki pip paket yükleyicisine alternatif olarak gem paket yükleyicisine sahiptir ( gem install pry komutu ile irb’den daha fonksiyonel bir interaktif shell sahibi olabilirsiniz örneğin.)
  • Tıpkı Python gibi özel bir satır sonlandırıcı yoktur ancak ; kullanarak iki farklı satırı yan yana yazabilirsiniz.
  • String veriler birden fazla satır içerebilir.
  • Köşeli parantezler liste tanımı/gösterimi ve süslü parantezler sözlükler içindir.
  • Array veri tipi aynı şekilde çalışır.
  • Dinamik olarak tanımlama atma yapılır
  • Değişkenler hariç her şey bir nesnedir. Değişkenler nesnelere referanstır.
  • Anahtar kelimeleri biraz farklılık gösterse de hata yakalama aynı prensiple çalışır.
  • Gömülü döküman aracına sahiptir.
Farklılıkları özetleyecek olursak da:
  • Ruby için string veri tipi mutable yapıdadır.
  • Ruby dilinde tek çeşit ve mutable array tipi vardır, tuple veri tipini içermez.
  • Ruby Constant tanımlamanıza izin verir.
  • Ruby için tanımlamalarda zorunlu yazım kurlları vardır (Sabitler ve haliyle Class ve Module adları  büyük harfler başlar, bir sınıfın nesne değişkenleri yani instance variable değişkenler @ işareti ile başlar sınıf değişkenleri @@ işareti ile başlar, global değişken $ ile başlar.)
  • Ruby özniteliklere direkt erişim vermez. Tümü nethod çağrısıdır.
  • Tek tırnak içindeki string interpolaiton ya da t gibi özel karakterleri dikkate almaz ham string veri olarak işler. Tıpkı Python dilindeki r”ham string verisi” gibi.
  • Ruby dilinde method çağrıları için parantez kullanımı opsiyoneldir.
  • Erişim izinleri için Python’ın _voluntary_ underscore@convention@ ifadeleri yerine public, private ve protected ifadeleri vardır.
  • Çoklu kalıtım özelliği olmadığı için bu eksiklik mixinler ile giderilir.
  • 0  true bir değerdir, “” [] {} de true döner. sadace false ve nil false döner.
  • elif elsif olarak kullanılır.
  • import require olarak kullanılır.
  •  Sihirli çözümler için kolay hatırlanabilen pek çok kısayol sunar.
  • Daha önceden belirlenmiş bir değişkeni silme yolu yoktur (Python’ın del ifadesi gibi). Değişkeni nil olarak ayarlayabilirsiniz, bu eski değişkenin eski değerini çöp toplayıcıya gönderir, ama değişken kapsamı içinde sembol tablosunda kalmaya devam eder.
  • Ruby dili gömülü sınıflara metod ekleyebilir ya da bu sınıfların metodlarını değiştirmenize izin verir.
  • Ruby dilinde case koşul operatörü vardır.
  • for birebir aynı şekilde dizileri iterate eder ancak Ruby dilinde genellikle each, each_with_index gibi enumarator method çağrıları kullanılır.
  • Lamda fonksiyonlara alternatif olarak Proc da vardır.
Her iki dil de size özgür bir geliştirme ortamını yardımsever bir komünite ve ücretsiz dökümanlar online versiyonları ücretsiz kitaplar vb birçok destek de sunarak sağlamaktadır. Size kalan ise kısa zamanda kendinizi ek yükler yüklemeden yeni şeyler yaratmak. Aracınızı seçip başlamanız yeterli.

Hakkında Gökhan Çağlar

Yazar, Şair, Hayalperest, Rubyist

Bunu mu demek istemiştiniz?

ruby

Ruby İçin Daha İyi Performans Rehberi

Ruby Programlama Dilinin sevdiğim özelliklerinden biri de standart kütüphane ile gelen benchmark modülü. Bu sayede …

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir