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?
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?
Yanıtlar:
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/
Ç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 + b
bu 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 + b
C ++ 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.
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.