Neden Scala?

Merhabalar! Bu yazımda Scala’nın onu tercih sebebiniz olabilecek birkaç avantajından bahsetmek istiyorum. Merhaba Scala! yazımda ve Kim? sayfamda biraz bahsettiğim gibi Linovi’de çalışıyorum ve Scala’yı öğrenmeye/kullanmaya burada başladım. Scala ile ilgili şirketimin tercihleri ve benim kişisel görüşlerimi göz önünde bulundurarak birkaç başlık halinde anlatacağım.

Java ile Yakın İlişki

Java en yaygın programlama dillerinden bir tanesi. Java ile yapılabilecekler gerçekten oldukça fazla. Çok çeşitli ortamlarda da çalışabiliyor. Haliyle Java ile yazılmış dünya kadar kütüphane, araç ve çözüm var. Ancak eğer siz bir şekilde Java ile geliştirme yapmıyorsanız, geliştirdiğiniz dilden başka bir dilde yazılmış bir kodu kullanmak ya ek çaba gerektirecektir ya da mümkün değildir. Scala ile geliştirme yapacak olursanız böyle bir sorunla karşılaşmazsınız. Scala da tıpkı Java gibi JVM üzerinde çalışır. Scala kodunuzla birlikte Java kodu yazabilir, Scala kodunuzda Java kütüphanelerini doğrudan kullanabilir ve Java’yı çalıştırabildiğiniz bir ortamda Scala’yı da çalıştırabilirsiniz. Gördüğünüz gibi, bir nedenden dolayı Java’yı değil başka bir dili tercih etmek durumundaysanız, Scala’nın Java ile bu yakın ilişkisi sizin için avantajlı olabilir. Şirketimin Scala tercihinde de Java ile olan bu ilişki önemli bir etken. Örneğin yoğun olarak kullandığımız Amazon’un AWS (Amazon Web Services) isimli bulut (cloud) hizmetleri için hazırlanmış arayüzler ve kütüphaneler Java ile yazılmış durumda ve biz Scala kodumuzla birlikte sorunsuzca kullanabiliyoruz.

Yüksek Performanslı, Eşzamanlı İşler

Scala ile Akka teknolojilerini kullanarak eşzamanlı (concurrent), dağıtık (distributed) ve yüksek performanslı sistemler geliştirebilirsiniz. Evet, Akka teknolojilerini Java’da ve başka dillerde de kullanabiliyorsunuz ama bu teknolojileri Scala ile de sorunsuzca kullanabilmek yine bir avantaj. Hatta Scala’nın (fonksiyonel programlama gibi) farklı yetenekleriyle de birleşince bu teknolojileri Scala ile kullanmak daha kolay ve etkili olabiliyor. Linovi’de Akka’nın aktörlerini Scala ile kullanıyoruz.

Fonksiyonel Programlama

Scala birden fazla programlama paradigmasını/modelini destekleyecek şekilde geliştirilmiş. Nesne yönelimli programlama modelini tıpkı Java’daki veya başka bir nesne yönelimli programlama destekleyen dildeki gibi kullanabiliyorsunuz. Hatta bunun üzerine iyileştirmeler de yapılmış. Bunlara ek olarak Scala ile nesne yönelimli programlamadan oldukça farklı olan fonksiyonel programlama modelini de kullanabiliyorsunuz. Scala bu iki temel programlama modellerini başarılı şekilde harmanlamış. Dilin size sunduğu birçok kütüphanede ve arayüzde fonksiyonel programlama özellikleri ve tekniklerinden yararlanılmış. Hatta – daha önce bahsetmiştim – Scala birçok yerde sizi fonksiyonel programlama yapmaya teşvik ediyor. İlerleyen yazılarımda Scala ile daha çok kodlama yaptıkça bunun detaylarına ineceğim.

Kısa ve Öz Sözdizimi

Bu yazıyı okuyorsanız muhtemelen Scala dışında bir dil kullanıyorsunuzdur. Hatta o dilin Java olma ihtimali de oldukça yüksek. 🙂 Java ile geliştirme yapmışsanız bilirsiniz ki bazen basit bir iş için bile çok fazla kod yazarız. Benzer şeyleri tekrar tekrar yazarız ve yaptığımız işler büyüdükçe bu durum biraz can sıkmaya başlar. Scala geliştirilirken, bu gibi can sıkıcı durumlardan kurtulmak için birçok noktada neyin gerçekten gerekli olduğu, neyin ise aslında gereksiz olduğu ve atılabileceği üzerinde düşünülmüş. Örnek olması için; bir İnsan sınıfı tanımlayan, 10 tane rastgele yaşlara sahip insan oluşturan, bunları listeleyen ve sonra yaşlarının toplamını gösteren bir kod yazdım. Aşağıda aynı kodun birbirine denk Java ve Scala ile yazılmış hallerini görebilirsiniz.

Java


class Insan {
private int yas;
public Insan(int yas) {
this.yas = yas;
}
public int yas() {
return yas;
}
@Override public String toString() {
return "Insan(" + yas + ")";
}
}
class NedenScala {
public static void main(String[] args) {
Random rastgele = new Random();
Insan[] insanlar = new Insan[10];
for (int i = 0; i < 10; i++) {
insanlar[i] = new Insan(rastgele.nextInt(30) + 5);
}
System.out.println("İnsanlar:");
for (Insan insan : insanlar) {
System.out.println(insan);
}
System.out.println("Yaşları toplamı:");
int toplam = 0;
for (Insan insan : insanlar) {
toplam += insan.yas();
}
System.out.println(toplam);
}
}

view raw

NedenScala.java

hosted with ❤ by GitHub

Scala


case class Insan(yas: Int)
object NedenScala {
def main(args: Array[String]) {
val insanlar = for (i <- 1 to 10) yield Insan(scala.util.Random.nextInt(30) + 5)
println("İnsanlar:")
insanlar foreach println
println("Yaşları toplamı:")
println(insanlar.foldLeft(0)(_ + _.yas))
}
}

Aradaki farkı görüyorsunuz. 🙂 Kodun Scala halinde ileride detaylıca bahsedeceğim (tür çıkarımı/tahmini [type inference], sadece döngü olmayan for’lar [for comprehension], koleksiyonlar [collections], fonksiyonel programlama [functional programming], parçalı fonksiyonlar [partial functions] gibi) birçok Scala özelliğini kullandım. Her ne kadar örnek olsun diye uydurduğum bir kod olsa da Java’da, da Scala’da da geliştirme yapmış biri olarak farkın gerçekten de bu boyutlara ulaştığını söyleyebilirim. Scala’yı tercih etmemdeki kişisel nedenlerden birisi de bu Scala’nın bu öz (concise) yapısı.

Play Framework ve Web Uygulamaları

Yukarıda Akka’dan bahsederken anlattığım gibi, Scala ile web uygulamaları geliştirmek için Play Framework‘ü kullanabilirsiniz. Yine Akka gibi Play Framework de Java ile çalışabilmesine rağmen Scala ile daha kolay, keyifli ve etkili geliştirmeye olanak sağlıyor. Ayrıca Play Framework geliştiricileri önce Scala, sonra Java için geliştirme yapıyorlar diye biliyorum. Yani Play Framework kullanacaksanız Scala’nın Java’ya göre desteklenme konusunda bir avantajı var. Ayrıca Scala’daki implicit kavramı ve fonksiyonel programlama özellikleri gibi gelişmiş yapılar, web uygulamalarınızı geliştirirken size gerçekten çok yardımcı olabiliyor ve uygulamalarınızı daha etkin biçimde geliştirebiliyorsunuz. Linovi’de yüksek performanslı ve kaliteli web uygulamaları geliştirmeyi hedeflediğimiz için Play Framework’ü tercih ediyoruz. Çünkü Play Framework hafif ve iyi bir performansla çalışıyor. İlerleyen zamanlarda Scala ile Play Framework üzerine yazılar yazacağım.

Sonuç

Bu yazımda Scala ile ilgili “Neden Scala öğreneyim/kullanayım?”, “Neden Scala’ya geçeyim?” gibi sorularınıza cevaplar vermeye çalıştım. İnşallah anlattıklarım faydalı olmuştur.

Tekrar görüşmek üzere, hoşça kalın!

Merhaba Scala!

Herkese merhaba!  Scala ile ilgili bu ilk yazımda Scala’nın ne olduğundan, geliştirme yapmak için nelerin gerektiğinden bahsedeceğim ve hızlı bir giriş yapmak adına artık gelenek haline gelmiş “Hello world!” uygulamasını göstereceğim. İlerleyen zamanlarda da fırsat buldukça yeni yazılarla başka birçok konuyu anlatmaya çalışacağım. Ben Scala’yı 2 yıldır öğreniyor/kullanıyorum ve çok seviyorum. İnşallah anlattıklarımdan sonra siz de seversiniz. 🙂

Not: Yazılarımda sık sık diğer programlama dilleri ve özellikle Java ile Scala arasında karşılaştırmalar yapacağım.

Haydi başlayalım!

Scala Nedir?

scala-logo
http://www.scala-lang.org/

Scala bir programlama dilidir. 2003 yılında İsviçre’de Martin Odersky ve EPFL’deki araştırma grubu tarafından geliştirilmiş ve bugüne kadar oldukça büyümüş. Günümüzde dünya çapında yüzbinlerce kullanıcısı var ve yine dünya çapında çok sayıda insan tarafından geliştirilmekte ve sürdürülmekte. Açık kaynaklı bir dil. Derlendiği zaman Java kodu üretiliyor ve Java Sanal Makinası (JVM) üzerinde çalışıyor. Yani Java’nın çalıştırığı her yerde Scala da çalıştırabiliyorsunuz. Hatta Scala ile Java kodunu birlikte bile kullanabiliyorsunuz. Scala ile nesne yönelimli programlama (object-oriented programming, OOP) ve ek olarak fonksiyonel programlama yapabiliyorsunuz. Hatta Scala birçok noktada fonksiyonel programlama yöntemlerini kullanmaya teşvik ediyor. Sözdizimi (syntax) olarak kendine özgü yanları var ve düşündüğünüzde gerçekten fazlalık olan birçok şey atılmış. Bu konulara ilerleyen yazılarda daha detaylı değineceğim ve Scala’nın Play Framework ile birlikte web uygulamarı geliştirmek için kullanımını anlatacağım.

Ne Gerekir ve Nasıl Kurulur?

Scala ile geliştirme yapmaya başlamak için 3 temel şeye ihtiyacınız var.

  1. Kod yazabileceğiniz bir metin düzenleyici veya geliştirme ortamı
  2. Kodunuzu derleyebilmek için Scala
  3. Derlediğiniz uygulamanızı çalıştırabilmek için Java

Yüklemelerin detaylarına inmeyeceğim. Eğer bir sorunuz olursa yorum yazabilirsiniz, daha detaylı konuşabiliriz.

Ben yazılarım sırasındaki geliştirmeyi Mac OS X üzerinde Java 8 ve Scala 2.11.7 sürümleri ile yapacağım. Kod yazmak için de yerine göre Sublime Text 3 metin düzenleyici ve IntelliJ IDEA 15 kullanacağım. Yazılarıma ekleyeceğim kod parçalarını da Github’ın Gist özelliğini kullanarak ekleyeceğim.

Yüklemelerinizde yardımcı olması açısından yukarıda bahsettiklerimin bağlantılarını da vereyim.

İlk Scala Programı

Haydi artık ilk uygulamamızı görelim ve üzerine biraz konuşalım.


object MerhabaScala {
def main(args: Array[String]): Unit = {
println("Merhaba Scala!")
}
}

Yukarıda gördüğünüz yazabileceğimiz belki de en basit uygulama. Tek yaptığı şey varsayılan çıktı kanalına (yani uygulamayı çalıştıracağınız terminal ekranına) bir satır halinde “Merhaba Scala!” yazmak. Şimdi biraz daha detaylara girelim. Daha çok başlarda olduğumuzdan adım adım ilerleyeceğim ama ilerideki yazılarda bu kadar detaya in(e)meyebilirim. 🙂

İlk satırda object özel kelimesiyle “MerhabaScala” isimli bir Scala objesi oluşturuyoruz. Objelerin detaylarını ilerleyen yazılarda anlatacağım. Şimdilik bunu Java’daki bir class gibi düşünebilirsiniz.

İkinci satırda Scala’nın sözdizimi ile ilgili – eğer başka dillerle, özellikle Java ile geliştirme yapıyorsanız dikkatinizi çekecek – ilk farklılıklarla karşı karşıyayız. def özel kelimesiyle bir metod tanımlıyoruz. Metodumuzun adı “main” ve diğer birçok dildeki gibi uygulamamızın başlayacağı noktayı belirliyor. Şu an için yazmadık ama başka sınıflarımız, objelerimiz ve metodlarımız olsaydı bile uygulamamız bu main metodu ile çalışmaya başlayacaktı. Metodun adından sonra parantezler içinde metodun parametrelerini tanımlıyoruz. Metodumuzun 1 tane parametresi var. Bu parametre uygulamamız çalıştırılırken ona aktarılan komut satırı parametrelerine karşılık gelecek bir String dizisi. İlerleyen yazılarımda bu konuya da değinmeyi düşünüyorum. Parametrenin adı args ve türü Array[String]. Scala’da bir değişkenin, parametrenin, metodun veya değerin türünü belirtmek için önce adını, sonra türünü yazıyoruz ve bunları : (iki nokta üst üste) ile birbirinden ayırıyoruz. Parametrenin bir dizi (Array) türünde olduğundan bahsetmiştim. Array türüne, Scala’nın sağladığı zengin koleksiyon kütüphanesinden bahsedeceğim yazımda daha detaylı değineceğim. Parametrelerden sonra – tıpkı bir parametrenin türünü belirttiğimiz gibi – metodumuzun geriye döndüreceği türü yazıyoruz. main metodumuz geriye Unit türünde bir değer döndürüyor. Unit türü Java ve başka bazı dillerdeki hiçlik belirten void türüne karşılık geliyor. Yani aslında main metodumuz geriye bir değer döndürmeyecek, sadece bazı işlemler yapacak. Metodun dönüş türünü de belirttikten sonra metodun imzasının bittiğini ve gövdesinin başlayacağını belirtmek için = (eşittir) işareti yazıyoruz. Daha sonra metodun gövdesini yazıyoruz. Metodun gövdesini süslü parantezler {} arasına yazıyoruz. Eğer metodun sadece bir satırlık bir gövdesi olacaksa, Scala süslü parantezleri kullanmadan da yazmamıza izin veriyor. Yukarıda bahsettiğim gibi, Scala’da birçok durumda eğer bir şey kesinlikle gerekmiyorsa onu atabiliyoruz. Bunu zamanla göreceğiz. 🙂

Üçüncü satırda main metodumuzun gövesi başlıyor. Burada uygulamamızın yaptığı tek işi tanımlıyoruz. Yaptığımız şey println (print line) metodunu çağırmak. Metoda doğrudan ulaşabildik çünkü Scala’da her uygulamaya kendiliğinden dahil edilen tanımlamalar var ve println onlardan biri. Bu metod kendisine pasladığımız parametrelerin değerlerini standart çıktı kanalına yazdırıyor ve bir sonraki satıra geçiyor. Java’daki System.out.println metoduna karşılık geliyor. Ayrıca görmüş olduğunuz gibi satır sonunda ; (noktalı virgül) yok. Scala’da – yine gereksiz olduğu için – noktalı virgüller atılmış. İfadeler yeni satırlar ile birbirinden ayrılıyor. Eğer bir satırda birden fazla ifade yazmak istiyorsanız aralarına ; koymanız gerekiyor. Onun dışında neredeyse hiç ihtiyacınız olmayacak.

Şimdi Scala sözdizimine biraz daha aşina olmanız için yukarıda anlattıklarım hakkında bir iki küçük örnek göstereyim ve sonra uygulamalarımızı nasıl çalıştıracağımıza bakalım.

İşte örnek metod tanımlamaları


def topla(sayi1: Int, sayi2: Int): Int = sayi1 + sayi2
def toplamCiftMi(sayi1: Int, sayi2: Int): Boolean = {
val toplam: Int = topla(sayi1, sayi2)
val mod2: Int = toplam % 2
mod2 == 0
}

Gördüğünüz gibi ilk metodumuzun gövdesi tek satırdan oluştuğu için süslü parantezler kullanmadık. Ayrıca metoddan dönecek değeri belirtmek için  return özel kelimesini kullanmadık. Scala metodun gövdesindeki son ifadenin değerini kendiliğinden geri döndürüyor. “val” özel kelimesi ile değeri değişmeyen bir değer tanımlıyoruz. Diğer dillerdeki değişken tanımlama ile aynı yapıda. İlerleyen yazılarımda bunlardan daha detaylı bahsedeceğim.

Scala Uygulamasını Çalıştırmak

Artık uygulamamızı çalıştıralım değil mi? 🙂 Geliştirme yaptığınız ortama göre değişmekle birlikte Scala kodunuzu birkaç farklı şekilde çalıştırabilirsiniz.

1. Scala REPL

Scala, REPL (read-evaluate-print loop) denilen, “oku-değerlendir-yazdır döngüsü” şeklinde Türkçeleştirebileceğim bir yorumlayıcı ile birlikte geliyor. Ben REPL’a “canlı yayında Scala” da diyorum. 🙂 REPL ile doğrudan Scala kodu yazıp çalıştırabilirsiniz. Yazdığınız her ifade anında yorumlanacak ve çalıştırılacaktır. Bir şeyleri denemek, alıştırmalar yapmak gibi birçok iş için harika bir araçtır. Scala kurulumunuzu doğru yaptıysanız bir terminal ekranında (komut satırı) “scala” komutunu çalıştırarak REPL’ı başlatabilirsiniz. Aşağı yukarı şöyle görünüyor.

Screenshot 2015-11-29 00.11.05

REPL’dan çıkmak için “:q” komutunu çalıştırabilir veya terminali kapatabilirsiniz.

2. Terminalden “scala” Komutu İle

Scala kodunuzu “.scala” uzantısıyla biten bir dosyaya yazıp bu dosyayı derleyip çalıştırabilirsiniz. İlk uygulamamızı “MerhabaScala.scala” isimli bir dosyaya kaydettikten sonra dosyanın bulunduğu dizinde “scala MerhabaScala.scala” komutu ile uygulamayı çalıştırabilirsiniz. Hazır aklıma gelmişken söyleyeyim. Scala’da, Java’daki gibi dosya adının, içine yazdığınız koddaki sınıf ile hatta genel olarak kod ile bir bağlantısı yok. Bir Scala dosyası içine dosyanın isminden farklı bir veya birkaç sınıf yazabilirsiniz. Hatta sınıf veya objeler olmadan sadece ifadeler yazarak bir script (betik) gibi de çalıştırabilirsiniz. Bu yöntemle çalıştırdığımız ilk uygulamamız aşağıdaki gibi görünecek.

Screenshot 2015-11-29 00.15.37

3. Bir Bütünleşik Geliştirme Ortamı (IDE) Kullanarak

Muhtemelen en kolay ve en çok tercih edeceğiniz yöntem bu olacak. Kullanacağınız IDE’ye bağlı olarak değişmekle birlikte genellikle “Uygulamamı derle ve çalıştır.” şeklinde bir komut ile, muhtemelen tek bir tuşa basarak uygulamanızı çalıştırabileceksiniz. Bir IDE olarak IntelliJ IDEA üzerinde Scala geliştirmeyi ayrı bir yazımda anlatacağım ve ondan sonraki yazılarımda IntelliJ IDEA kullanıyor olacağım. Temel konulardan bahsedeceğim ilk yazılarımda 2. yöntemi kullanmak muhtemelen sizin için en kolayı olacak.

Sonuç

Evet, bu yazımda Scala’nın ne olduğundan, Scala ile geliştirme yapmak için nelerin gerektiğinden, Scala ile yazılabilecek ilk uygulamadan ve uygulamaları nasıl çalıştıracağımızdan bahsetmeye çalıştım. Biliyorum, çok fazla “İlerleyen yazılarımda bahsedeceğim.” dedim ama takdir edersiniz ki her şeyi bir yazı ile anlatmam mümkün değil. Mümkün olduğunca küçük parçalar halinde, sizleri sıkmadan yazmaya çalışacağım.

Görüşmek üzere. Hoşça kalın! 🙂

Kaynaklar

Scala hakkında genel bilgiler, tarihçe ve logo için: http://www.scala-lang.org