Yorumlanmış dili ne zaman derlenmiş dil üzerinde kullanacağımızın örnekleri?


11

Yorumlanan ve derlenen diller arasındaki farkları anlıyorum, ancak birisinin derlenmiş diller üzerinde yorumlanmış dilleri kullanması muhtemel durumların yanı sıra, yorumlanmış diller üzerinde derlenmiş dilleri kullanmasının muhtemel olduğu durumlar hakkında bazı örnekler verebilirse, gerçekten yardımcı ol.

Yanıtlar:


11

(Bildiğim kadarıyla) yorumlanmış bir “dil” ya da derlenmiş bir “dil” diye bir şey yoktur.

Diller, kodun anahtar sözcükleri, akış yapıları ve diğer çeşitli şeylerin sözdizimini ve anlamını belirtir, ancak bunun dil spesifikasyonunda derlenip yorumlanmayacağını belirten bir dil bilmiyorum.

Şimdi, eğer bir dil derleyicisini bir dil tercümanına karşı kullandığınızda şüphe ediyorsanız, derleyicinin pro / con'larına ve tercümana ve projenin amacına gerçekten gelir.

Örneğin, MRuby derleyicisini, MRI ruby ​​interpreter yerine java kütüphaneleriyle daha kolay entegrasyon için kullanabilirsiniz. JRuby üzerinde MRI yakut yorumlayıcısını kullanmak için muhtemelen nedenler de var, ancak bu dili bilmiyorum ve bununla konuşamıyorum.

Tercümanların faydaları:

  • Hiçbir derleme, kodu düzenlemeden uygulamanın test edilmesine kadar geçen sürenin azalabileceği anlamına gelir
  • Birden fazla mimari için ikili dosyalar oluşturmaya gerek yoktur çünkü yorumlayıcı mimari soyutlamayı yönetir (yine de tamsayı boyutlarını doğru bir şekilde işleyen komut dosyaları için endişelenmeniz gerekebilir , sadece ikili dağıtım değil)

Derleyicilerin avantajları:

  • Derlenmiş yerel kod bir tercümanın yükünü taşımamaktadır ve bu nedenle zaman ve mekanda genellikle daha verimlidir
  • Birlikte çalışabilirlik genellikle daha iyidir, komut dosyalarıyla proc-içi birlikte çalışmanın tek yolu standart bir FFI yerine bir yorumlayıcıdır
  • Yorumlayıcının derlenmediği mimarileri destekleme yeteneği (gömülü sistemler gibi)

Ancak, vakaların% 90'ında bahse girerim, bunun gibi bir şeye gider: Bu yazılımı blub'a yazmak istiyorum çünkü iyi biliyorum ve iyi bir iş çıkarmalı. Blub yorumlayıcısını (veya derleyicisini) kullanacağım çünkü blub'da yazılım yazmak için genel kabul gören kanonik yöntemdir.

Yani TL; DR belirli kullanımlar için derleyici vs tercüman vaka bazında karşılaştırarak bir davada, temelde.

Ayrıca, FFI: Yabancı Fonksiyon Arayüzü, diğer bir deyişle diğer dillerle birlikte çalışmak için arayüz. Vikipedi'de daha fazla okuma


2
Bildiğim kadarıyla, işletim sistemi için UNIX için ksh gibi bazı komut dilleri derlenemez.
NoChance

@delnan, benim bildiğim ticari veya ücretsiz bir yazılımla derlenemez, teknik nedenlerden dolayı derlenemez.
NoChance

3
@EmmadKareem "Derlenemez" diye bir şey yoktur. Li dilinde bir program okuyan ve La dilinde eşdeğer bir program çıkaran bir program yazıyorsunuz.Bu bir derleyici. Pratikte kırmızı bir ringa balığı olduğu için turing tamlık argümanını çağırmaktan çekinmeyin, ancak her program sonuçta bir dizi makine kodu talimatına dönüşür. Her şey başarısız olursa, yorumlayıcı döngüsünü açın (ve artık ihtiyacınız olmayan parçaları kaldırmak için ortaya çıkan kodu basitleştirin). Tercüman, tercüman içermeyen bir dilde yazılmışsa, bir derleyiciye bir şey çarpana kadar tekrarlayın.

1
(Yorumumu daha iyi ifade etmek için düzelttim, ama görünüşe göre çok geç davrandım.) @EmmadKareem Evet, açıkçası bazı diller hiçbir zaman bir derleyici aracılığıyla uygulanmadı. Ancak bunun ne kadar alakalı olduğunu göremiyorum. Bunu yapmak her zaman mümkün ve mümkündür ve her zaman biraz çaba ile yapılabilir. Bu, ana noktanın bir sonucudur, yani bir dil doğal olarak derlenmez veya yorumlanmaz ve her iki şekilde de uygulanabilir. Ve sayısız başka yollarla (iyi, tartışmasız küçük varyantlar ve remixler) bu arada.

2
@EmmadKareem isterseniz ksh dil spesifikasyonunu alıp, onu okuyan ve yerel bir ikili oluşturan bir derleyici yazabilirsiniz. Derlenen ya da yorumlanan dil, bir dilin tanımında değil.
Jimmy Hoffa

8

Burada önemli olan nokta, pek çok dil uygulamasının aslında her ikisinin de bir çeşit melezi olmasıdır. Günümüzde yaygın olarak kullanılan birçok dil, bir programı bayt kodu gibi bir ara biçime derleyerek ve daha sonra bunu bir tercümanda çalıştırarak çalışır. Java, C #, Python, Ruby ve Lua genellikle bu şekilde uygulanır. Aslında, günümüzde kullanılan dillerin çoğu bu şekilde uygulanmaktadır. Gerçek şu ki, dil bugün kodlarını hem yorumlar hem de derler. Bu dillerden bazıları, bayt kodunu yürütmek üzere yerel koda dönüştürmek için ek bir JIT derleyicisine sahiptir.

Bence, bugünün dil uygulamalarının karmaşıklıklarını ayırt etmek için artık yararlı kategoriler olmadığından, yorumlanmış ve derlenmiş diller hakkında konuşmayı bırakmalıyız.

Yorumlanan ve derlenen dillerin yararlarını sorduğunuzda, muhtemelen başka bir şey ifade edersiniz. Statik / dinamik yazmanın değeri, yerel yürütülebilir dosyaları dağıtmanın avantajları, JIT ve AOT derlemesinin göreceli avantajları hakkında soru sorabilirsiniz. Bunların hepsi yorumlama / derleme ile ilgili olan ancak farklı konulardır.


2

Her şeyden önce, bir programlama dili hem yorumlanabilir hem de derlenebilir. Yorumlama ve derleme sadece kaynak koddan yürütülebilir kod üretme yöntemleridir. Bir yorumlayıcı ile kaynak kodu, daha sonra kodu yorumlarken yürüten bir yorumlayıcı tarafından okunur ve yorumlanır . Öte yandan bir derleyici kaynak kodunu okur ve kaynak kodundan yürütülebilir bir ikili dosya oluşturur - böylece program bağımsız olarak ayrı bir işlem olarak çalıştırılabilir.

Şimdi herkes merak etmeden önce ... Evet, C / C ++ / C # / Java yorumlanabilir ve evet, JavaScript ve Bash komut dosyaları derlenebilir. Yine de bu diller için çalışan tercümanlar veya derleyiciler olup olmadığı başka bir sorudur.

Şimdi "derlenmiş dil" üzerinde "yorumlanmış dil" i ne zaman kullanacağımızı soruyu yanıtlamak için. Sorunun kendisi biraz kafa karıştırıcı, ama bunun derleme üzerine yorumlamayı ne zaman tercih edeceğinizi varsayıyorum. Derlemenin dezavantajlarından biri, derleme işlemi nedeniyle bazı ek yükler oluşturmasıdır - kaynak kodunun yürütülebilir makine koduna derlenmesi gerekir, bu nedenle bir programı yürütmek için kaynak kodunu çağırırken minimum gecikme gerektiren görevler için uygun değildir . Öte yandan derlenmiş kaynak kodu, kodun yorumlanmasından kaynaklanan ek yük nedeniyle hemen hemen her zaman eşdeğer yorumlanmış kaynak kodundan daha hızlıdır . Diğer yandan tercümanlar çağırabilir ve çalıştırabilir kaynak kodunu çok az tahrik yükü ile, ancak çalışma zamanı performansı pahasına.

Sonunda ne zaman birbiri ardına tercih edileceğine dair kesin kullanım durumlarından bahsetmek neredeyse imkansız , ancak örneğin bir programın kodunun program çağrıları arasında dinamik olarak değiştiği ve derlemenin yükü de değiştiği zaman uygulanabilir bir seçim olması için yüksek. Bu durumda, derleme yerine kaynak kodunun yorumlanması muhtemelen arzu edilir.

Ancak, gerçek dünya örneği olarak kabul edilebilecek bir şey var : konuşlandırıldığında hidnig kaynak kodu. ile doğalderlenmiş kod geliştirici programın ve verilerin yürütülebilir macine kodunu dağıtır. Yorumlanan kodla, kaynak kodun kendisinin konuşlandırılması gerekir; bu kod daha sonra yerel makine kodunu tersine mühendislikten çok daha az çabayla incelenebilir ve tersine mühendislikle yapılabilir. Bunun bir istisnası, anında dil / bayt kodunu (C # için MSIL ve Java için Java bayt kodu) derleyen ve daha sonra çalışma zamanında "tam zamanında" dağıtılan ve derlenen bir yorumlayıcı gibi derlenen C # ve Java gibi dillerdir. Bununla birlikte, MSIL ve Java Bytecode için orijinal kaynak kodunu nispeten iyi bir doğrulukla yeniden oluşturabilen sözde dekompeller vardır ve bu tür ters mühendislik bu tür ürünler yerel makine kodunda konuşlandırılmış ters mühendislik ürünlerinden çok daha önemsizdir.


1
İyi bir noktaya değiniyorsunuz, ama bilgiçim, bazı ifadelerle (her ikisi de üçüncü paragrafa atıfta bulunarak) sorun yaşıyorum: 1. Bir tercüman derlemiyor. 2. Kötü optimize edici olmayan bir derleyicinin yüksek düzeyde optimize edilmiş (özellikle bytecode tabanlı) bir yorumlayıcı tarafından dövülmesi (bu koşullar nadir olmasına rağmen) yanıcıdır. JIT derleyicilerini tercümanlar altında saydığınızda bu iki katına çıkar (bunu yapmamayı tercih ederim, ancak bazı insanlar bunu yapar).

@delnan Belki de kötü ifade edilmiştir, ben anadili İngilizce değilim. Ancak, üçüncü paragrafa göre, bir tercümanın derleneceği anlamına gelmez. İkinci nokta için, derleyici ve yorumlanmış kodun zayıf derleyici ve yüksek performanslı yorumlayıcı durumlarını dışlamak için benzerlik vurgusu eşdeğer kelimesine vurgu yaptım, belki de bununla net değilim, ancak görmüyorum kaynak kodu yürütme farkları arasında derleme veya
yineleme

Üzgünüm, ilk noktaya gelince, bir şeyi yanlış okudum. Mea Culpa. İkinci noktaya gelince: Yorumlanan veya derlenen koda atıfta bulunmak için "eşdeğer" aldım (ve derleyici ve yorumlayıcıyı karşılaştırmak, temelde farklı şeyler yaptıkları için çok mantıklı değil). Ben bir kez benim örnekte olduğu gibi tuhaf davalarının ayrıntılı atık gerektiğini sanmıyorum, ama ben açıklayan bir cümle düzeltilmesi lehine "her zaman" bırakarak tercih ediyorum neden o olabilir daha hızlı ilk etapta be: Hayır tercüman havai [hangi olmalıdır IMHO] ve çalışma zamanından önce optimizasyon gerçekleştirme fırsatı sunar.

1

Yorumlanmış bir dil kullandığınızda aşağıdaki senaryoları düşünebilirim :

  • Linux / Unix kabuk komut dosyaları gibi bir derleyicinin olmadığı yerler .
  • Küçük bir sorunu çözen hızlı ve kirli komut dosyaları
  • Dinamik HTML sayfaları yazmayı kolaylaştıran ve genellikle JSP gibi yorumlanan diller (Tomcat bunu çalıştırmak için bir sunucu previosuna derler), PHP, ASP vb.

Kodunuzu derlemek istediğinizde aşağıdaki senaryoları düşünebilirim :

  • Uygulamanız kapalı kaynak olduğundan ve kaynak kodunuzu vermek istemediğiniz için ikili dosyaları dağıtmanız gerekir .
  • Hız, gömülü sistemler ve benzerleri gibi.
  • Yalnızca katı bir dilde yazılmış bir derleyicinin size verebileceği bir kod türü güvenliği düzeyine ihtiyacınız vardır . Derleyiciler, kaynak kodunuzun her köşesinde ve baş harflerinde yazım hataları ortaya koyarken, yorumlanmış programlarda yazım hataları, üretim koduna keşfedilemez.
  • Büyük , karmaşık sistemler: bir işletim sistemi veya ofis kıyafeti derlenmiş ikili dosyalardan başka bir şey olarak hayal edemezsiniz.
  • Her küçük yükü yoldan çıkarmak istiyorsunuz ve montajcı snippet'leriyle (özellikle bir tercümanla her türlü çalışma zamanında zor) iyi iletişime ihtiyacınız var (bu nokta @delnam yorumuyla ortaya çıkıyor)

3
Bir dil yorumlayıcısı, dili daha az güçlü bir şekilde yazmaz. Haskell son derece güçlü yazılmıştır ve etkili bir şekilde yorumlamak için GHCI kullanabilirsiniz. Güçlü / zayıf yazma, bir derleyicinin veya yorumlayıcının değil, dilin veçheleridir.
Jimmy Hoffa

1
-1 Derleme profesyonellerinde: (1) Derleme kodu tersine mühendislikten korunmaz, sadece biraz daha zorlaştırır. (2) Derleme (yorumlayıcı ek yükünün kaldırılması, uygulama kodunun otomatik optimizasyonu) yalnızca bir performans kaynağıdır ve bir insan uzman tarafından elle yapılan büyük ölçekli optimizasyonlarla aşılır. (3) Tip kontrolü, genellikle derleme ile birleştiğinde, ondan bağımsızdır. Tip denetleyicisi statik bir analiz geçişidir; kod yayınlamadan ve kodu yorumlamadan önce olabilir. (4) Oldukça sahte görünüyor. Bunu "hayal bile edemezsiniz"? Neden? Nasıl gerekli?

1
Diğer yorumlanmış diller, başka bir programda bir tercüman olduğunda mevcuttur. Tercüman desenini her kullandığında, bazı karmaşıklıkların yorumlanmış bir dili vardır.

3
"betikler" mutlaka yorumlanmamaktadır. Birçok "komut dosyası" dili , daha sonra yürütülen bir sanal makine için bayt koduna derlenir (bkz. Lua, perl, python, ruby). Bu ve java arasında derlemenin gerçekleştiği zaman dışında gerçek bir fark yoktur.

3
+1, bence bu OP'nin gerçekten peşinde olduğu türden bir cevaptır ve puanlar belirtildiği gibi% 100 doğru olmasa da, pratik hususlar için en az% 95 doğrudur.
Doc Brown

1

Sonuçta, büyük değiş tokuş üretkenlik (kaç satır kod yazmanız gerektiğini) ve performans (programınızın ne kadar hızlı çalışacağı) arasındadır.

Çünkü dilleri yorumlanır fazla bilgiye sahip işlemci bilgilere dönüştürülmüş, onlar güvenebilirsiniz yansıma ve dinamik yazarak büyük ölçüde verimliliği artırmak . Yorumlanan dillerin diğer bir avantajı, platform için bir tercüman olduğu sürece platformdan bağımsız olmalarıdır.

CPU, dil kodunu makine kodunda dönüştürmemesi ve kodu aynı anda çalıştırmaması gerektiğinden, yorumlanan durumda olduğu gibi, derlenmiş diller daha hızlı programlar sağlar. Ayrıca, derlenmiş bir dilde oluşturulan bir sistem daha güvenlidir, çünkü derleme zamanında sorunları algılayabilir, bu da sadece programı gerçekten çalıştırdığınızda görmek yerine, yazarken (modern IDE'lerle) bir hata gördüğünüz anlamına gelir . , bu mantıksal hataları düzeltmez).

Bunu bilerek, yorumlanan diller aşağıdakiler için uygundur:

  1. Üretken geliştirme: hızlı web geliştirme (PHP, Javascript) veya prototip oluşturma için.
  2. Çapraz-Platform; örneğin JavaScript her tarayıcıda (mobil tarayıcılar dahil) desteklenir.

Ve derlenmiş diller şu durumlarda uygundur:

  1. Performans kritiktir (işletim sistemleri) veya kaynaklar azdır (mikrodenetleyiciler).
  2. Kurulacak sistemler karmaşıktır; büyük sistemler (kurumsal sistemler) derlenmiş diller oluşturmak, yorumlanmış dillerde görünebilecek birçok olası hatayı işlemek için esastır; karmaşık programlar da birçok kaynak gerektirir ve denge derlenmiş dillere de yatkındır.

-1 çünkü yorumlanan tüm dillerin dinamik olarak yazıldığını ve derlenen tüm dillerin statik olarak yazıldığını ima edersiniz, ki bu tamamen doğru değildir.
Daniel Pryden

@DanielPryden O zaman saf tesadüf olmalı, neredeyse tüm yorumlanmış dillerin dinamik olarak yazılması ve derlenenlerin statik olarak yazılması? Dinamik tip modelin yorumlanmış diller için uygun olması bir tesadüf mü?
m3th0dman

Çeşitli nedenlerden dolayı, bir korelasyon vardır, ancak bu bir zorunluluk değildir. Bu aslında StackOverflow üzerinde sorulmuştur: Neden derlenmiş güçlü yazarak yorumlanmış langs çoğunlukla ducktyped vardır?
Daniel Pryden

1
Erlang derlenir ve dinamik olarak yazılır. Haskell statik olarak yazılmıştır ve derlenebilir veya yorumlanabilir
Zachary K

1
@ZacharyK Erlang'ın çalışma zamanı sistemi vardır; Haskell, vakaların çoğunda derlenir (yazılan programlar).
m3th0dman

1

Diğerlerinin bahsettiği nedenlerin yanı sıra, herhangi bir derleme veya herhangi bir melez yaklaşım üzerine geçici bir yorum seçmek için özellikle önemli bir kullanım durumu vardır.

Bir iletişim dili olarak bir programlama dili kullanılıyorsa ve yanıt gecikmesi önemli olduğunda, derleme ve olası önişlemede zaman kaybetmemek daha mantıklıdır.

Bu, örneğin ajan dilleri için veya örneğin normalde Tcl / Tk'nin nasıl kullanıldığı için geçerlidir.

Yorumlamaya bağlı kalmanın bir başka olası nedeni, bir dil yorumlayıcısının kendisini önyüklemek için veya daha ayrıntılı, daha üst düzey bir dilde kullanılması ve basitliğinin önyükleme işlemi performansından daha önemli olmasıdır.

Neredeyse diğer olası kullanım durumlarında, derleme (veya karma bir yaklaşım) daha iyi bir seçimdir.

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.