JVM dillerinin yükselişi - JVM dillerinin çalışma mantığı

Bir önceki yazımda bahsetmiştim. Java oldukça ideal bir çalışma ortamı olsa bile (multiplatform oluşu ve esnekliği sayesinde) dil bazında pek çok sıkıntıyı ve eksiği içerisinde barındırıyor. Hele bizim gibi millenium gençlerinin sabrını pek çok konuda test ediyor. Bunu şunun yüzünden söylüyorum. Artık kimse Atari 1200 veya Commodore 64 dönemlerindeki gibi en ufak şeyi yapabilmek için saatlerini bir kod parçasına vermek istemiyor. Nitekim yine yaşıtım olan mühendis arkadaşlarm, esnek, hızlı geliştirilen ve kolay anlaşılan şeylerin peşine düşme eğilimi gösteriyorlar. Ayrıca desteği bu kadar parçalı durumda olan bir dille de kimse (kendi şahsım adına konuşuyorum) uğraşmak istemiyor. Bir diğer yandan da Java dillinin kazandırdıkları şurada çok tatlı duruyor. Özellikle aynı kodu tek bir derleyici ve oluşturulan tek bir bytecode ile bütün platformlara aynı anda çıkarmak sanırım Java’nın en tatlı yanlarından birisi. Düşününsenize belki de bu özelliği Minecraft oyununu bugün neredeyse her türlü donanıma uygun olarak optimize edilip dağıtılmasına ve dünyayı sallamasına neden oldu. Evet Minecraf’tın kendisinin taşıdığı fikir oldukça güzeldi ve onu bu günlere getirdi ancak ilk zamanlarında bu kadar hızlı yaygınlaşmasında Java’nın rolünü de bence azımsamamak gerek.

Bir Anlama Çabası ve Sorgulama

Neyse konumuza dönelim. Java diyorduk, çoklu platform oluşu diyorduk. Bu özelliği ile muhteşem şeyler katsa bile bize, sözdizimi konusu ve yenilenen dünyaya kısa sürede adapte olamaması ile tahtını yavaş yavaş başka dillere kaybetmeye başlamasına neden oldu gibi görünüyor. Ancak şu da açık ki bazıları Java’nın bu esnek yapısını Java’nın izin verdiği ölçüde kullanmaya da istekli. Ve bunu yaparken de Java’nın eksiklerini de kendilerince kapatmış durumdalar (yeni buglar da ekleyerek.. tabi ki şaka).

2016’dan bu yana amatör olarak çeşitli projelerle uğraşıyorum, yamalar gönderiyorum hatta kendi projelerimi çıkarmaya çalışıyorum. İşin özü kodluyorum. Ve tam da python2’den python3’e geçişte kodlamaya başlayan birisi olarak diğer dillere geçişe veya onlarda da çalışmaya çok kısa sürede adapte de olabiliyorum. Ancak Java kodlamaya başladığımdan beri (2 senedir) Java ile alakalı daha çok araştırdıkça ve onu daha çok kullandıkça bazı konularda “Ya bu nasıl olamaz”, “Bu eksik yüzünden şu kadar süre koddaki sorunu bulup temizlemem gerekti” veya “Bir keyword kardeşim, bir keyword ekle şuna bir özellik getir de kurtulalım şu kadar uzun yazmaktan” dediğim çok oldu. Hadi masaüstü uygulamalar neyse de mobil uygulama geliştirirken Java 8’de bulunmayan ve işimi çok kısaltacak şeyleri aramaktan ciğerim soldu. Tabi bu bir yanda son Java sürümüne geçmeyen Google’nin suçu gibi dursa da bunu masaüstü ortamda da yaşıyor olmam beni Java’yı sorgulama aşamasına itti.

Bu arada tabi ki birkaç arkadaşımın ricası ile (telefonda söylediği: Kardeşim projede kaç kişiyiz hepimiz Kotlinle yazıyor, yiyorsa Kotlin yazma) Kotlin de yazdım. Sonrasında JVM dillerini araştırmaya başladım. Bakalım işime yarayacak neler var diye.

Arayış

Oracle’nin Java’ya dahli ile Sun tarafından yol haritası çıkarılan Da Vinci Machine projesi JVM kullanarak dinamik tipli diller oluşturabilmeye izin verir hale geldi. Bu aşamada programlama dilleri aslında makine dilini insanların (en azından bir kısmının) anlayabileceği şekilde yazılabilmek amacı ile oluşturuldu. Makine dili, doğrudan bir bilgisayarın CPU’su tarafından yürütülebilen çok basit talimatlardan oluşur. Programlama dilleri, daha anlaşılır yapıdaki bu araç setleri için bir ortam oluşturur ve derleyiciler de bunu mimariye uygun olarak derleyerek bilgisayarın anlayacağı hale dönüştürür. Ancak derleyicinin oluşturduğu, yalnızca o mimariye özel olarak çalıştırılabilir (çünkü her mimari türünün kendine ait bir makine dili vardır). Program başka tür bir bilgisayarda çalışacaksa, farklı bir derleyici kullanılarak uygun makine diline yeniden çevrilmesi gerekir. Yani bir programı her bir mimari için ayrı ayrı derleyip dağıtmak gerekmekte.

Java’yı geliştiren şirket, Sun Microsystems, özellikle büyük çaplı projelerin bu şekilde mimariler için ayrı ayrı derlenip dağıtılmasından muzdarip durumda olsa gerek ki bir alternatif ortaya atıyor. Programı bir kerede çeviren bir derleyici kullanmak yerine, gerektiğinde onu talimata göre çeviren bir yorumlayıcı ile dönüştürmek. Bu da aynı yorumlayıcı kodununu farklı mimariler için üretilmiş o mimariye özel üretilmiş yorumlayıcılara vererek çalıştıran bir ara katman oluşturmayı akletmişler. Yorumlayıcı burada, bir tür getir ve çalıştır döngüsüne bağlı olarak çalışacak ve bir CPU gibi davranacaktı. Java tasarımcıları, derleme ve yorumlamanın bir kombinasyonunu kullanmayı seçtiler. Java ile yazılan programları makine diline dönüştüren bir derleyici yazdılar, ancak bu derleyici gerçekte var olmayan bir mimari için bir makine dili üretecekti. Bu sözde “sanal” mimariye, Java Sanal Makinesi veya JVM ismini verdiler. Bunu yorumlayacak bir de java yorumlayıcısı yazarak bir defada bir java ikili kodunu (bytecode) birden fazla mimariye dağıtmalarına olanak vereceklerdi. Bu da özellikle Sun Microsystems gibi birden fazla mimariye yazılım sağlayan şirketin işlerini kolaylaştıracaktı. Nitekim öyle de oldu. JVM pratikte şunları sağlıyordu:

Özellikle o dönemin zorlayıcı donanım özellikleri, yazılım üreticilerini ve geliştiricileri yorumlamalı dillerden uzak tutarken, birden fazla mimari için yazılım sağlayan üreticileri de bir yığın iş yükü ile başbaşa bırakıyordu. Tam o dönemde çıkan Java gibi bir nimete tabi ki talep de çok fazla oldu ve kısa süre içerisinde iyi bir hype ile yükseldi.

Ancak zamanla Java politakasının değişmesi ve dilin LTS sürümleri arasında açılan zaman aralığı (son LTS 2014’de çıkmış durumda) ve Google ile Oracle’nin Java üzerinden restleşmesi şirketleri korkutarak alternatiflere yöneltti. Java’nın yukarıdaki mantığını değerli bulan şirketler de tabi ki JVM makinesini kullanan başka dillere yöneldi. Bir diğer yandan da yeni bir trend nail oldu. WOIALRA herhangi bir dilde bir kez yazın, her yerde çalıştırın (write once in any language run anywhere). Kulağa oldukça mantıklı geliyor değil mi. Çünkü sizin bir dilde bekledikleriniz ile benim beklediklerim farklı olabilir. Bunu aynı dile ait bir yorumlayıcıyı kullanarak sağlamak da Java’nın tabiri caizse “tutmasının” en büyük sebebi. İşte tam bu noktada insanlar JVM’ye eklenen Da Vinci Machine projesinin özelliklerini kullanarak kendi dillerini yarattılar. En önemli çıkış noktaları ise şunlardı:

Burda ise en önemli dezavantaj maalesef JVM’nin Java özel yazılmış oluşu ve en optimize olarak Java dili ile çalışıyor oluşu. Diğer diller için maalesef Java kadar optimize çalışmaması göze alınabiliyor ise JVM dilleri kullanmaya değer durumda.

Sonuç

Ben halihazırda Java ile mutluyum ama bazı özellikler yoksunlukları ve sorunları yüzünden Java’ya karşı olan sevgimin düştüğü zamanlar da olmuyor değil. Ancak şu bir gerçek birileri gerçekten Java’nın özelliklerini Java’dan daha fazla sevdiği için ve onu damıtmaya çalıştığı için bugün JVM dillerini konuşuyoruz. Belki de ben de Java’yı kendime göre yorumlarım. Ancak kendimi o kadar Java’dan bıkmış hissetmiyorum.