JavaScript gibi dinamik bir dil tercümanında / derleyicisinde tür nasıl kontrol edilir?


11

JavaScript veya Python gibi dinamik dillerde, değişkenin türü çalışma zamanında belirlenir. Java gibi yazılan dillerden daha yavaş olmasının bir nedeni de budur.

Tip kontrolü nasıl yapılır? Bu sürecin yavaş olmasının temel nedeni nedir?


Daha yavaş değiller çünkü dinamikler, daha yavaşlar çünkü onları daha hızlı yapmak daha zor. JavaScript aslında en optimize edilmiş ve oldukça hızlı.
Derek Litz

Yanıtlar:


5

Soruda karışıklık var.

Tip kontrolünün yavaş olduğu varsayımı vardır, bu durum böyle değildir.

Sorusu da sürecini şaşırtmak gibi görünüyor tip sevk ile tür denetimi ve bunlar farklı şeylerdir. Biri çalışma zamanında yapılan, diğeri derleme zamanında yapılan bir süreçtir. Soru gerçekten tür sevk hakkında soruyor şüpheli.

Bu, çalışma zamanında ek yükü getirebilen bir tür dağıtımdır, çünkü hesaplama, çalışma zamanında gördüğü değer türlerine göre dinamik olarak hangi eylemi gerçekleştireceğine karar veren talimatlarla zaman harcar. Örneğin dinamik bir dilde, iki şeye "+" uygularsam, sayısal toplama veya dize birleştirme anlamına gelebilir, bu yüzden ne yapacağımıza karar vermek için eldeki şeylere bakarak zaman geçirmem gerekir. Dinamik dağıtımın maliyetini azaltabilecek değerlendirme stratejileri vardır. (örneğin, izleme JIT'leri)

JavaScript'te tür denetimi yapma ile ilgili olarak, bkz . Http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Tip denetleyicilerinin nasıl çalıştığına daha genel bir bakış için standart bir programlama dili ders kitabı algoritmaları kapsayacaktır. Örneğin, http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/



Javascript yorumlayıcısı, tip dağıtımı için her bir değere sahip etiket bitleri taşır. Bununla ilgili biraz ayrıntı verebilir misiniz? Örneğin, etiket bitlerinin kullanımı nedir? Biraz bir türe karşılık geliyor mu?

Bir tür kavramı her zaman temsile bağlı değildir. Örneğin, 'mil' tipi ile 'kilometre' tipi arasındaki bir kavramımız olabilir ve derleme zamanında hesaplamaların türleri bozan değerler üzerinde işlemleri yanlış uygulayıp uygulamadığını statik olarak algılayabilen bir dile sahip olmak mantıklıdır. . Aynı temsile sahip olduklarını hayal edebilirsiniz ve derleyici, derleme sırasında asla karıştırılmadıklarını garanti edebilirse, değerlerin gösterimde ek etiketlemeye ihtiyaç duymasının bir nedeni yoktur.

1
Devam ediyor: ancak çoğu zaman, özellikle dinamik dillerde, farklı türdeki değerleri temsil etmek istiyorsunuz. Bu ayrımcılığı yapmanın birkaç yolu vardır. Tip etiketleri yaygındır, ancak başka teknikler de vardır. Örneğin, belirli türleri belleğin engellenen bölgelerine yerleştirebilirsiniz. Bkz. "Dinamik Olarak Yazılmış Dillerdeki Tür Bilgilerini Gösterme". temsil tekniklerinin kapsamlı bir araştırması için lambda-the-ultimate.org/node/3912 .

7

Çok temelde, türlenmemiş dillerde, her referans hem türü hem de değeri içeren bir nesneye işaret eder. Örneğin var a = 3, 3 değerini ve int türünü içeren bir örneği gösterir, yaparsanız a = "bla", başvuru "bla" dizesini ve tür dizesini içeren bir örneğe güncelleştirilir, eski nesne atılır, vb ...

Bu yavaştır, çünkü a + bbu temel tipte her işlem (örn. ) Yapılması gerektiğinde , çalışma zamanı önce nesneleri ayırmalı, türlerinin uyumlu olup olmadığını kontrol etmeli, işlemi gerçekleştirmeli, yeni bir nesne oluşturmalıdır.

Buna karşılık, a + bC ++ veya Java derleme zamanında türlerin geçerli ve uyumlu olup olmadığını denetler , o zaman a ve b anlık değerler (başvurular değil) olarak saklanır ve ekleme bu değerler üzerinde basit bir işlemci işlemidir.

Tabii ki, hepsi çok teorik. Pratikte, genel giderlerin çoğunu önlemek için bu süreçte birçok optimizasyon yapılabilir ve dinamik olarak yazılan diller oldukça hızlı olabilir.


1
Polimorfik satır içi önbellekler gibi püf noktaları performansı büyük ölçüde artırabilir. David Ungar'ın (Self) ve Eliot Miranda'nın (Squeak, Visual Works Smalltalk sanal makineleri) yazıları dinamik dil performansı konusunda en bilgilendiricidir.
Frank Shearar

0

Her değer, önce incelenmesi gereken türü ile birlikte saklanır. Ayrıca dönüşümler, dizeden sayıya anında inceleme yoluyla gittiğini söylüyor.


Evet, işte bu, sadece bir çalışma zamanı kontrolü, fantezi bir şey değil.
anon
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.