3 Ekim 2013 Perşembe

SpiderMonkey Javascript Motoru

SpiderMonkey Mozilla isimli kuruluşun geliştirmekte olduğu bir Javascript motorudur. Buradan anlaşılacağı üzere bir API (Application Programming Interface) kütüphanesidir ve geliştirici, uygulamalarında javascriptin sunduğu kolaylıklardan bu Api aracılığı ile faydalanabilir. Bu, Browserlara özgü Dom nesnelerinin uygulama içerisinde kullanılabileceği anlamına gelmemeli zira Dom, browser spesifik bir yapıdır. SpiderMonkey ise bazı temel javascript veri tiplerini, sayılar, nesneler ve dizileri vs. ve bazı temel javascript metotlarını geliştiriciye sunmaktadır. Uygulama geliştirici kendi bileşenlerini (nesneler, sınıflar, metotlar, diziler vs.) kendisi oluşturur ve SpiderMonkey'e bunları kullanacağını bildirir.

Anlaşılır olması açısından bu hususla ilgili bir iki örnek vermek gerekirse Excelde (vbscript ile) yapılan uygulamalar ya da günümüz oyunlarında (lua vs. ile) farklı modların geliştirilebilir olması sundukları script desteği sayesinde olmaktadır. Bu sayede kullanıcı uygulamayı ileri düzeyde özelleştirebilmekte ve uygulamanın çekirdeği üzerinde yeni uygulamalar geliştirebilmektedir. Heyecan verici değil mi :) O zaman sözü uzatmadan hemen yazımıza geçelim.


Burada vereceğim yazı dizisini hazırlarken SpiderMonkey'in resmi sayfasından oldukça fazla faydalandım. İnşallah okuyucular için de faydalı bir yazı olacağını ümit ederek yazıma başlıyorum.

SpiderMonkey ile İlk Deneyim

Uygulamalarımızda SpiderMonkey'i herhangi bir C++ kütüphanesi gibi kullanabiliriz. SpiderMonkey Paylaşılan ya da statik kütüphane olarak derlenebilir. Derleme süreci ile ilgili detayları Mozillanın kendi dokümanlarından öğrenebilirsiniz.

Debian Linux gibi bazı platformlarda SpiderMonkey önceden derlenmiş olarak gelir. Bu şekilde kurulum kolaydır fakat hata ayıklama süreci daha zahmetlidir. XULRunner SDK da SpiderMonkey ve ilgili dosyaları önceden derlenmiş halini içermektedir.

C++ kodları SpiderMonkey'e "jsapi.h" header dosyası ile sunulan JSAPI vasıtasıyla erişmektedir. JSAPI'nin uygulama içindeki görevlerini sıralayacak olursak:

  • Javascript çalışma zamanı ortamını ayarlamak, 
  • Javascript kodlarını çalıştırmak ve derlemek, 
  • Javascript veri yapılarını oluşturmak ve sınamak,
  • Hataları kontrol etmek, 
  • Güvenlik kontrolünü sağlamak ve
  • Scriptleri debug etmek.

SpiderMonkey Ortamı

Bir Javascript kodunun SpiderMonkey'de çalışabilmesi için uygulama içinde üç temel bileşenin bulunması gerekir. Bunlar: Bir JSRuntime, bir JSContext ve bir de global nesnesi. Bu yazımızda bunlara kısaca değineceğiz. Sonraki yazıda ise JSAPI ile bunları nasıl kullanacağımızı bir örnekle göreceğiz.

Koşum Zamanı (Runtime): JSRuntime Javascript nesnelerinin, değişkenlerinin, scriptlerinin ve contextlerinin barındırıldığı, uygulamaya ayrılan alandır. Her JSContext ve her bir nesne bir JSRuntime içinde bulunur. Bunlar runtimelar arasında paylaşılamazlar ve birinden diğerine aktarılamazlar. Çoğu uygulama sadece bir runtime'a ihtiyaç duyar.

Bağlamlar (Context): JSContext, Javascript kod ve nesneleri dahil pek çok şeyi yapabilen bir makine gibi düşünülebilir. Bu makine scriptleri derleyip çalıştırabilir, nesnelerin özelliklerini get ve set edebilir, javascript fonksiyonlarını çağırabilir, bir javascript veri tipinden diğerine çevrim yapabilir, nesneler oluşturabilir, vs. Hemen hemen tüm JSAPI fonksiyonları çoğu <stdio.h> fonksiyonunun bir FILE * pointerına ihtiyaç duyduğu gibi ilk argüman olarak bir JSContext * pointerına ihtiyaç duyar.

Contextler ve Threadlar arasında yakın bir ilişki bulunmaktadır. Basit, tek threadli uygulamalar her iş için tek context kullanabilirler. Ancak her context aynı anda sadece bir iş yapar bu yüzden multithread bir uygulamada bir threadin aynı anda kendisine verilmiş olan bir context'i kullanması gerekir. Öte yandan javascript nesneleri oluşturulduğu script, thread veya context ile kalıcı olarak ilişkilendirilmez. Bu nesneler birden fazla script hatta thread arasında aşağıdaki şekilde görüldüğü gibi paylaşılabilir.

Şekil 1 scriptlerin runtime, context ve nesnelerle ilişkisini göstermektedir.

Şekil 1
Global Nesneler (Global Object): Son olarak global nesneler javascript kodunun kullanımına açık olan tüm sınıfları, fonksiyonları ve değişkenleri içerir. Javascript kodunda window.open("http://www.mozilla.org") gibi bir işlem yapıldığında global bir özelliğe erişilir. Bu örnekte bu global özellik window'dur. JSAPI uygulamaları scriptin görebildiği bu global özellikler üzerinde tam kontrole sahiptir. Uygulama ilk olarak bir nesne oluşturmakla başlar ve bu nesneyi Array ve Object gibi standart javascript sınıflarıyla doldurulur. Ardından, sonradan da burada değineceğimiz, sunulmak istenen özel sınıf, fonksiyon ve değişkenleri (Özel nesneler) ekler. Uygulama her zaman bir JS scripti çalıştırır (JS_EvaluateScript'i kullanarak) ve oluşturulan global nesneyi bu scriptin kullanımına sunar. Script çalışırken, kendisine ait global fonksiyon ve değişkenler oluşturabilir. Bu fonksiyon, sınıf ve değişkenlerin tümü global nesnenin özellikleri olarak saklanır.


Hiç yorum yok: