Bu ay yayınlanan SUDO dergisinde yazdığım Vala yazısı:
Uzun süredir yazmayı düşündüğüm bir Vala Programlama Dili yazısı var. Belki 4 belki 5 defa giriş yazısı yazdım ama sanırım kuruntularımdan dolayı sildim. Son yazdığım yazı ise temelli bir göç sebebiyle bilgisayarın tarafımdan şamar oğlana dönmesi sonucu arada kaybolup gitti
Bu nedenle beni bu denli kasan bu konuyu doğaçlama yazacağım. Teknik terimler konusunda bir yanlışlık olduğunu düşünürseniz lütfen forum başlığında belirtiniz.
Vala dilinin geçmişi çok uzun sayılmaz. Bu programın ortaya çıkış sebeblerinin başında Gnu/Linux sistemlerinde gtk ile program yazılmasının C ile yazılması veya yorumlanabilir diller ile yazılması zorunlu olmasındandır. C güçlü alt yapısından dolayı görsel araçlarda kullanılması pek zor olan bir dildir. Zira çok zaman alır ve çok fazla kod satırı gerektirir. Oysa aynı işi 3. nesil dillerle yazmak çok daha kolaydır. Ancak bu 3. nesil dillerde C ile karşılaştırıldığında bellek ve işlemci konusunda çok cömert davranırlar. Diğer bir sebep ise gtk ile hem güçlü hem de hızlı bir şekilde görsel program geliştiren en iyi aracın mono olmasıdır. Mono hem sisteme yüklediği ek paketlerden dolayı ve hem de Microsoft’un C# kökeninden türemesinden dolayı özgür yazılımcılar tarafından pek benimsenmemiştir.
Bu sebeplerden dolayı özgür yazılımcılar ve özellikle gnome ve gtk ile program geliştirenler için C# kadar esnek bir dil gereksinimi doğmuştur. Elbette ki bu dil sadece bir alternatif olarak değil bir gereklilik olarak sunulduğunda farkını ortaya koyacaktır. Bu farklılığı da Vala geliştiricileri, sisteme ek yük bindirmeme yolunu seçerek ortaya koymuşlardır. Vala ile yazılan bir program sistemde C ile yazılan bir gtk programından fazla bir yük bindirmez. Siz vala ile yazılan bir programı kurmak için hiçbir zaman vala paketlerini kurmak zorunda kalmazsınız. Vala bir tek paket derlemek için gereklidir ki bu da son kullanıcı için gerekli değildir. Hatta vala ile program geliştiren yazılımcılar kaynak kodları C şeklinde sundukları için derlemek için dahi Vala’ya ihtiyaç duyulmaz.
Belirttiğim gibi Vala ile yazılan bir program vala derleyicisi ile aslında C kodlarına çevrilir. Yani esasında yazılan program yeni bir dil olan Vala ile değil C ile yazılıp derlenir. Bu durum programcılara hem zamandan hem de performanstan kazanç sağlar. Bu avantajından dolayıdır ki son zamanlarda geliştirilen neredeyse tüm gtk/gnome araçları vala ile yazılır.
Kodlama kısmına ufak bir giriş yapmadan önce Vala ile yazılan gözde programları yazmak güzel bir izlenim bırakacaktır diye düşünüyorum.
Unity: Ubuntu’nun ses getiren gnome çatısı vala ile yazılmıştır. Son zamanlarda Ubuntu geliştiricileri python yerine daha çok vala kullanmaya yönelmişlerdir. Elbette ki python ile yine bir çok araç geliştiriliyor ancak gün geçtikçe yeni geliştirilen araçlar vala ile yazılmaya başlanıyor. Tabii burada programın amacı da etkili oluyordur. Yine de performans gerektiren bir uygulama için vala çok daha uygun bir dil olarak öne çıkıyor.
Globalmenu: Yine Unity ile paralel zamanlarda geliştirilen bu araçta vala ile yazılmıştır.
Shotwell: Vazgeçilmez fotoğraf düzenleyicisi.
Peynir: Her sistemde olması gereken kamera etkileşimli program.
Deja Dup: Mükemmel bir yedekleme yazılımı.
elementaryOs ve Paldo Linux geliştiricileri. Bu dağıtımların geliştiricileri de özel araçları için vala dilini kullanıyor.
Elbette sayması uzun bir listemiz var ancak bu yazılımlar bile vala dilinin gücünü gösterir nitelikte.
Şimdi ilk programımızı yazabiliriz.
int main () {
stdout.printf(“Merhaba Dünya”);
return 0;
}
Gördüğünüz gibi bir kaç satır kod ile ekrana “merhaba dünya” yazdırdık. Şimdi bu kodları a.vala(vala uzantılı olmalı) olarak bir dizine kaydedin ve terminalden o dizine gidip
valac a.vala
komutunu verin. Bu komutla birlikte aynı dizinde a adındaki dosyayı “./a” komutu ile çalıştırın. Terminalde yazıyı göreceksiniz. Unutmadan valac komutu için depodan vala paketini kurmalısınız
Bu komutlar elbette ki C veya C++ kullanıcıları için yabancı değil ancak diğerleri için açıklamak gerekirse “int main()” ile ana fonskiyonumuzu tanımlıyoruz. Bu, programın bu kısımdan başlayacağına işaret eder. “stdout.printf” komutu ise ekrana yazdırma komutudur ve “return 0″ komutu ise programdan çıkılmasını sağlar. return komutunu bu konu içinde detaylıca açıklamay gerek olmadığını düşünüyorum.
Yine bu komutların C kodlarına nasıl dönüştürüldüğünü görmek için “-C” parametresiyle derleyin(aslında bu parametre ile derleme yapmaz, sadece C koduna çevirir). Eğer kodlarınızda kütüphane var ise ve bunun C kütüphanesine dönüştürülmesini istiyorsanız “-H” parametresini kullanabilirsiniz. C diline çevrilen kodlar gözünüzü korkutmasın. Vala dönüşüm yaptırdığı için çok karmaşık ve çok fazla komut oluşturur. Ancak ne kadar basit uygulama olursa olsun glib kütüphanesini kullanır zira gücünü bu kütüphaneden alır.
Basit bir Gtk uygulamasını Vala ile yazıp derleyelim.
using Gtk;
int main (string[] args) {
Gtk.init (ref args);
var window = new Window ();
window.title = “İlk Gtk+ programımız”;
window.border_width = 10;
window.window_position = WindowPosition.CENTER;
window.set_default_size (350, 70);
window.destroy.connect (Gtk.main_quit);
var button = new Button.with_label (“Tıkla!”);
button.clicked.connect (() => {
button.label = “Teşekkürler”;
});
window.add (button);
window.show_all ();
Gtk.main ();
return 0;
}
Bu kodları derlemek için;
valac a.vala –pkg gtk+-3.0
komutu kullanılır. Elbette ki bu gtk3 içindir. Bu programda gtk2 veya gtk3 için bir fark yoktur. Ancak derlemeden önce bilmeniz gereken ise gtk ile program geliştirmek için gtk-devel paket(ler)ini kurmanızdır. Aynı şekilde aynı dizin içerisindeki a dosyasını “./a” komutu ile çalıştırabilirsiniz. Dikkat ettiyseniz eğer using Gtk satırını ekledik. Bu satır ile sisteme gtk kütüphanesinin kullanılacağını belirtmiş oluyoruz. Eğer kendi yazdığınız bir vala veya C kütüphanesini kullanacaksanız aynı şekilde –pkg parametresinden sonra ismini yazarak kullanabilirsiniz.
Gtk.init satırı her gtk uygulaması için gereklidir. Diğer satırları basitçe açıklamak gerekirse. Kullanacağınız her gtk nesnesini bir değişken olarak tanımlamalısınız. “var window = new Window();” satırı ile window adında bir Window nesnesi tanımlamış olduk. Tanımlamış olduğumuz bir Window nesnesinin özelliklerini bu window değişkenini kullanarak belirteceğiz.
window.title: Pencere başlığını,
window.border_width: Pencere kenarlarının genişliğini,
.window_position: Ekrandaki konumunu,
.set_default_size: Varsayılan ebatlarını,
.destroy.connect: Kapatma düğmesine tıklandığında işletilecek fonksiyonunu değiştirebilmemize/düzenlememize imkan verir.
var button = new Button.with_label (“Tıkla!”); bu satırda ise bir buton tanımladık ve tanımladıktan sonra bir özelliğini de değiştirdik. with eki ilk tanımlama da kullanılan bir komut. Değişkeni bir defa tanımladıktan sonra farklı bir yerde herhangi bir özelliğini değiştirmek için .with komutuna gerek yoktur.
button.clicked.connect (() => {
button.label = “Teşekkürler”;
});
Buradaki komutlar ise tanımladığımız button nesnesinin “clicked” olayından “connect” metodunu çağırıyor. Bu olaylar ile tanımlanmış bir fonksiyon çağrılabileceği gibi örnekte gösterilen şekilde aynı yerde de bir fonksiyon oluşturulup çalıştırılabilir.
“window.add(button);” bu komut gtk için gerekli bir komuttur. Window nesnesi gtk’da kullanılan neredeyse tüm nesnelerin atası gibidir. Bu nedenle tüm nesneleri bu komut pencereye yerleştirmeliyiz. Ve tabii ki “window.show_all();” komutu ile de tanımladığımız pencereyi de ekranda gösteriyoruz.
Basit olarak yaptığımız bu programı derleyip çalıştırdığımızda ekranda bir düğme(buton) barındıran bir pencere olacak. Buton üzerine tıkladığımızda “Tıkla” yerine “Teşekkürler” yazacak. Şimdilik Vala yazısını burada sonlandıralım. Sonlandırırken ufaktan Genie’den de bahsedelim
Genie:
Vala esasında bir yorumlayıcı. Vala uzantısı ile yazılan kodları C kodlarına çeviriyor. Vala şekil olarak C# diline yakındır ve aslında amacı da Gtk için C#(mono) kadar gelişmiş bir dil ortaya çıkarmaktır. Ancak yazım dilini her ne kadar diğer nesne yönelimli dillere benzetse de asıl yaptığı iş bu kodları C diline çevirmek. Eğer bu kodları C diline çevirebiliyorsa yazımı çok daha basit olan pythonvari komutları neden C diline çeviremesin? Sanırım geliştiricilerde kendilerine bu soruyu sormuş olmalılar ki pythonvari bir dil olan Genie’yi de geliştirmişler. Fazladan hiçbir gereksinimi yoktur. Sadece kodları derlemek için vala ihtiyacı vardır. Valadan farklı olarak bu dosyayı “gs” uzantısı ile kaydediyoruz. Bu uzantı sayesinde vala derleyicisi bu kodların bir genie kodu olduğunu algılar ve ona göre derleme yapar. Henüz pek fazla belge yok ancak elimizde python gibi yazım dili basit C kadar performanslı bir dil var. Makine diline çevrildiği ve C kütüphanelerinden başkada bir gereksinimi olmadığı için bu dilde sisteme ek yük bindirmez.
Ufak bir program yazalım;
init
print “merhaba”
Bu kodları a.gs olarak kaydedip aynı dizinde “valac a.gs” komutunu verip “./a” komutu ile de çalıştırabilirsiniz. Gördüğünüz gibi çok basit tıpkı python gibi. init C dilindeki main fonksiyonu görevini yürütür ve varsayılan olarak fonksiyon içerisindeki kodlar init komutunun başlangıç noktasından bir tab aralıkla başlar(8 karakter boşluk). Ancak eğer programın en başında “[indent=2]” gibi bir komut eklenmişse satır boşluğu olarak 2 karakter boşluk bırakılır. Bu açıklamayı python kullanıcıları daha iyi anlayacaktır.
Not: Bu yazıdan python dilinin iyi olmadığı anlaşılmamalı. Python yorumlanabilir bir dil olduğundan bir çok yerde derlenebilir dillerden çok daha esnek ve çok daha gereklidir. Zira yorumlanabilir bir dil derlenme zorunluluğu olmadığından yapılan değişikliği anında yansıtır. Oysa derlenebilir diller ise zorunlu olarak tekrar derlenmelidir. Bu nedenle bir çok uygulama eklentiler için python ve ruby gibi dillerden büyük destek alır.