Dinamik diller her zaman yorumlanıyor mu?


18

En fazla (hepsi değilse de) dinamik dillere bakıldığında (örneğin Python, PHP, Perl ve Ruby) hepsi yorumlanır. Yanlışsam düzelt. Derleme aşamasından geçen herhangi bir dinamik dil örneği var mı? Dinamik dil, yorumlanan dil ile aynı mıdır?


4
Dinamik dili tanımlayın, dinamik olarak mı yazılmış?
BenjaminB

3
Objective-C birçok "dinamik" özellik gösterir.
Edward Strange

4
@ İş, onlarca yıl Lisp ile bunu yapabilirdi. Ve hem derlenmiş hem de dinamik olarak yazılmıştır. Dolayısıyla, derleme ve yorumlama arasında hiçbir zaman kesin bir sınır yoktur.
SK-logic

2
@Darien Bunu çalışma zamanında da derleyebilir ve daha sonra kodu yürütebilirsiniz. Açıkçası, bu yorum değildir.
xmm0

3
@Darien Hiçbir şey, bir derleyicinin derlenmiş bir ikili dosyada sembol tablosu bilgilerini depolamasını ve çalışma zamanında buna erişmek için kod üretmesini engellemez. Bazı dillerin derlemeye göre daha fazla yoruma katkıda bulundukları doğrudur, ancak asıl mesele bu dil için bir derleyici bulundurmak mümkündür . Dikkat edilmesi gereken bir diğer önemli nokta, bazı kişilerin bir derleyicinin bir tür makine kodu üretmesi gerektiğini varsamasıdır. Uygulamada, iki dilde (hatta bazı Javascript miniförleri gibi aynı dilde) kaynak düzeyinde bir dönüşüm gerçekleştiren derleyiciler vardır.
xmm0

Yanıtlar:


33

En fazla (hepsi değilse de) dinamik dillere bakıldığında (yani Python, PHP, Perl ve Ruby) hepsi yorumlanır.

Doğru değil. Python kaynağını derleyebilirsiniz. Bu varoluşsal bir kanıt.

Statik olarak yazılan diller için tercümanlar ve dinamik olarak yazılan diller için derleyiciler vardır. İki kavram diktir.

Yan not: Genel olarak, bir dil sadece şudur: Anlambilimi ifade etmek için bir dizi sözdizimsel yapıya sahip bir dil. Bir beyaz tahtaya Python yazarsanız, buna hala Python denir! Bu var uygulama tercüman veya derleyici olabilir. Statik olarak yazılan veya dinamik olarak yazılan (her ikisinin de bir melezi) dilin bir özelliğidir, yorumlama veya derleme yoluyla bir program yürütme uygulamanın bir özelliğidir.


19
Python'un sözdizimsel olarak geçerli olması için girintiler bir beyaz tahtada hangi hassasiyetle eşleşmelidir? ;)
edA-qa mort-ora-y

1
Python'u derleyemezsiniz. PYC sadece bir modülün yükünü hızlandırır. Ve py2exe basitçe yorumlayıcıyı kaynak dosyayla exe'ye gömer.
BenjaminB

8
@ Ubiquité: .pycdosyalar bayt kodudur . Python kaynak kodu ayrıştırıldı, optimize edildi ve oluşturmak için derlendi . Bayt kodu talimatları nispeten üst düzeydir ve en popüler uygulaması düz bir yorumlayıcıdır (aksine, JIT'in bayt kodunu çalışma zamanında çok akıllı makine koduna derleyen PyPy'ye bakın), ancak Python Java'dan daha az derlenmemiş veya C #. Python, yalnızca "derleme" yerel zamanın erken derlemesiyle sınırlıysa "derlenmez" , ancak hiç kimse bununla ilgili bir şey söylemedi ve genellikle herhangi bir dil-dil dönüşümü anlamına gelebilir.

4
@ Ubiquité: Evet, bu doğru, ama bu "Python'u derleyemezsiniz " iddiası ya da Python'un derlenmesinin mümkün olup olmadığı iddiası ile hiçbir ilgisi yoktur . İlk ve en önemlisi, karıştırıyorsunuz Pythonve CPythonikincisi de öncekinin bir uygulamasıdır PyPy.
phant0m

2
@ClemC Bir dilin TÜM özellikleri bir derleyici veya yorumlayıcıda yerleşiktir, aksi takdirde yorumlayıcı veya derleyici başka bir dil için bir şeydir.
Pieter B

15

Ortak Lisp dinamik olarak (ve güçlü bir şekilde) yazılır ve genellikle derlenir .

Bu dinamiklik çalışma zamanında elde edildiğinden, derleyiciye bir sembolün yalnızca belirli bir tür değeri tutacağından emin olmak için kaynak kodunda kullanabileceğiniz bazı yönergeler vardır, böylece derleyici oluşturulan kodu optimize edebilir ve performansı artırabilir.


12

C # 4.0 dinamik türleri (geç bağlama) destekler ve derlenir.



3

Hayır - kesinlikle dinamik dilleri derlemek mümkün.

Her zaman tasarım tarafından derlenen bazı dinamik diller bile vardır (örn. Clojure).

Bununla birlikte, soru önemli bir ilgili noktaya değinmektedir: dinamik diller derlenebilse de, genellikle dinamik diller, statik olarak yazılan bir dil kadar verimli bir koda derlenemez . Bunun nedeni, dinamik olarak derlenen ve statik olarak derlenmiş bir dilde gereksiz olabilecek çalışma zamanı denetimleri gerektiren bazı doğal özellikler olmasıdır.

Bunun bir örneği: nesnelerin çalışma zamanı yamalamasına izin veren diller (örn. Ruby), nesne üzerinde bir yöntem çağırdığınızda, genellikle nesnenin incelenmesini (karma bir arama veya benzeri bir yöntemle) gerektirir. Bu derlenmiş olsa bile, derleyici çalışma zamanında yöntem araması yapmak için kod oluşturmak zorunda kalacak. Bir dereceye kadar bu yöntem araması, bir tercümanın yapması gerekenden farklı değildir.

Bu, Java gibi bir dildeki bir yöntem çağrısına kıyasla önemli bir ek yük ekler; burada doğru yöntem, derleyici tarafından sınıf tanımından statik olarak belirlenebilir ve yerel koddaki basit bir işlev çağrısına indirgenebilir.

Dinamik etkilerin, statik olarak derlenmiş meslektaşlarına göre ortalama olarak daha yavaş performansa neden olmasının, bu etkinin her şeyden çok olduğuna inanıyorum. Hatalı ölçütlerden görebileceğiniz gibi, sıralamanın altındaki dinamik dillerle (Perl, Python, Ruby, PHP vb.) En hızlı olma eğiliminde olan statik olarak yazılmış dillerdir (C, Java, Fortran vb.).


2

Bir zamanlar BASIC yorumlandı. BASIC'in bazı varyantlarında dinamik yazım vardı. Ve onlar için de derleyiciler alabilirsiniz.

(Bu, 100K disket sürücülerinde, dinozorların hala dünyayı dolaşıp kahvaltı için şüphesiz s / w geliştiricileri yediğinde geri döndü.)


... ancak sadece GOTO'ları kullandıklarında. (Tabii ki, TEMEL'de gelişiyorlarsa oldukça yaygındı. AHA! Bunu açıklıyor!)
Mason Wheeler

BASIC tasarım zamanında derlenmiş bir dildi.
AProgrammer

2

Farklı Smalltalk uygulamaları bunu farklı şekilde ele alır, ancak bazıları yüksek performanslı bir VM'de çalışan bayt kodları için derlenir.


2

Aslında, sözde "yorumlanmış" dillerin çoğu, daha hızlı çalışmasını sağlamak için tam zamanında derlemeye izin verir. Ve bazılarını çalıştırmadan önce bayt koduna derlemelisiniz.

Aslında, dinamik ve yorumlanmış bir ilişki olsa da, tamamen 2 farklı fikirdir. Dinamik yazmayı kimin hissettiğinin işini daha kolay ve daha hızlı hale getirmesinin nedeni, kodun biraz daha yavaş ama taşınabilir olmasını gerektirmez.


1

Chrome, IE9 ve Firefox 3.1+, JavaScript'i yerel ikili dosyalara derler ve JavaScript dinamik olarak yazılır.

Dinamik dillerin tarihsel olarak yorumlanma eğiliminde olmasının nedeni, dinamik yazma ve yorumlama (ya da daha spesifik olarak, derleme eksikliğinin) her ikisinin de komut dosyası yazma dillerinde ve genel olarak komut dosyası yazma görevlerinde faydalı özellikler olma eğiliminde olmalarıdır.

Performans da bu dillerde yazılmış program türleri için bir endişe kaynağı değildi (bu değildi), bu yüzden yine dinamik yazma ve yorumlama yükü, dillerde olduğu kadar büyük bir sorun değildi. bu değer performansı.


1

Python tipik olarak derlenir. Kuşkusuz, daha sonra yorumlanacak bayt koduna derlendi.

Perl de benzer şekilde çalışıyor.

Ortak Lisp, tipik olarak, yerel veya bayt kodlarından birine derlenir. Bu, uygulamalar arasında (ve çeşitli optimizasyon ayarlarına bağlı olarak bir uygulama içinde bir dereceye kadar) farklılık gösterir.


-5

Evet. Tüm dinamik diller yorumlanmış bir dildir (ancak yorumlanan bir dil dinamik olmayabilir).

Nedeni basit: Dinamik ise, dinamizmi ikili derleme düzeyinde gerçekleştirmek için bir tercümana ihtiyaç duyar.

ex. : bir veriyi bir PHP değişkenine koyduğumuzda, daha sonra farklı türde bir veri daha eklediğimizde, her türün kendi ikili gösterim formatına sahip olması nedeniyle programımız ikili koda derlenemedi; tercüman ikili seviyedeki değişimleri dinamik bir şekilde yönetir


2
Yanlış. Dinamik diller derlenebilir (ve bazen çok verimli bir şekilde, örneğin JIT ve uyarlanabilir derleme teknikleri kullanılarak)
Basile Starynkevitch

"Kabaca JIT derlemesi, derlenmiş kodun hızını yorumlama esnekliği ile bir yorumlayıcının yükü ile birleştirir ..." tr.wikipedia.org/wiki/Just-in-time_compilation programınız derlemez: sizin için tercüman
Ağustos'ta ClearMind


Elbette. Bağlantınızdan bahsediyor: "Benliğin bir özelliği, daha önceki Smalltalk sistemlerinin kullandığı aynı tür sanal makine sistemine dayanmasıdır. Yani, programlar C gibi dillerde olduğu gibi bağımsız varlıklar değildir, ancak tüm bellek ortamını çalıştırmak için. " tek başına değil = ikili değil derlenmiş sanal makine ikili derleme gerçekleştirmek için gereklidir
ClearMind

1
Derleyici tanımınız çok kısıtlayıcı. Her derleyici bir ikili yürütülebilir dosya üretmez. Yakın bir karşı örnek için, SBCL uygulamasını inceleyin . En son Ejderha Kitabı ve Lisp'i Küçük Parçalarda
Oku
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.