Chrome V8 nasıl çalışır? Peki neden JavaScript JIT-Derlemedi?


19

Tercümanları / Derleyicileri araştırıyorum, sonra JIT-Derleme'yi, özellikle de Google Chrome'un V8 Javascript Motorunu gördüm.

Sorularım -

  1. Standart Yorumlamadan nasıl daha hızlı olabilir ?
  2. JIT-Compilation neden ilk etapta kullanılmadı?


Mevcut Anlayışım

  1. Her Javascript Programı kaynak kodu olarak başlar , ardından yürütme yöntemine bakılmaksızın, nihayetinde makine koduna çevrilir .
    Hem JIT-Derleme hem de Yorum bu yolu izlemelidir, bu yüzden JIT-Derleme nasıl daha hızlı olabilir (ayrıca JIT, AOT-Derlemenin aksine zaman kısıtlamalı olduğu için)?

  2. Görünüşe göre JIT-Derleme, Wikipedia'nın JIT-Derleme Makalesi'ne dayanan nispeten eski bir yeniliktir .

"En eski yayınlanan JIT derleyicisi genellikle 1960 yılında McCarthy tarafından LISP üzerinde çalışmaya atfedilir ."

"Smalltalk (c. 1983 ), JIT derlemelerinin yeni yönlerine öncülük etti. Örneğin, makine koduna çeviri talep üzerine yapıldı ve sonuç daha sonra kullanılmak üzere önbelleğe alındı. Bellek kıt hale geldiğinde, sistem bu kodun bir kısmını silip yeniden oluşturacaktı tekrar ihtiyaç duyulduğunda. "

Peki neden Javascript Interpreted ile başlamıştı ?


Çok kafam karıştı ve bu konuda çok araştırma yaptım, ancak tatmin edici cevaplar bulamadım.

Çok net, kısa cevaplar takdir edilecektir. Ve Tercümanlar, JIT-Derleyiciler vb. Hakkında ek açıklama getirilmesi gerekiyorsa, bu da takdir edilecektir.


2
# 2 ve # 3 yanıtlanabilir, ancak "Chrome V8 Engine nasıl çalışır?" herhangi bir nitelik olmadan çok geniş; tek doğru cevap V8 kaynak koduna bir bağlantıdır. V8 hakkında daha spesifik bir şey sormak mı istediniz? (değilse, sorunun bu kısmını kaldırmak en iyisi olacaktır)
Ixrec

İkinci bakışta, # 1'i soran tek nokta # 2'yi anlamaktı, bu yüzden kaldıracağım. Giriş için teşekkürler.
Anton Paras

Diğer cevaplarda bu belirtilmemiştir, ancak JIT derlemesi zordur. Bu basit bir şey değildir, çünkü JIT derlemesinden kaynaklanan hatalar hata yerine segfaultlara neden olur - program konsolda bir hata atmak yerine çöküyor. Evet, gdb ile rahatça yetkin bir C programcısı için bu bir problem değildir. Ama gdb ile rahat neredeyse tüm yetkili C programcısı diğer projelerde çalışmak için para alır. Perl ve Ruby gibi diğer bazı dillerde hala yaygın JIT tercümanları yoktur.
slebetman

Merak ediyorsanız. Bu konuda bir programlama dili için temel bir geliştirici / sürdürücü açısından konuşuyorum. Birkaç yıl boyunca Ferite programlama dilini korumak için işe alındım. Sahip olduğumuz dilek listelerinden biri JIT uygulamaktı. Asla olmadı - onun yerine gittik. PHP'nin yakın zamanda bir JIT derleyicisi (HVVM) var.
slebetman

Yanıtlar:


43

Kısa cevap, JIT'in daha uzun başlatma sürelerine sahip olmasıdır, ancak uzun vadede çok daha hızlıdır ve JavaScript uzun vadede tasarlanmamıştır.

90'larda, bir web sitesindeki tipik JavaScript, başlıktaki bir veya iki işleve ve doğrudan onclickmülklere ve benzerlerine gömülü bir avuç kod anlamına gelir . Genellikle kullanıcı büyük bir sayfa yükleme gecikmesi beklerken doğru şekilde çalışır. Son derece temel form doğrulama veya ipotek faiz hesaplayıcıları gibi küçük matematik yardımcı programları düşünün.

Gerektiği gibi yorumlamak çok daha basitti ve günün kullanım durumları için mükemmel yeterli performans sağladı. Uzun süreli performansa sahip bir şey istiyorsanız, flash veya bir java uygulaması kullandınız.

2004 yılında Google haritaları, yoğun JavaScript kullanımı için ilk katil uygulamalardan biriydi. JavaScript olanaklarına dikkat çekiyordu, ancak performans sorunlarını da vurguladı. Google, tarayıcıları JavaScript performanslarını artırmaya teşvik etmek için biraz zaman harcadı, daha sonra rekabetin en iyi motivasyon kaynağı olacağına karar verdi ve ayrıca tarayıcı standartları tablosunda en iyi yeri vereceğine karar verdi. Sonuç olarak Chrome ve V8 2008 yılında piyasaya sürüldü. Google Haritalar'ın sahneye çıkmasından 11 yıl sonra, JavaScript'in bu tür görevler için yetersiz olduğunu hatırlamayan yeni geliştiricilerimiz var.

Diyelim ki bir fonksiyonun var animateDraggedMap. Yorumlamak 500 ms sürebilir ve JIT ile 700 ms derlenebilir. Ancak, JIT derlemesinden sonra, gerçekte çalışması yalnızca 100 ms sürebilir. 90'larsa ve yalnızca bir kez bir işlevi çağırdıktan sonra sayfayı yeniden yüklüyorsanız, JIT buna değmez. Bugün ise ve animateDraggedMapyüzlerce veya binlerce kez arama yapıyorsanız , başlatma sırasında ekstra 200 ms hiçbir şey değildir ve kullanıcı haritayı sürüklemeye bile başlamadan önce perde arkasında yapılabilir.


2

Çalışma zamanında neler olup bittiğini anlayarak, kodda veya kodun yorumlanmasında, derleme vaktinden önce bilinenlerden daha hızlı veya derlenmiş olarak daha iyi yürütülmesini sağlayan değişiklikler yapmak mümkündür.

Bu konuda oldukça az şey söylenebilir - önemli miktarda araştırmanın konusudur. Buradaki kendi açıklamam , farklılıkları anlama: geleneksel tercüman, JIT derleyici, JIT yorumlayıcı ve AOT derleyici


Oldukça basit bir şekilde, JavaScript başlangıçta derlenmemiş veya JIT için bakılmamıştır, çünkü hiçbir zaman bu kadar karmaşık veya önemli bir şey olmamıştı.

Java Script'in asıl amacı , bir web sayfasındaki Java uygulamalarına bağlanmaktı. Form düğmesine bir düğmeyi tıklatma veya bir değer girme ve ardından bir Java uygulama yönteminde çalışma yeteneği, JavaScript Kodundan Uygulama Yöntemlerini Çağırma'da görülebilir . JavaScript aracılığıyla , bir uygulamadan JavaScript kodunu çağırmanın başka bir yoluna gitmek de mümkün oldu .

JavaScript'in asıl amacı, uygulamaları ve bunları içeren html sayfalarını bağlamaktı. Böyle küçük bir görev için, yüksek performansa ihtiyaç duyulmaz (performans istiyorsanız, JIT'ed olan uygulama yöntemini çağırın).

Sadece Netscape'in JavaScript ile kendi dili olarak önemli çalışmalar yapmaya başlaması ve geliştirmesi için ( Netscape Enterprise Server'daki Sunucu Tarafı JavaScript'i dahil - ki bu arada zamanından önce derleme yapmıştır) JavaScript'in ciddi bir hedef olarak ortaya çıkması . Bundan sonra gerekli araçların kullanışlı olması yıllar sürdü.


1
Hayır, Javascript Java ile ilişkili değil. Java uygulamaları JVM bayt kodudur.
Basile Starynkevitch

@BasileStarynkevitch JavaScript, hletml dom ile Java nesnelerinde bulunan yöntemler arasında tutkal görevi gören küçük köy sayfalarındaki Java uygulamalarıyla çalışmak üzere tasarlanmıştır. Java olması amaçlanmamıştır ve asla tasarlanmamıştır.

JavaScript başlangıçta ECMAScript (veya bunun gibi bir şey) olarak adlandırıldı ve Java ile ilgisi yoktu. JavaScript olarak nasıl adlandırılacağı, ilgilenenler için ayrı bir araştırmanın konusudur. Bu her zamankinden karışıklığa neden oldu.
hemen

1
@quickly_now ve hala öyle tc39.github.io/ecma262
caub

Evet. Ve yukarıda bahsettiğimde garip bir nedenden dolayı bunun için aşağı indirildim!
çabuk_arka

1

JIT'ler JavaScript için hızlıdır, çünkü değişkenlerinizin türünü bilmediğinizde hızlı makine kodu oluşturmak imkansızdır.

Tip bilginiz olmadığında, hesaplamalar pahalıdır. Örneğin,

x + y

x ve y hakkında hiçbir şey bilmiyorsanız oldukça karmaşıktır. Tamsayılar, çiftler, dizeler ve hatta bu hesaplamanın yan etkileri olan nesneler olabilirler. Statik yazımımız olmadığından, bu pahalı bir hesaplamadır.

Tam zamanında derleme ile çalışma zamanı bilgilerini kullanabilir ve bunu daha hızlı bir hesaplamaya dönüştürebiliriz. Çalışma zamanında, V8 değişken türünü takip eder. Yukarıdaki kod, dize ile birkaç kez yürütülürse, derleyici dize birleştirme için çok daha basit talimatları yürütebilir. Derleyici ulaştığında x + y, birçok farklı x ve y türü için dallanan çok sayıda kod çalıştırmak yerine, derleyici tekrar dizelerimiz olup olmadığını hızlı bir şekilde kontrol eder ve daha sonra dizeleri özel olarak birleştiren sadece birkaç satır makine kodu çalıştırır.

Örneğin, C ++ 'da derleyici x ve y türlerini önceden bilir, çünkü değişkenleri bildirmek zorunda kaldık. Böylece kodu çalıştırmadan önce dizeleri birleştirmek için optimize edilmiş makine kodu oluşturabilir.


0

1) Standart Yorumlamadan nasıl daha hızlı olabilir? Düşünülmüş bir örnek şöyle olur; varsayalım 2 ApplicationCompiled ve ApplicationInterpreted uygulamamız var. Bu programların her ikisi de aynı şeyi yapar ve aynı kaynak kodunu paylaşır. ApplicationCompiled'in derlenmesi 6 saniye sürer.

Diyelim ki Senaryo A'nın zamanlamaları:

  • Derlenmiş Uygulama için: 4 saniye
  • Yorumlanan Uygulama için: 12 saniye

Yani toplamda ApplicationCompiled, Senaryo A'yı (6 saniye derleme, 4 saniye çalışıyor) ve ApplicationInterpreted'i çalıştırmak için toplam 12 saniye sürüyor. Size göstermek için özel bir örneğim yok ve yukarıdaki durumlarda hangi durumların doğru olacağından emin değilim - bu aynı zamanda yorumlayıcı ve derleyicinin ne kadar akıllı olduğuna da bağlıdır.

Açıkçası bu çok basitleştirilmiş, ama aynı fikri JIT derleme / yorumlama için de uygulanabilir. Bu durumda bir sonraki soru "bu şubenin JIT derlenmesi veya yorumlanması gerekiyorsa - düşük maliyetle - nasıl belirleriz?" Buradaki ligimin dışındayım :)

2) JIT-Compilation neden ilk etapta kullanılmadı? Bilmiyorum, ancak sadece JavaScript gibi optimize etmek zor bir dil yapmada mevcut ilerlemenin kaynak ve olgunluk meselesi gibi ilerlemiş teknikler olduğunu düşünüyorum. Muhtemelen o zamanlar çok daha düşük asılı meyveler vardı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.