2009-04-17 17 views
13

Statik olarak yazılan dillere göre dinamik olarak yazılan dilleri hızlandırmayı zorlaştıran şey. Başka bir deyişle, yürütme hızını optimize etmeyi kolaylaştıran, statik olarak yazılan dillerden kaynaklanan özellik nedir?Dinamik olarak yazılan diller neden yavaş?

cevap

20

Statik olarak yazılan dillerde özniteliklere/yöntemlere erişilirken, aramalar genellikle statik işlev adresine indirgenebilir. Daha yavaş olan sanal yöntemlerde bile, arama sadece bir veterinerden bir mahsup okumaktır.

Dinamik dillerde, adlar dizelere dayanmaktadır. foo.bar bakmak ister misiniz? Yerel değişken karma tablosunda foo'u bulun, ardından foo hash tablosunda bar'u bulun. Bazı dinamik dillerde, Python ve Ruby gibi, dinamik olarak oluşturulan özniteliklerin uygulanması için ek aramalar/yöntem çağrıları olabilir.

bu aramalarının tamamı

hızlı yapmak çok sert bulunmaktadır. Python, dünyadaki en iyi ayarlanmış hash tablosu uygulamalarından birine sahiptir ve JavaScript'in hızlı bir şekilde milyonlarca dolarlık araştırma parası dökülmüştür. Bu taktikler işe yarar - ne kadarını görmek için Chrome'un JavaScript'i IE 5 ile karşılaştırın - ancak bunlar, işlev çağrılarını statik olarak oluşturmaktan çok daha zordur.


Bir dilin "dinamik" inin nasıl farklı olabileceğini belirtmeliyim. Python, bazı durumlarda güzel olan değişken aramalarla etkileşimde bulunmanın birkaç farklı yoluna sahiptir, ancak optimizasyonu çok zorlaştırır. Common Lisp ve Smalltalk gibi diğer dinamik diller, birçok kullanım durumunda statik dillerle eşit olarak rekabet edebilir, çünkü dinamik aramalar/modifikasyonlar daha fazla kontrol edilir.

+0

Gereksinim duyduğunuzda, Common Lisp'te statik olarak türleri belirtmek mümkündür. Hız için oluşturulmuş bir uygulama çok hızlı kod üretebilir. –

0

Dinamik olarak yazılan diller çoğu zaman bir tercüman tarafından çalıştırılırken, statik olarak yazılan diller genellikle makine koduna derlenir.

+1

Biraz basitleştirici gibi görünüyor. Statik olarak yazılan tüm diller, herhangi bir statik CLR veya JVM dili dahil olmak üzere, makine koduna kadar derlenemez. Dinamik olarak yazılan tüm diller yorumlanmaz, örneğin birçok Lisp bytecode'a kadar derlenebilir ve Python ve PHP için birçok derleyici vardır. – Juliet

+0

Common Lisp aslında makine koduna derlenebilir. –

+0

En iyi Common Lisp uygulamaları makine koduna derlenir. Bazılarının tercümanları yok, sadece JIT derlemesi yapıyorlar. –

10

Bazı derleme zamanı en iyileştirmeleri, yalnızca bir değişkenin tam türü biliniyorsa gerçekleştirilebilir.

Dinamik olarak yazılan diller, genellikle türü belirlemek ve değerin tür için doğru olduğundan emin olmak için genellikle mantık ekledi. Bu piton örneğe

10

Görünüş:

def fact(n): 
    if n==0: 
     return n 
    return n*fact(n-1) 

n nedir? Bu bir numara mı? Bu bir String mi? Daha önce tanımladığınız bir sınıf mı? Derleyicinin hangi girdiye ulaşacağını bilmesinin bir yolu yoktur. Çalışma zamanında çok fazla kontrol yapmanız gerekir, bu da basit operasyonlar için daha örtülü bir iş yaptığınız anlamına gelir.

+2

Aslında ocaml, F # ve Haskell'e destek türü çıkarımı (http://en.wikipedia.org/wiki/Type_inference), bu yüzden derleyici gibi bazı languagse, tip ek açıklamalar olmaksızın kullanıma göre bir değişken veri türünü belirlemek . Örneğin, 'n == 0', bir tamsayı değişkeni için bir eşitlik testi, 'n' bir tamsayı olduğunu gösterir. Derleyicinin 'n' bir tamsayı olduğunu bildiğinden, 'dönüş n' işlevi, bir tamsayı da döndürdüğü anlamına gelir. Böylece, işlevin bir int aldığını ve int döndürdüğünü belirleyebiliriz. – Juliet

+2

@Princess: Ah, ama makine boyutunda bir int veya bignum mu? Bunu hala test etmelisiniz (ancak verimli bir şekilde yapılabilir) – simon

+0

Hala çok statik düşünün - dinamik yeniden derleme ve belirtim hakkında (kendi belgelerini okuyun). Aslında, dinamik bir derleyici, fiili bir bilgi birikimine sahip olarak, statik bir derleyiciden bile daha hızlı kodlar üretebilir, çünkü değer aralıkları vb. Hakkında bile bilgi sahibi olabilir. Muhtemelen, dil yapma çabasına ne kadar para yatırılacağı sorusu olabilir. hızlı ... – blabla999

4

Dinamik olarak yazılan diller, yürütme sırasında türün değişebileceğinden, çalışma zamanında tüm denetimlerini yapmalıdır.

Statik yazılan diller, derleme sırasında tüm türleri çözer, böylece maliyet bir kez önden tüketilir.

Bu, dinamik yazılan dillerin genellikle daha yavaş olmasının ana nedenidir. Ama düşünülmesi gereken başka şeyler var. Çok fazla derleyici veya yorumlayıcıya, GC uygulamasına, dağıtım tablosu düzenine ve arama algoritmalarına diğer optimizasyonlara bağlıdır.

Her şey uygulamaya bağlıdır: Bir dinamik yazılan dil, derlenmiş bir dilden daha hızlı olabilir, bunu gerçekleştirmek için daha fazla iş gerektirir.

+0

Dinamik dilleri derlenebilir ;-) – Ponkadoodle

+0

Dinamik olarak yazılan bir dilin çok iyi uygulanabilmesi, statik olarak yazılan bir dilin çok zayıf bir uygulamasından daha hızlı olabilir. – niagr

1

Sorunu, dinamik olarak yazılmış diller aslında yavaş olmadığından biraz kapalıdır. Pek çok örnek uygulamada olabilir, ancak diğerleri hızlıdır (hızlı "c ile makul şekilde karşılaştırılabilir" veya bunun gibi bir şey, ortak lisp).

Birçok dinamik diller bir VM üzerinde çalışan ve hatta önlenebilir yavaşlamalar neden olabilir, hangi yorumlanır. Belli bir seviyede, statik dil derleyicileri (veya bir şey hakkında dinamik olmayacak sözler vermiş dinamik olanlar) için tamamen dinamik bir durumda mümkün olmayan optimizasyonlar vardır. Sadece örneğin diyelim ki, piton ve C++ arasındaki farklar hakkında düşünme eğer

Ancak, gerçekten konudur statik vs dinamik değil.

+0

Ayrıca, daha yeni Javascript bytecode çevirmenlerinin bazılarının genellikle C++ kadar hızlı performans gösterdiğini belirtmek de hoş olabilir. – eyelidlessness