JavaScript tasarım tarafından yorumlanıyor mu?


73

Bu soruyu sormakta temkinliyim çünkü aşırı titiz görünebilir. JavaScript'i yeni açtım: Tanımlayıcı Rehber ve bölüm 1'in ilk sayfasını belirtir.

"JavaScript, üst düzey, dinamik, türlenmemiş bir tercüme edilmiş programlama dilidir"

Öyleyse, yorumlanan kısmın dil şartnamesinde bir gereklilik olduğu veya bir dilin ve onun birçok uygulamasının arasındaki farka bakarken dilin tercüme edilmiş bir programlama dili olduğunu söylemek yanıltıcı mıdır?

Görünüşe göre JavaScript için statik bir derleyici yok - https://stackoverflow.com/questions/1118138/is-there-a-native-machine-code-compiler-for-javascript bu yüzden belki de bunun bir yansıması.


Bir süre için bir jscript.net vardı, bu AS3 / "kayıp" ES4'e benziyordu. CIL'ye bytecode derlendi.
Hey

13
V8 açıkça tercüman değil derleyici olduğunu iddia ediyor .
pimvdb 06.06.2012

@GGG JScript.Net hala hayatta ve ... hasta. Ama hala hayatta. msdn.microsoft.com/en-us/library/72
processor15a.aspx

1
FWIW, "yazılmamış" bit de kesin olarak doğru değil
Rob Agar

Firefox, FF 3.5'de bu sorunun yanıtlandığı yıl ilk tarayıcı tabanlı JIT derleyicisini daha yeni yayınlamıştı, bu nedenle muhtemelen o zamanlar geniş çapta bilinmemişti. Modern JIT'lerin bir JS belgesinin ilk geçişinde belirli bir kapsam için izole edilmiş yöntemleri belirleme ve önbellekleme gibi şeyleri yapmak için gerçekten çok fazla derleme (veya en azından derleme için hazırlık yapma) yaptığına inanıyorum.
Erik,

Yanıtlar:


50

Öyleyse, yorumlanan kısmın dil şartnamesinde bir gereklilik olduğu veya bir dilin ve onun birçok uygulamasının arasındaki farka bakarken dilin tercüme edilmiş bir programlama dili olduğunu söylemek yanıltıcı mıdır?

ECMAScript dil meraklılarının sık sık terim "ES tercüman" ECMAScript'e bir uygulamaya başvurmak için kullanın, ancak Spec bu terimi kullanmıyor. Özellikle dile genel bakış , dili yorumlayıcı-agnostik terimlerle açıklar:

ECMAScript nesne tabanlıdır: temel dil ve ana bilgisayar olanakları nesneler tarafından sağlanır ve ECMAScript programı bir iletişim nesnesi kümesidir.

Bu nedenle EcmaScript, G / Ç'ye veya dış dünyaya başka herhangi bir bağlantıya izin verenler de dahil, ancak bir tercüman gerektirmeyenler de dahil olmak üzere nesne tanımları sağlayıcısı olarak tanımlanan bir "ana bilgisayar ortamı" varsaymaktadır.

Dilde ifade ve ifadelerin semantiği, tercümanlarda önemsiz bir şekilde uygulanan tamamlama belirtimi açısından tanımlanır , ancak belirtim bunu gerektirmez.

8.9 Tamamlama Şartnamesi Türü

Tamamlama tipi tabloların davranışlarını açıklamak için kullanılır ( break, continue, returnve throw) kontrol yerel olmayan transfer gerçekleştirin. Tamamlanma türden değerlerin formu (içinde üçe tipi , değer , hedef ), tip biridir normaldir , kırmak , devam , dönüş veya atmak , değer herhangi ECMAScript dil değer veya boş ve hedef herhangi ECMAScript kimliğidir veya boş .

Burada kullanılan “ani tamamlama” bir ile herhangi tamamlanması anlamına gelir türü dışında , normal .

Yerel olmayan kontrol transferleri, yerel veya bayt kodu derlemeye izin veren atlamalarla birlikte talimat dizisine dönüştürülebilir.

"EcmaScript Altyapısı" aynı fikri ifade etmenin daha iyi bir yolu olabilir.


Görünüşe göre JavaScript için statik bir derleyici yok.

Bu doğru değil. V8 "tercüman" dahili olarak yerel kod için derlenir, Rhino isteğe bağlı olarak dahili olarak Java bytecode'unu derler ve çeşitli Mozilla tercümanları ({Trace, Spider, Jager} Monkey) bir JIT derleyicisi kullanır.

V8 :

V8, çalıştırmadan önce JavaScript'i yerel makine koduna derleyerek, bayt kodunu çalıştırarak veya yorumlayarak performansı artırır.

Gergedan :

public final void setOptimizationLevel(int optimizationLevel)

Mevcut optimizasyon seviyesini ayarlayın. Optimizasyon seviyesinin -1 ile 9 arasında bir tamsayı olması beklenir. Herhangi bir negatif değer -1 olarak yorumlanır ve 9'dan büyük herhangi bir değer 9 olarak yorumlanır. Kullanılmış. 0 - 9 arasındaki seviyeler, sınıf dosyalarının oluşturulabileceğini gösterir. Daha yüksek optimizasyon seviyeleri, çalışma zamanı performansı için derleme süresi performansını dengeler. Optimizer paketi çalışma zamanında mevcut değilse, optimizer seviyesi -1'den büyük olamaz.

TraceMonkey :

TraceMonkey, Mozilla'nın JavaScript® motoruna (“SpiderMonkey” olarak bilinir) yerel kod derlemesi ekler. UC Irvine'de geliştirilen “iz ağaçları” adı verilen bir tekniğe ve Tamarin Tracing projesiyle paylaşılan kod ve fikirlere dayanıyor. Net sonuç, hem tarayıcı kromunda hem de Web sayfası içeriğinde büyük bir hız artışıdır.


1
Bu cevap için teşekkürler, aslında soruyu yanıtlıyor. Statik bir derlemeyle ilgili son yorumun, hangi uygulamaların gerçekte kodu derlediği ve hangilerinin yapılamayacağı konusundaki buzz'a neden olan şey olduğunu düşünüyorum. İlgilendiğim tek şey, uygulama atıfları ve teknik özelliklerin tanımlarının yanlış olduğu gibi görünen "JavaScript, yorumlanmış bir dil" ifadesinin geçerliliği idi. Bir "Kesin Rehber" in ikinci paragrafı için cesaret verici değil, ama sanırım buna sadık kalacağım.
Matt Esch

@ me232'de, ifade 2008'den önce esasen doğruydu. Rhino önceden belirledi ancak büyük bir tercüman değildi ve çok az kişi bunu görmezden geldiği zaman “Tanımlayıcı Kılavuz” ile hata yapmış olacaktı. Kitabı okumadım, bu yüzden bu cümlenin genel niteliğinin ne kadar temsilcisi olduğunu yorumlayamıyorum.
Mike Samuel,

"Statik derleyici" nin tanımı nedir. Derlemenin sadece bir kez gerçekleşmesi anlamına geldiğini ve daha sonra uyguladığınız statik (değişmeyen) bir bit kepçe aldığınızı sanıyordum. AFAIK bu herhangi bir JavaScript motorunun nasıl çalıştığını değil. Bu yüzden de-optimizationbasamakları var. Başka bir deyişle, JavaScript bu motorlar tarafından derlenir ancak statik olarak derlenmez.
gman

@gman, Rhino'nun bytecode üreteci bu şekilde çalışır.
Mike Samuel

AFAIK böyle değil. Rhino, çalışma zamanında derlenmesi gereken diğer JavaScript dosyalarını içerebilir. Bu statik bir komplikasyon değil .
gman

20

Chrome'da kullanılan V8 JavaScript VM, tercüman içermez. Bunun yerine iki derleyiciden oluşur ve kodu anında derler. Derleyicilerden biri hızlı çalışıyor ancak verimsiz kod üretiyor, diğeri ise optimize edici bir derleyici.

Neden bazı kişilerin bu "hile" yi düşündüğünü anlayabiliyorum, çünkü V8, kod her çalıştığında ve kullanıcının V8'i kurması gerektiğinde kaynak kodunu alıyor. Ancak, tam bir tercüman ve bytecode içeren bir çalıştırılabilir yayan bir derleyici düşünün. O zaman bağımsız bir programın olurdu. Sadece çok verimli olmazdı.


19

JIT derleyicilerinin senaryo dilleri için ortaya çıkışı, derleme ve yorumlama arasındaki çizgiyi, sorunun pek de anlamlı olmadığı bir noktaya getirmiştir. Motor yalnızca bir kod satırı okuduğunda ve hemen çalıştırdığında yorum mu yapıyor? (Kabuk komut dosyaları yine de genellikle bu şekilde uygulanır.) Motor tüm dosyayı aldığında yorumlama yapar mı, hemen bir bayt koduna derler ve sonra da bayt kodunu yorumlar mı? (İlk aşamada Mozilla motoru, CPython'da olduğu gibi bu şekilde çalışır.) Motor bir anda bir fonksiyonu ayrıştırırken yorumlama mıdır ve JIT yerel kodu derler mi? Ya dosyanın tamamını bayt kodunu derleyen motorlar, sonra gerektiğinde bir fonksiyon JIT? (Günümüzde çoğu script motoru bu şekilde çalışır.

Derleme ve yorumlama arasında birçok renk var.

Bence yorumlama için en kullanışlı tanım "zamanın ayrı bir önceden basamağı olmadan programın çalıştırma sırasında kaynak kodunun beslenmesidir". Bu tanım gereği, tüm JavaScript motorları tercümandır. Ancak bu kesinlikle yorumlamanın tek olası tanımı değildir.

Fakat yorumlamak için JavaScript tasarlanmış mı? Bir anlamda, evet: Program kodunu çalıştırılacak bir dize olarak verebileceğiniz eval, Functionyapıcı olarak bir işlevi vardır . Program kodunu çalışma zamanında dinamik olarak oluşturabilmek, motorun kaynak kodunu yorumlayabilmesini gerektirir. Ancak bu, vaktinden önce her şeyi yapamayacağınız anlamına gelmez. C ++ ve C # gibi derlenmiş bir dilde bile kaynak kodunu alabilir, bellekte yeni makine kodunu derleyebilir ve sonra çalıştırabilirsiniz. Bunun için bile kütüphaneler var: C ++ 'ta LLVM + Clang ve C #' daki Roslyn projesi.

Ayrıca, JavaScript için teslim mekanizması kaynak kodudur; tanınmış bir bayt kodu yoktur. C # ve Java'nın resmi bayt kodu vardır ve herkes C ++ 'ın makine kodu olarak teslim edilmesini bekler. Fakat eğer dil, baskın bir kullanım senaryosuysa, bu hala doğal bir özellik değildir. Aslında, JavaScript'in Flash'taki yakın göreceli ActionScript'i aslında bayt kodu olarak sunulur (Flash derleyicisi tüm komut dosyalarını önceden derler).


4

'Derlenmiş' yerine 'yorumlanmış' tanımı konusunda tam olarak kararlaştırılmamıştır. Klasik ayrımda, derlenmiş diller bağımsız bir ikili çalıştırılabilir dosya üretirken, yorumlanan diller kodu çalıştırmak için konuşlandırılmış bir çalışma zamanı gerektirir. Sanal makinalar, bytecode vb. Bu ayrımı bulanıklaştırır.

Ancak burada muhtemelen yararlı bir tanım vardır: Tercüme edilmiş bir dil, standart dil çalışma zamanının kaynak kod metnini girdi olarak alıp uygulayabildiği bir dildir. Bu tanım gereği Perl, Python, Ruby, JavaScript ve kabuk betikleri ve benzerleri yorumlanır (bytecode veya hatta yerel kod gibi ara adımları kullanıyor olsalar bile). Java, C #, C vb. Değildir. Ve JavaScript tanım gereği, teknik özellik tam kelimeyi kullanmasa bile yorumlanır.


Java ve C'yi aynı kategoriye koymaktan hoşlanmıyorum. Belki de daha iyi bir ayrım, en sık (A) kaynak kodu, (B) ara kod veya (C) makine kodu olarak dağıtılan dillerdir. Örneğin, A = javascript, B = Java, C = C.
John Henckel

Yorumlanmış veya derlenmiş bir dili aramak doğru değildir. Örneğin, bu kural uyarınca, C ++ 'ın derlenmiş bir dil olduğu konusunda hemfikirsiniz. Peki ya Cling, c ++ kodunu derlemeden çalıştırır. "ve benzerleri yorumlanır (bayt kodu veya hatta yerel kod gibi ara adımları kullansalar bile)" Buna göre, java da VM tarafından yorumlanır.
Abhinav Gauniyal
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.