Bugüne Uzanan Yol
Perl, kökleri 1987 yılına kadar dayanan, Larry Wall tarafından yaratılmış, yüksek seviyeli, dinamik bir programlama dilidir. Ortaya çıktığı senelerde mevcut diğer çözümlere göre daha kullanışlı olması, farklı platformlarda çalışabilmesi ve güçlü metin işleme özellikleri sayesinde kısa sürede zamanının en popüler dinamik programlama dili olmuştur. Genel amaçlı bir dil olmasına rağmen çıktığı senelerde patlama yapan web ile birlikte web'de dinamik sayfalar yaratmanın da en çok kullanılan aracı haline gelmiştir.
Perl, günümüzdeki diğer dillere nazaran daha karmaşık bir söz dizimine sahiptir. Hatta Perl, günümüzde bağlamsal (contextsensitive) ifadelere sahip belki de tek popüler programlama dilidir. Ayrıca Perl'ün ilkelerinden biri, bir problemi çözmek için mümkün olduğunca fazla yol sağlamaktır (there is more than one way to do it (TMTOWTDI)). Bu özellikler biraz da Larry Wall'un dilbilimci geçmişinin yarattığı etkiyle Perl'ü konuşma dilinin özellikleri ile donatmak istemesinden kaynaklanır. Ancak Python ve Ruby, bu, çoğu kişi tarafından sevilmeyen özellikleri barındırmamıştır. Özellikle Python, ilke olarak bir problemin çözümü için tek bir yöntem sunmaya çalışır. Ruby, problem çözümlerinde birden fazla yol sunarak Perl'e daha yakın bir duruş sergiler ancak Perl'deki sevilmeyen diğer özellikleri kendi bakış açısı ile değiştirmiştir. Bu sebeplerle Perl daha kıvrak ama okuması ve öğrenmesi daha zor kalırken yeni nesil diller kolay okunabilir ve öğrenilebilir olmuştur. Başka bir deyişle, yeni nesil diller tercih olarak yazılabilirlik (writability) yerine okunabilirliği (readability) seçmişlerdir. Yeni nesil dillerde değer verilmiş olan bir başka şey ise nesne yönelimli programlama olmuştur. Özellikle Ruby, Smalltalk dilinden de esinlenerek herşeyi bir nesne olarak görmektedir. Perl 5'te ise nesne yönelimli programlama desteği oldukça kısıtlı kalmış, ancak topluluk içinde yapılan eklentilerle geliştirilmeye çalışılmıştır.
1994 senesinde 5. sürümü yayınlanan Perl, 2000'li senelere yaklaşıldıkça web alanında tacını çıktığı günden itibaren müthiş bir hızla yayılan PHP'ye devretmeye hazırlanmaktadır. Ayrıca Python ve Ruby gibi yeni nesil dillerin çok dikkat çekmesi, insanların senelerdir Perl'de isteyip de bulamadıkları şeyleri bu dillerde bulması, Perl'de de büyük yeniliklerin görülmemesi, Perl topluluğunda bazı kopuklukların yaşanmasına, eleştirilerin yükselmesine sebep olmuştur. Topluluk heyecanını yitirmek üzeredir. Ancak bu gidişat 2000 senesinde yapılan bir Perl konferansı sırasında değişmek üzeredir.
2000 senesinde yapılan Perl konferansında, içinde Larry Wall'un da bulunduğu bir grup, Perl topluluğunu nasıl daha verimli hale getirebilecekleri konusunda bir toplantı yapmaya başlar. Toplantının ilk saati oldukça sıkıcı ve sıradan konuşmalarla geçmiştir. Derken toplantı odasına ünlü Programming Perl kitabının yazarlarından Jon Orwant girer, birkaç dakika boyunca devam eden sıkıcı konuşmaya tanıklık eder, yerinden kalkıp kahve servis tepsisinin yanına yürür, eline geçirdiği kahve kupalarını alıp karşı duvara fırlatmaya başlar ve şöyle der: "Topluluğu heyecanlandıracak birşey bulamazsak hapı yutarız; çünkü herkes bu işten sıkılmaya ve başka şeylerle ilgilenmeye başladı.". Sözüne ve kahve kupalarını fırlatmaya devam eder: "Ne yaparsınız bilemem ama büyük, çok büyük bir şey yapmalısınız.". Daha sonra da toplantı odasından çıkar. Odadaki yirmiye yakın kişi elbette şaşırmıştır ancak bu olay toplantı salonundakileri harekete geçirir. Grup, Perl'ün geleceği hakkında radikal kararlar alma konusunda cesaretlenmiştir. Larry Wall bu olayı daha sonra "görebileceğiniz en iyi şekilde uygulanmış bilinçli bir öfke nöbeti" olarak adlandıracaktır. O gece, konferansın ertesi günü yapacağı konuşmayı baştan yazar ve üç saatlik uykusuyla yaptığı konuşmasında dinleyicilere Perl'ün baştan aşağı yeniden yazılacağını müjdeler.
Larry Wall, aynı konuşmada Perl 6'nın nasıl bir geliştirme süreci izleyeceğini de şu şekilde özetleyecektir: "Perl 5 benim Perl'ü baştan yaratışımdı, Perl 6'nın ise topluluğun Perl'ü baştan yaratışı olmasını istiyorum.". Gerçekten de Perl 6'nın şekillenmesinde topluluğun çok büyük katkısı olmuştur. Ancak bir süre sonra kararlara son nokta koyması için birine ihtiyaç duyan topluluk elbette bu iş için Larry Wall'u seçecektir.
Perl 6'nın yapılışının Perl 5'ten bir diğer farklı özelliği ise Perl 6'nın bir programlama dili tanımı olmasıdır. Yani ilk başta Perl 6'nın standartları belirlenecek, bu programlama dili için bir yorumlayıcı geliştirme işi ise başkalarına bırakılacaktır. Nitekim, adını 1 nisan 2001 yılında yapılan, Perl ile Python'un yapımcılarının birleşerek yeni bir programlama dili yapmaya karar verdiğine ilişkin hayali bir röportajı içeren bir şakadan alan Parrot sanal makinesinin ve Parrot üzerinde çalışacak olan Rakudo adındaki Perl 6 gerçekleştiriminin yapımına başlanırken, Audrey Tang önderliğinde bir başka grup da Haskell programlama dilini kullanarak Pugs adında bir Perl 6 derleyici/yorumlayıcısının yapımına başlamıştır.
Yıllar ardı ardına geçerken Perl 6 ortalarda gözükmemektedir. Bu durum, Perl 6'nın vaporware yani buhar yazılım olarak adlandırılmasına ve diğer dinamik dillerin toplulukları arasında dalga konusu olmasına neden olur. Python artık iyice yaygınlaşmış, hem sistem yöneticileri arasında tercih edilmeye başlanmış hem de Linux camiasının bir numaralı yazılım geliştirme dili haline gelmiştir. Yine Ruby, Jon Orwant Python'a daha "Perl'ümsü" bir alternatif olarak kullanılmaya başlanmış, özellikle de web geliştirme konusunda ismi PHP ile birlikte en çok anılan dil konumuna gelmiştir.
2009 yılına gelindiğinde tabloya bakacak olursak, Pugs'ın gelişimi pek de aktif değil iken, Parrot sanal makinesi mart ayında 1.0 kararlı sürümünü yayınlamıştır. Perl 6'nın Parrot üzerinde çalışan gerçekleştirimi Rakudo ise Perl 6 standardının büyük bölümünü yerine getirecek seviyeye ulaşmıştır. Parrot ile Rakudo'nun geliştirme süreci aktif olarak sürmektedir. Larry Wall, başta Perl 6 konusunda geri planda kalacağını duyurmuş olsa da proje lideri konumunun yanında, Rakudo'nun kodlamasında da aktif bir görev almaktadır. Parrot/Rakudo ekibi her hafta telefon üzerinden yapılan toplantılarla bir araya gelerek Perl 6'nın gelişim sürecini değerlendirmektedir.
On seneye yaklaşan geliştirme süresi boyunca Perl 5'in gelişimi tamamen durdurulmamıştır. Sürekli olarak çıkan bakım sürümlerinin yanında Perl 6'ya ait birkaç önemli değişiklik Perl 6'nın çıkması beklenmeden Perl 5'e dahil edilmiştir ve günümüzde kullanılabilmektedir.
Bazı Değişiklikler ve Yenilikler
Perl 6 tasarlanırken dikkat edilecek ilk şey Perl'ün Perl olarak kalmasıydı. Yani bir programcının Perl kullanırken duyduğu his aynı kalmalıydı. Bunun yanında sözdizimi biraz daha temiz ve tutarlı yapılacaktı. İstisna idaresi (exception handling) gibi diğer dillerde kendini kanıtlamış kavramlar dile dahil edilecek, Perl'ün her zaman yapmaya çalıştığı gibi bu yeni özelliklerin kullanılıp kullanılmayacağı, kullanılırsa nasıl kullanılacağı gibi tercihler programcıya bırakılacaktı.
Şimdi, yeni Perl ile gelen değişikliklere örnek kodlar eşliğinde göz atacağız. Yazının bu kısmını okurken şunu aklınızda bulundurmanızı istiyoruz ki Perl 6 yüzlerce irili ufaklı özellik ile birlikte geliyor. Bizim yerimiz ise dar olduğundan dolayı ne tüm yeni özelliklere değinebileceğiz ne de değindiğimiz özellikleri tam anlamı ile işleyebileceğiz.
Ayrıca, Perl 6'nın standardı yavaş yavaş otursa da bazı alınmış olan kararlar sürekli olarak değişiyor, bu durumda da piyasada olan belgelerdeki bazı kodlar geçerliliğini yitiriyor. Buna bir de Perl 6 gerçekleştirimlerinin standardı henüz tam olarak geliştirmemiş olmaları eklenince bu yazıdaki bazı kodların denenemiyor olması sonucu kaçınılmaz oluyor. Yani yazının kalan kısmındaki amacımız sadece yeni Perl hakkında genel bir fikir edinmemizi sağlamak olacak. İlk olarak şu an için en geçerli Perl 6 gerçekleştirimi olan Rakudo'yu nasıl edinebileceğimizi görecek daha sonra da kodlar arasına dalacağız.
Perl 6'yı Edinmek
Perl 6'yı şu an itibariyle hem Linux hem MacOS hem de Windows işletim sistemleri üzerinde deneyebilirsiniz. Bunun için ilk olarak Parrot sanal makinesini daha sonra da Rakudo eklentisini kurmanız gerekiyor.
Parrot sanal makinesi sadece Perl 6 için değil, genel amaçlı olarak hazırlanan bir sanal makinedir. Perl topluluğunca geliştirilmesi bakımından Perl 6'nın geliştirilmesine esas önemin verilmesinin yanında şimdiden Python, Ruby, PHP, Tcl hatta C gibi dillerin de bu sanal makine üzerinde çalıştırılabilmesi için başlatılan çalışmalar sürmektedir. Bir başka dilin Parrot üzerinde çalışabilmesi için, bir kişinin o dil için Parrot bytecode'u üreten bir derleyici yazması yeterlidir. Rakudo da Parrot için geliştirilen bir Perl 6 derleyicisidir.
Linux Üzerinde Parrot ve Rakudo Kurulumu
Maalesef Parrot ve Rakudo projesi henüz geliştirilme aşamasında olduğundan paket yöneticileri kullanıcılara genellikle güncel sürümün bir paketini sunmuyorlar. Bu yüzden en iyi seçenek kaynak kodları kendimizin derlemesi. Aşağıda, Perl 6'yı bir Linux'ta kurmak için izlemeniz gereken adımları bulacaksınız.
- Aşağıdaki adrese girin: http://www.parrot.org/download ve "Current supported release" bağlantısına tıklayarak karşınıza çıkan tar.gz uzantılı dosyayı çekin.
- Çektiğiniz dosyayı bir klasöre açın.
- Bir terminal açarak az önce açtığınız dosyanın içinden çıkan klasöre gidin ve aşağıdaki komutu girin: perl Configure.pl
- Daha sonra aşağıdaki komutu girin: make
- Son olarak da yönetici haklarına sahip iken aşağıdaki komutu girin: make install
- Parrot kurulumu tamamlandı, şimdi sıra Rakudo'da. Rakudo'yu çekmek için aşağıdaki adrese gidin: http://github.com/rakudo/rakudo/tree/master ve "Download" bağlantısına tıklayın. Çıkan ekranda .tar uzantısını seçin.
- Çektiğiniz dosyayı bir klasöre açın.
- Bir terminal açarak az önce açtığınız dosyanın içinden çıkan klasöre gidin ve aşağıdaki komutu girin: perl Configure.pl genparrot
- Daha sonra aşağıdaki komutu girin: make
Kurulum bitti. Bulunduğunuz klasörün içinde "perl6" isimli ikili dosyasının bulunduğuna dikkat edin. Rakudo'da şimdilik maalesef make install komutunu uygulayamıyorsunuz. O yüzden terminal üzerinden bir betik çalıştıracağınızda perl6 ikili dosyasının bulunduğu klasörün içinde olmanız gerekiyor.
Windows Üzerinde Parrot ve Rakudo Kurulumu
Windows için Perl 6'yı kurmak şimdilik Linux'takinden daha kolay. Sadece gereken iki kurulum dosyasını çekip sırayla çalıştırmanız yeterli. Aşağıda Perl 6'yı bir Windows'ta kurmak için izlemeniz gereken adımları bulacaksınız.
- Aşağıdaki adrese gidin: http://www.parrot.org/download ve "Windows (Win32)" bağlantısına tıklayın.
- Karşınıza gelen tablonun "Package" sütununda "parrotwin32 setup" yazan dosyasının karşısındaki "Download" bağlantısına tıklayarak Parrot kurulum dosyasını indirin. Tarayıcınızda geriye giderek aynı sayfadan "parrotrakudo addon" adlı Rakudo kurulum paketini de indirin.
- Çektiğiniz dosyalardan ilk olarak Parrot kurulum dosyasını çalıştırarak Parrot sanal makinesini bilgisayarınıza kurduktan sonra Rakudo kurulum dosyasını çalıştırarak Perl 6'yı sisteminize kurun.
Betikleri Çalıştırmak
Aşağıda vereceğimiz bütün kod örnekleri tek başlarına çalışabilecek şekilde yazılmıştırlar. Bu örnek kodları .pl uzantılı bir metin dosyası olarak kaydettikten sonra Linux'ta:
./perl6 betik_ismi.pl
Windows'ta ise:
perl6 betik_ismi.pl
komutları ile çalıştırabilirsiniz.
Birçok Ufak Değişiklik
Sonunda kod yazmaya başlayabiliriz. En başta "Merhaba Dünya" programı Perl 6'da artık şu şekilde yazılıyor:
use v6;
say "Merhaba Dünya!";
# Çıktı: Merhaba Dünya!
İlk satır yorumlayıcıya kodun geri kalanının Perl 6 dilinde yazıldığını belirtiyor. Diğer satırda kullandığımız say() işlevi, Perl 5'te kullandığımız print() işlevine çok benzemekle birlikte, yazdırdığınız metinin sonuna otomatik olarak yeni satır karakteri koyuyor. Yorum satırları gördüğünüz gibi hala # karakteri ile başlıyor.
Yeni Perl'deki değişikliklere baktığımızda gözümüze çarpan ilk özelliklerden biri, bağlamsal olarak değişen sigil'lerin artık değişmemesi. Eskiden bir dizinin bir elemanını almak istediğimizde @ dizi sigil'i, skaler $ sigil'ine dönüşürdü. Artık bir dizi değişkeni ile herhangi bir işlem yaparken @ sigil'i her zaman aynı kalacak:
use v6;
my @dizi = ("Canol", "Necip", "Emre", "Zeliha");
say @dizi[1];
# Çıktı: Necip
Artık daha nesneye yönelik programlama yapmaya olanak veren Perl 6'da dizilerimizin eleman sayısını bulmak için elems() metodunu kullanabiliyoruz:
use v6;
my @dizi = ("Canol", "Necip", "Emre", "Zeliha");
say @dizi.elems;
# Çıktı: 4
Daha da nesne yönelimli bir kodlama yapmak istersek dizimizin eleman sayısı üzerinde say() metodunu kullanabiliyoruz:
use v6;
my @dizi = ("Canol", "Necip", "Emre", "Zeliha");
@dizi.elems.say;
# Çıktı: 4
Perl 6'da kırma/melez türleme (hybrid typing) kullanabiliyoruz. Mesela eniyileme amacı ile değişkenlerimizin veri tipini yorumlayıcıya söyleyebiliyoruz. Bu sayede dinamik türlemenin (dynamic typing) yanında durağan türlemenin de (static typing) avantajlarından faydalanabiliyoruz:
use v6;
# Değişken adından önce yazacağımız "Int" kelimesine dikkat.
my Int $sayi = 3;
$sayi.say;
# Çıktı: 3
Perl 6'da metinler artık ~ işleci ile birleştiriliyor. Türk kullanıcılar için biraz kötü bir durum zira ~ karakteri Türkçe klavyelerde pek iyi bir yerde bulunmuyor:
use v6;
my $parca_1 = "Birinci parça";
my $parca_2 = " ikinci parça.";
my $cumle = $parca_1 ~ $parca_2;
$cumle.say;
# Çıktı: Birinci parça ikinci parça.
Perl 6'da aralıklar (ranges) artık tembel hesaplama (lazy evaluation) özelliğine sahip. Yani sistem, ihtiyaç duymadığı sürece belirli bir aralıktaki bir elemanın değerini hesaplamıyor. Bu sayede sonsuza kadar uzanan diziler yaratabiliyoruz.
Aşağıdaki kodu denemeyiniz, zira tembel hesaplama özelliği henüz Rakudo Perl'de geliştirilmedi ve mevcut sürümü aşağıdaki kodu uygulayınca işlemciyi kilitliyordu. Yine de geliştirildiğinde nasıl birşey olacağına dair fikir vermesi açısından:
use v6;
my @aralik = 3 .. Inf;
@aralik[10].say;
# Çıktı: 13
Artık karşılaştırma işleçleri birbirlerine zincirleme bağlanılabiliyor (chained comparison):
use v6;
my $sayi = 3;
if (2 < $sayi < 4) {
say "Sayı 2 ile 4 arasında.";
}
# Çıktı: Sayı 2 ile 4 arasında.
Artık Perl yordamlarında diğer dillerde olduğu gibi parametre listesini yazabiliyoruz:
use v6;
sub selamla ($isim, $soyisim) {
say "Merhaba $isim $soyisim!";
}
selamla ("Canol", "Gökel");
# Çıktı: Merhaba Canol Gökel!
Perl 6'ya yukarıdaki gibi belki de yüzlerce irili ufaklı özellik eklenmiş durumda. Bu aylık yazımıza burada son verip gelecek ay yazının ikinci bölümünde Perl 6'ya eklenen daha büyük değişikliklere değinmeye çalışacağız.