TARAYICILAR (BROWSER) NASIL ÇALIŞIR ?

Chrome JS Nasıl İşletir ?

Chrome Web sayfaları içerisinde yer alan JS kodlarını nasıl işletir. Aslında bu kodları çalıştırması için V8 Engine kullanır. Bu yazıda V8 Engine JS kodunu nasıl işleyip çalıştırdığını analiz etmeye çalışacağım.

--

Bu yazımı okumadan öncesinde JS Tarihçesi ve Event Loop yazılarımı okumanızı öneririm.

EventLoop yazımda Single Thread içerisinde JS nasıl async çalıştırıldığını, bunun içerisinde kodların Stack içerisine nasıl atılıp işletildiğini anlatmıştım. Burada ise Mathias Bynens & Benedikt Meurer — JSConf EU 2018 JS Engine Good Part sunumu üzerinden konuyu anlatmaya çalışacağım.

JS Her Ortamda Çalıştırılabilir Hale Geldi

JS önceden sadece Tarayıcılar üzerinde çalıştırılırken günümüzde , NodeJS ile sunucularda, React Native ile mobil cihazlarda, Electron ile Masaüstünde ve iOT cihazları üzerinde çalıştırılmaya başlandı.

  • Tarayıcılarda → Chakra, JavascriptCore, SpiderMonkey ve V8
  • NodeJS → Chakra, SpiderNode, V8
  • Elektron → V8
  • IoT → Duktape, Jerryscript
JS Host EveryWhere

Tarayıcılara Göre JS Engine İncelediğimizde

  • Chrome , Opera, Edge — V8
  • Firefox — SpiderMonkey
  • IE — Chakra
  • Safari — JavaScriptCore

JS Engine Ana Akış

  • JS kaynak kodları → Parser tarafından işlenerek → Abstract Syntax Tree
  • Abstract Syntax Tree → Interpreter tarafından işlenerek → ByteCode
  • ByteCode üstünde çalıştırılan sistemin profiling bilgilerinide alarak → Optimizing Compiler işlenerek → Optimized Makine koduna dönüştürülür.
  • Daha sonra çalıştırılan kod üzerinde de-optimize edilerek bytecode ve elde edilen optimization ve profiling verileri ile tekrardan
https://www.youtube.com/watch?v=5nmpokoRaZI JS Main Flow

Chrome — V8, Firefox — SpiderMonkey, Safari — JavascriptCore ve IE — Chakra akışın nasıl olduğunu görebilirsiniz.

https://www.youtube.com/watch?v=5nmpokoRaZI JS Flow Other Browsers

JS Engine ’de Object Model ?

JS Object’ler string key olacak şekilde Dictionary/Map gibi tutulur. Örneğin içerisinde x ve y değeri olan bir object tanımladığımızda Objenin her bir x ve y property için Value, Writable, Enumerable ve Configurable bilgilerini tutar.

https://www.youtube.com/watch?v=5nmpokoRaZI JS Object Model

Property Attributes

Property attributes JSEngine tarafından oluşturulmuş bir kavram değil direk olarak EcmaScript tanımlı MDN Object bu bilgilere erişebilmek için fonksiyonları görebilirsiniz.

  • Value: Property değerini
  • Writable: Property değer atanıp atanamayacağını
  • Enumerable: Property değerin for..in için kullanılabilir mi ?
  • Configurable: Property attr üzerinden değişiklik iznini belirler

JS Engine ’de Array ?

Array ’ler Objectlerin özel durumlarıdır. Object Modellerine göre bazı farklar içerirler

Index:
Array indeksleri yönetmeleri gerekir. Bu indeksler maksimum uzunluğu 2³² — 1 or 4294967295 her türlü değeri alabilir.

Length:

Diğer bir farklılıkta Array Length JS Engine tarafından otomatik olarak hesaplanır. Aşağıdaki örnekte array öncelikle 2 elemanlı olduğunu sonrasından bir index elemanına set ettiğimizde length o index göre oluşturup araları boş bırakır.

Array in Console

Property

İçerisinde a elemanı olan bir array oluşturduğumuzda içerisinde

  • length prop bunun içerisindeki eleman sadece a olduğu için Value 1, Enumerable ve Configurable değeri false dur.
  • ‘0’ prop da a değerini tutar.
https://www.youtube.com/watch?v=5nmpokoRaZI JS Array

Peki buraya yeni bir eleman daha eklendiğinde nasıl davranır ?

  • length prop değeri 2 olur
  • 0 prop a değeri
  • 1 prop b değeri tutulur
https://www.youtube.com/watch?v=5nmpokoRaZI JS Array

Object Aynı Şekle Sahip ise Bellekte Nasıl Tutuluyor ?

JS çoğunlukla Objeler ve Array üzerinden bu property erişimleri ile ilerler. Peki bu objelerin şekilleri aynı ise bu durumda objelerin x özelliğine aynı şekilde erişilebilir.

https://www.youtube.com/watch?v=5nmpokoRaZI Objects with same Shape

Peki her obje için bu yapıdan tutuyor olmamızın bir problemi var aynı yapılar sürekli olarak tekrarlanıyor olması hafızada fazladan yer tüketimi anlamına geliyor. 100 tane Writable, Enumerable, Configurable aynı olan access değeride x olan ayrı ayrı obje olması yerine ..

https://www.youtube.com/watch?v=5nmpokoRaZI x,y Objects Model

Shape şeklinde x,y objesi oluşturup bundan extends eden bir JS Object ile bu işi yaptığımızda artık istenirse 100lerce x,y türünde nesnemiz olsun Property çoklaMamış oluyoruz.

https://www.youtube.com/watch?v=5nmpokoRaZI JSObjects compose/extends Shape

Object Hangi Shape Üzerinden Oluşturulacağını nasıl Biliyor ?

Bunun için boş bir object nesnesine oluşturduğumuzda Shape türeyen bir yapı oluşturuyoruz. Buna x eklendiğinde Boş JS Objects compose/extends Shape türeyen x içeren ayrı bir xShape yapısı oluşturuluyor. Bir sonraki aşamada y eklenmek istediğinde xShape türeyen xyShape oluşacak. Diyelim ki bir son aşamada x,z içeren bir obje oluşturmak istediğimizdede xzShape oluşacak

https://www.youtube.com/watch?v=5nmpokoRaZI Object Transition Chain

Bu durum Objelerimizi aynı kök objesinden oluşturabildiğimiz durumlar için geçerlidir. Bu durumda kök obje ikisininde boş Shape olduğu için aynı kökten türer

a={} a.x=5
b={} b.y=6
https://www.youtube.com/watch?v=5nmpokoRaZI Object Transition Chain
a={} a.x=5
b={x:6}

Denildiği durumda ise Object initialization aynı şekilde yapılmadığı için aynı yapıda olsa bile aynı Shape hiyerarşisinden türeyemiyor

https://www.youtube.com/watch?v=5nmpokoRaZI Object Transition Chain Fail

JS Engine Obj Prop Erişirken Kısayol Ezberi Oluşturur.

JS Engine Objenin property değerine erişirken arkaplanda getX metodu için bir bytecode oluşturulur. Bu bytecode

obj erişip bunun x argümanını  bulmak üzerinedir.
bunun için Shape yapısı içerisinde x prop yerinin belirlenmesi
daha sonra bu prop üzerinden x verisinin değerinin çekilerek döndürülmesi gerekir.

Bunun yerine bytecode yanın açılan ekstra alanlarda objeye ilk erişimden sonra

Shape ne olduğu ve X prop hangi offset tutulduğu bilgisi yazılır
Bu sayede Prop kısa erişim yolu oluşturulmuş olur
https://www.youtube.com/watch?v=5nmpokoRaZI Memorize Property Access

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara (Tarayıcılar Nasıl Çalışır)erişmek için bu linke tıklayabilirsiniz.

Bu yazının devamı veya yazı grubundaki diğer yazılara (JS Deep Learning)erişmek için bu linke tıklayabilirsiniz.

--

--