← A–Z Röportajları

Scala

Scala: Martin Odersky

Scala, giderek daha popüler hale gelen Java Virtual Machine üzerinde çalışan daha yeni dillerden biridir. Martin Odersky bize Scala’nın tarihini, geleceğini ve onu bu kadar ilginç kılan şeyleri anlatıyor.

Dile neden Scala adını verdiniz?

Ölçeklenebilir dil anlamına geliyor; yani çok küçük başlayıp çok ileriye götürebilirsiniz. Yeni gelenler için biraz betik dili gibi görünüyor. Son iki yıldır aslında Java betik dilleri yarışması olan JavaOne ScriptBowl’a katılmamız için davet edildik.

Ama Scala aslında bir betik dili değil – bu onun temel özelliği değil. Aslında Java’nın ifade edebildiği her şeyi ifade edebiliyor ve büyük sistemler için Java’nın yeteneklerinin ötesine geçen pek çok şey sunabildiğine inanıyorum.

Tasarım ölçütlerinden biri, çok küçük programlardan devasa sistemlere kadar her şey için yararlı olabilecek ve bu süreçte yapıyı değiştirme ihtiyacı doğurmayan bir dil geliştirmek istememizdi.

Scala’yı geliştirmenize ne yol açtı?

90’larda Java dilinin ve derleyicisinin geliştirilmesine dahil oldum. Başka bir araştırmacı olan Philip Wadler ile bir araya geldik ve sonunda Generic Java’ya (GJ), ardından Java sürüm 5’e giden Pizza’yı geliştirdik. Bu süreçte javac derleyicisini yazma fırsatım oldu. Bizim genişletmemiz olan GJ için derleyici, Sun GJ dil yapılarını Java’ya dahil etmeye karar vermeden çok önce bir standart olarak benimsendi – önce derleyiciyi aldılar.

10 yıl önce İsviçre’ye taşındığımda daha temel konular üzerinde çalışmaya başladım. İşlevsel ve nesne yönelimli programlamayı faydalı bir şekilde birleştirip birleştiremeyeceğimizi görmek için bazı araştırma deneyleri yaptım. Bunu 95/96’da Pizza ile denemiştik ama o sadece yarı başarılı olmuştu, çünkü o dönemde temel dil olarak Java’yı kullanmamızdan kaynaklanan pek çok pürüz vardı. Java o kadar şekillendirilebilir değildi. Bu yüzden 2000 civarında, EPFL’deki (École Polytechnique Fédérale de Lausanne) grubumla birlikte, Java ile birlikte çalışmaya devam edecek ama nesne yönelimli ve işlevsel programlama tekniklerini faydalı biçimde birleştirecek yeni diller geliştirdim.

Bunların ilki Funnel, ikincisi ise Scala olarak adlandırıldı. İkinci deney oldukça iyi sonuç verdi, bu yüzden deneysel aşamayı toparlayıp Scala’yı insanların güvenebileceği gerçek bir üretim dili haline getirmeye karar verdik. Bazı pürüzleri giderdik, küçük sözdizimi değişiklikleri yaptık, Scala araçlarını Scala’da yeniden yazdık; böylece dilin ve araçlarının yoğun kullanımı kaldırabildiğinden emin olduk. Ardından 2006’da Scala sürüm 2’yi yayımladık. O zamandan beri hızla popülerlik kazanıyor.

Nesne yönelimli ve işlevsel programlama tekniklerini birleştirmenin başlıca faydaları nelerdir?

İkisi de masaya çok şey getiriyor. İşlevsel programlama, güçlü birleştiriciler sağladığı için basit parçalardan ilginç şeyler kurmanıza olanak tanır – programınızdaki öğeleri alıp onları başka öğelerle ilginç şekillerde birleştiren fonksiyonlar. İşlevsel programlamanın buna bağlı bir başka faydası da fonksiyonlara veri gibi davranabilmenizdir.

Neredeyse tüm programlama dillerinde tipik bir veri tipi inttir: bir int değerini herhangi bir yerde, bir fonksiyonun içinde bile tanımlayabilir, bir fonksiyona aktarabilir, bir fonksiyondan döndürebilir veya bir alanda saklayabilirsiniz. İşlevsel bir dilde, fonksiyonlarla da aynı şeyi yapabilirsiniz: onları başka fonksiyonların içinde tanımlayabilir, fonksiyonlara aktarabilir veya fonksiyonlardan döndürebilir ya da alanlarda saklayabilirsiniz. Bu özellikler, kendi kontrol yapılarını kurmak, gerçekten üst düzey kütüphaneler tanımlamak veya yeni alan özgü diller tanımlamak için güçlü bir yol sunar.

Nesne yönelimli programlama ise sistem bileşenlerinizi yapılandırmak ve karmaşık sistemleri genişletmek ya da uyarlamak için harika yollar sunar. Kalıtım ve bileşim, ad alanlarınızı kurmak ve düzenlemek için esnek yöntemler sağlar. IDE’lerde (Tümleşik Geliştirme Ortamları) bağlam yardımı gibi, belirli bir noktada çağırabileceğiniz tüm metotları açılır menülerle gösteren iyi araç desteği vardır.

Zorluk, bunları iki dilin yan yana çalıştığı hissini vermeden, tek bir dil içinde birleştirmekti.

Sanırım bu zorluğun en önemli kısmı neleri dışarıda bırakacağınıza karar vermekti?

Evet, her iki dil stilini de bütünüyle alıp birleştirirseniz, çok fazla tekrar ortaya çıkar ve aralarında çok az etkileşim olan iki alt dil elde edersiniz. Zorluk, bir taraftaki yapıları diğer taraftaki yapılarla eşleştirmekti.

Örneğin, işlevsel bir programlama dilindeki bir fonksiyon değeri, nesne yönelimli bir dilde bir nesneye karşılık gelir. Temel olarak, apply metoduna sahip bir nesne olduğunu söyleyebilirsiniz. Dolayısıyla fonksiyon değerlerini nesneler olarak modelleyebiliriz.

Bir başka örnek, işlevsel dillerdeki cebirsel veri tiplerinin, nesne yönelimli tarafta sınıf hiyerarşileri olarak modellenebilmesidir. Ayrıca Java’da bulunan statik alanlar ve metotlar. Bunları ortadan kaldırdık ve bunun yerine tekil nesnelerin üyeleriyle modelledik. Bunun gibi, bir dil yapısını başka bir şeyle eşleştirip birleştirerek ortadan kaldırmaya çalıştığımız pek çok durum var.

Scala’yı geliştirirken karşılaştığınız en büyük genel zorluk neydi?

Derleyici teknolojisini geliştirmek kesinlikle bir zorluktu. İlginç bir şekilde, zorluklar daha çok nesne yönelimli taraftaydı. Gelişmiş statik tip sistemlerine sahip nesne yönelimli dillerin oldukça nadir olduğu ve hiçbirinin ana akım olmadığı ortaya çıktı. Scala, Java veya benzeri dillere kıyasla çok daha ifade gücü yüksek bir tip sistemine sahip, bu yüzden bileşen bileşimi için bazı yeni tip kavramları ve programlama soyutlamaları geliştirerek yeni alanlar açmak zorunda kaldık. Bu da epeyce yoğun çalışma ve bazı yeni araştırma sonuçları doğurdu.

Diğer zor kısım birlikte çalışabilirlikti. Çok yüksek düzeyde birlikte çalışabilirlik istiyorduk, bu yüzden Java’daki her şeyi Scala’ya eşlemek zorundaydık. Java kütüphanelerinin devasa gövdesini sadakatle eşlemek istemekle, aynı zamanda Java dilinin tüm yapılarını kopyalamaktan kaçınmak arasında her zaman bir gerilim vardır. Bu, sürekli ve zorlu bir mühendislik problemi oldu. Genel olarak sonuçtan oldukça memnunum, ancak çok fazla emek gerektirdi.

Forumlarda Scala’nın verimliliği ve ölçeklenebilirliği hakkında pek çok olumlu yorum var, ancak insanların sıkça bahsettiği bir başka şey de kullanmasının çok eğlenceli olması. Bu da dili tasarlarken hedeflerinizden biri miydi?

Kesinlikle. İş arkadaşlarım ve ben çok fazla kod yazıyoruz, bu yüzden programlaması keyif veren bir şey istedik. Bu çok net bir hedefti. Geleneksel, yüksek protokollü dillerin mümkün olduğunca çok büyülü ifadesini ortadan kaldırmak ve geliştiricilerin istedikleri şekilde modelleme yapabilmeleri için Scala’ya büyük bir ifade gücü kazandırmak istedik.

javac yazarken çok fazla Java programlaması yaptım ve Java programcılarının ne kadar çok boşa iş yaptığını fark ettim. Scala’da eşdeğer programlar için genellikle satır sayısında iki ila üç kat azalma görüyoruz. Pek çok kalıp kod basitçe gereksiz. Üstelik yazması da çok daha eğlenceli.

Bu, geliştiricilere sunduğumuz çok güçlü bir araç, ancak iki yüzü var. Onlara büyük bir özgürlük veriyor ama bununla birlikte yanlış kullanımdan kaçınma sorumluluğu da geliyor. Felsefi olarak, bunun Scala ile Java arasındaki en büyük fark olduğunu düşünüyorum. Java, oldukça kısıtlayıcı bir kavramlar kümesine sahip; bu da her Java programının diğerlerine biraz benzemesine yol açıyor ve bunun programcıları yer değiştirmeyi kolaylaştırdığı iddia ediliyor. Scala için böyle bir tekdüzelik yok, çünkü çok ifade gücü yüksek bir programlama dili.

Scala programlarını birkaç farklı şekilde ifade edebilirsiniz. Java’dan gelen programcılar için hoş olan, onları Java programlarına çok benzeyen biçimde yazabilirsiniz. Bu, programlama ekiplerinin Scala’ya geçişini çok kolaylaştırır ve proje risklerini düşük tutar. Önce kritik olmayan bir parçayla başlayıp, kendileri için doğru olduğunu düşündükleri hızda genişletebilirler.

Ama Scala programlarını tamamen işlevsel bir tarzda da ifade edebilirsiniz ve bu programlar tipik Java programlarından oldukça farklı görünebilir. Çoğu zaman çok daha kısadır.

Bunun size sağladığı fayda, kendi deyimlerinizi yüksek seviyeli kütüphaneler veya Scala içine gömülü alan-özgü diller olarak geliştirebilmenizdir. Geleneksel olarak aynı etkiyi elde etmek için birkaç farklı dili veya yapılandırma gösterimini bir arada kullanmanız gerekirdi. Dolayısıyla sonuçta Scala’nın tek dil yaklaşımı çok daha basit çözümlere yol açabilir.

Scala kullanmak isteyen bir Java geliştiricisi için öğrenme eğrisi oldukça küçük olurdu, peki PHP, Python ve Ruby gibi dinamik disiplinlere sahip dinamik dillerle çalışmaya alışkın programcılar için kullanımı ne kadar kolay olurdu?

Açıkça söylemek gerekirse Scala’yı öğrenmesi en kolay olanlar Java veya .NET geliştiricileridir. Diğer topluluklar için takılma noktaları, dilin kendisinden çok, onu nasıl paketlediğimiz ve araçların nasıl yapılandırıldığıyla ilgilidir; bunlar da Java’ya özgüdür. Bu şeylerin nasıl kurulduğunu öğrendiklerinde, dilin kendisini öğrenmek zor olmamalıdır.

Twitter’ın Scala kullanması hakkında ne düşünüyorsunuz? Bu kadar yüksek profilli bir sitenin kullanması, dilin gelişimi açısından iyi mi?

Bu harika bir haberdi. Scala’ya yönelmelerinden ve bunun onlar için iyi sonuç vermesinden memnunum. Twitter olağanüstü bir büyümeyi sürdürebildi ve geçişten önce sahip olduklarına kıyasla daha fazla kararlılıkla bunu başardıkları görülüyor; bu nedenle bunun Scala için iyi bir kanıt olduğunu düşünüyorum.

Twitter gibi yüksek profilli bir sitenin yeni bir dili benimsemesi, o dil için gerçek bir turnusol testidir. O dilde büyük sorunlar olsaydı, muhtemelen oldukça hızlı bir şekilde ortaya çıkar ve belirgin biçimde vurgulanırdı.

Scala’yı benimseyen başka birçok tanınmış şirket de var. Sony Pictures Imageworks, orta katman yazılımlarını yazmak için Scala kullanıyor ve Avrupa’nın en büyük enerji şirketi EDF, ticaret kolunda sözleşme modellemesi için Scala’dan yararlanıyor. SAP ve Siemens, açık kaynaklı Enterprise Social Messaging Experiment (ESME) araçlarında Scala kullanıyor. Bunlar, çok sayıdaki örnekten sadece üçü.

Twitter’ın geliştiricilerinden biri olan Alex Payne, Scala’nın modern web girişimi için tercih edilen dil olabileceğini ve çok popüler olmuş ancak Scala kadar verimli olmayan Python ve Ruby gibi dillerin yerine seçilebileceğini söylüyordu. Buna katılıyor musunuz ve Scala’yı geliştirirken Web 2.0 girişimlerini aklınızda tuttunuz mu?

Bence Scala bu alanda anlamlı bir seçim. Twitter bunu fark eden tek şirket değil; LinkedIn de Scala kullanıyor.

Scala’nın burada sunduğu şey, çevik bir dil kullanmaya devam ederken sağlam ve yüksek performanslı bir platform olan Java Virtual Machine (JVM) üzerinde inşa edebilme yeteneğidir. Bu kategoriye giren Jython, JRuby, Groovy veya Clojure gibi başka seçenekler de var, ancak bunların hepsi JVM üzerinde çalışan dinamik tipli dillerdir.

Sonuçta soru, statik tipli bir ortamda mı daha rahat olduğunuz noktasına dayanıyor; bunun nedeni hataların çoğunu erken yakalaması, yeniden düzenlemeler için bir güvenlik ağı sağlaması ya da performansa yardımcı olması olabilir. Ya da metaprogramlama ile karmaşık şeyler yapmak istediğiniz için tamamen dinamik bir dile ihtiyaç duyduğunuzu düşünebilirsiniz. Nihayetinde mesele bu tercihe dayanıyor. Statik tipli bir dili tercih ediyorsanız, bence Scala bugün kesinlikle en iyi seçenektir.

Birini seçmek zorunda kalsaydınız, dilin en sevdiğiniz özelliği hangisi olurdu?

Tek bir favori özellik söyleyebileceğimi sanmıyorum. Bunun yerine Scala’nın özelliklerinin birbiriyle nasıl uyum içinde çalıştığını seçerdim. Örneğin, yüksek dereceli fonksiyonların nesneler ve soyut tiplerle nasıl harmanlandığı ya da Scala’daki fonksiyonların alt sınıflanabilmesi sayesinde aktörlerin nasıl mümkün olduğu. Scala’daki en ilginç tasarım kalıpları, tam olarak nesne yönelimli ve fonksiyonel programlama fikirleri arasındaki etkileşimden doğuyor.

Scala’nın gelecekte nereye doğru gittiğini görüyorsunuz?

Kısa vadede, şu anda bir sonraki sürüm olan Scala 2.8 üzerinde yoğun şekilde çalışıyoruz; burada yüksek performanslı dizi işlemleri ve hızlı kalıcı veri yapılarına sahip yeniden tanımlanmış koleksiyon kütüphaneleri gibi konulara odaklanıyoruz. Bunun bu yılın sonbaharına doğru çıkması gerekiyor.

Uzun vadede ise eşzamanlılık ve paralellik etrafında ilginç fırsatlar görüyoruz; bu nedenle çok çekirdekli işlemcileri ve diğer paralel sistemleri programlamak için yeni yollar araştırıyoruz. Burada zaten bir avantaja sahibiz, çünkü Scala’nın eşzamanlılığı yüksek seviyede ifade etmenizi sağlayan popüler bir aktör sistemi var. Bu, örneğin Twitter’ın mesaj kuyruklarında kullanılıyor.

İlginç olan şu ki, Scala’daki aktörler bir dil özelliği değildir; tamamen bir Scala kütüphanesi olarak gerçekleştirilmiştir. Bu nedenle Scala’nın esnekliğine iyi bir örnektir: doğru türde ilkel yapıları ve soyutlamaları bir kütüphane içinde sunarak, uygulama programcılarına dil özelliği gibi görünen şeyler programlayabilirsiniz.

Aktörler için işe yarayan şeyin, veri paralelliği ve akış programlama gibi diğer eşzamanlı soyutlamalar için de işe yaramasını umuyoruz. Bence gelecekte çok çekirdekli sistemlerden gerçekten yararlanabilmek için muhtemelen birden fazla eşzamanlılık soyutlamasına ihtiyaç duyacağız; çünkü paralellik ve eşzamanlılığın farklı profilleri farklı araçlar gerektirecek. Scala’nın kütüphane tabanlı yaklaşımının burada önemli olduğunu düşünüyorum; çünkü bu yaklaşım, Scala sınıfları ve nesneleri olarak uygulanmış kavramları birleştirip eşleştirmemize olanak tanıyor ve böylece her şeyi dile ve derleyiciye koymak zorunda kalmadan hızlı bir şekilde ilerleyebiliyoruz. Bence bu çalışma bizi önümüzdeki dört ya da beş yıl boyunca meşgul edecek.