Derlenmiş ve yorumlanmış dil arasındaki fark nedir?


118

Bu konuyla ilgili bazı materyalleri okuduktan sonra, derlenmiş bir dil ile yorumlanmış bir dil arasındaki farkın ne olduğundan hala emin değilim. Bunun Java ve JavaScript arasındaki farklardan biri olduğu söylendi. Lütfen birisi bunu anlamama yardım eder mi?

Yanıtlar:


165

Derlenmiş ve yorumlanmış dil arasındaki fark nedir?

Fark dilde değil ; içinde bulunduğu uygulanması .

Bunu sistemimden çıkardıktan sonra, işte bir cevap:

  • Derlenmiş bir uygulamada, orijinal program, doğrudan donanım tarafından yürütülen yerel makine talimatlarına çevrilir.

  • Yorumlanmış bir uygulamada, orijinal program başka bir şeye çevrilir. "Yorumlayıcı" adı verilen başka bir program daha sonra "başka bir şeyi" inceler ve gerekli eylemleri gerçekleştirir. Dile ve uygulanmasına bağlı olarak, "başka bir şeyin" çeşitli biçimleri vardır. Daha popülerden daha az popüler olana, "başka bir şey" olabilir

    • Lua, Python, Ruby, Smalltalk ve diğer birçok sistemde yapıldığı gibi , genellikle bayt kodu olarak adlandırılan bir sanal makine için ikili talimatlar (yaklaşım 1970'lerde UCSD P-sistemi ve UCSD Pascal tarafından popüler hale getirildi)

    • Birçok prototip veya eğitim tercümanı için yapıldığı gibi, soyut sözdizimi ağacı gibi orijinal programın ağaç benzeri bir temsili

    • Kaynak programın Tcl'ye benzer belirteçli bir gösterimi

    • MINT ve TRAC'ta yapıldığı gibi kaynak programın karakterleri

Sorunu karmaşıklaştıran bir şey, bayt kodunu yerel makine talimatlarına çevirmenin (derlemenin) mümkün olmasıdır . Bu nedenle, başarılı bir yorumlanmış uygulama sonunda bir derleyici edinebilir. Derleyici dinamik olarak sahne arkasında çalışıyorsa, genellikle tam zamanında derleyici veya JIT derleyicisi olarak adlandırılır. JIT'ler Java, JavaScript, Lua için geliştirilmiştir ve diğer birçok dili de söyleyebilirim. Bu noktada, bazı kodların yorumlandığı ve bazı kodların derlendiği karma bir uygulamaya sahip olabilirsiniz.


7
Efendim, şu sorularım var 1. Bu "başka bir şey" hangi dilde yazılıyor? 2. JavaScript bağlamında, tarayıcıdan tarayıcıya değişen "başka bir şey" midir? 3. Diyelim ki komut dizim Google Chrome ve Internet Explorer'da çalışıyor, her iki tarayıcıda da aynı şekilde mi yorumlanıyor?
JavaHopper

@Norman bu harika bir açıklamaydı. Ancak, hala sahip olduğum birkaç kafa karışıklığı var. Derlenmiş bir uygulamada, orijinal program yerel makine talimatlarına dönüştürülür. Nasıl olur? Örneğin, C'nin derlemeden sonra montaj kodunu üreteceğini düşündüm, bu da yine de yerel bir derleyici tarafından temeldeki makinenin makine koduna birleştirilmesi gerekiyor. Öyleyse, yorumlanmış bir dil durumunda aynı şeyi yapan bir VM'den (python veya JVM vb.) Ne kadar farklıdır?
qre0ct

58

Java ve JavaScript, bu farkı göstermek için oldukça kötü bir örnektir , çünkü ikisi de yorumlanmış dillerdir . Java (yorumlanmış) ve C (veya C ++) (derlenmiş) daha iyi bir örnek olabilirdi.

Neden üstü çizili metin? As Bu cevap doğru işaret değil dil hakkında, bir dilin somut uygulaması hakkında derlenmiş / edilir yorumlanır se başına . "C derlenmiş bir dildir" gibi ifadeler genellikle doğru olsa da, birinin C dili tercümanı yazmasını engelleyecek hiçbir şey yoktur. Aslında, C için tercümanlar var .

Temel olarak, derlenen kod doğrudan bilgisayarın CPU'su tarafından çalıştırılabilir. Yani çalıştırılabilir kod, CPU'nun "yerel" dilinde ( assembly dili ) belirtilir.

Yorumlanan dillerin kodu, herhangi bir formattan CPU makine talimatlarına çalışma zamanında çevrilmelidir. Bu çeviri bir tercüman tarafından yapılır.

Bunu anlatmanın başka bir yolu yorumlanmış olmasıdır dillerdir kod makine talimatlarına adım adım çevrilmiştir ise programı yürütülürken derlenmiş iken, dil bilgisi kod tercüme edilmiştir önce program yürütme.


8
Java yorumlanıyor mu? Wikipedia'dan: "Java uygulamaları genellikle bilgisayar mimarisinden bağımsız olarak herhangi bir Java Sanal Makinesi (JVM) üzerinde çalışabilen bayt koduna (sınıf dosyası) derlenir."
Personman

6
@Personman, işletim sisteminin kendisi değil, JVM kodu yürüttüğü için teknik olarak "yorumlanan". Modern işletim sistemlerinin karmaşıklığının çoğu durumda farkı temelde ilgisiz hale getirdiği söylenebileceği gibi, bu artık gerçekten anlamsal bir farklılıktır. Uygulamayı çalıştıran işletim sistemi ile kodu çalıştıran bir uygulamayı çalıştıran işletim sistemi arasındaki farktan bahsediyorsunuz.
GrayWizardx

5
Sanırım sınıf dosyalarının kendilerinin Java VM tarafından yorumlandığını söylüyorsunuz. Bu biraz mantıklı, ancak java kaynağı gerçekten Java VM bayt koduna derlenmiştir. VM'nin onu başka bir mimarinin makine koduna yorumlamasını gerektirmeyen fiziksel bir Java Makinesi oluşturabilirsiniz. Bu yüzden Java'nın derlendiğini söylemek daha doğru görünüyor. Yine de, bu ayrımın kafa karıştırıcı ve biraz keyfi olduğuna dair iyi bir örnek. Sonuçta, derlenen C CPU tarafından yorumlanır, değil mi?
Personman

13
Java, derlenmiş veya yorumlanmış bir dilin oldukça kötü bir örneğidir, çünkü aslında ikisi birden. Bir karşılaştırma yapacak olsaydım, herhangi bir karışıklığı önlemek için C ve Lisp ile giderdim.
Bill the Lizard

7
@stakx - aslında Java bayt kodları normalde bir JIT derleyicisi tarafından yerel koda göre derlenir. Saf yorumlayıcı davranışı elde etmenin tek yolu, JVM başlatıldığında JIT derleyicisini açıkça kapatmaktır.
Stephen C

15

Derleyici ile Tercüman Dili arasındaki Temel Fark şu şekildedir.

Derleyici Dili

  • Tüm programı tek bir girdi olarak alır ve dosyada depolanan nesne koduna dönüştürür.
  • Ara Nesne kodu üretilir
  • örneğin: C, C ++
  • Derlenen programlar daha hızlı çalışır çünkü derleme yürütülmeden önce yapılır.
  • Bellek gereksinimi, nesne kodunun oluşturulması nedeniyle daha fazladır.
  • Tüm program derlendikten sonra hata görüntüleniyor
  • Kaynak kodu - Derleyici - Makine Kodu - Çıkış

Tercüman Dili:

  • Tek bir komutu tek giriş olarak alır ve komutları yürütür.
  • Ara Nesne kodu OLUŞTURULMAZ
  • örneğin: Perl, Python, Matlab
  • Yorumlanan programlar daha yavaş çalışır çünkü derleme ve yürütme aynı anda gerçekleşir.
  • Bellek gereksinimi daha azdır.
  • Her bir talimat için hata görüntülenir.
  • Kaynak Kodu - Yorumlayıcı - Çıktı

5

Bir derleyici, genel olarak, daha yüksek seviyeli dil bilgisayar kodunu okur ve bunu p-koduna veya yerel makine koduna dönüştürür. Bir yorumlayıcı doğrudan p kodundan veya Basic veya Lisp gibi yorumlanan bir koddan çalışır. Tipik olarak, derlenmiş kod çok daha hızlı çalışır, daha kompakttır ve tüm sözdizimi hatalarını ve yasadışı referans hatalarının çoğunu zaten bulmuştur. Yorumlanan kod, yalnızca uygulama etkilenen kodu yorumlamaya çalıştıktan sonra bu tür hataları bulur. Yorumlanan kod genellikle yalnızca bir kez veya en fazla birkaç kez veya belki de prototipleme için kullanılacak basit uygulamalar için iyidir. Derlenmiş kod, ciddi uygulamalar için daha iyidir. Bir derleyici önce tüm programı alır, hataları kontrol eder, derler ve sonra çalıştırır. Oysa bir tercüman bunu satır satır yapar, yani bir satır alır, hatalara karşı kontrol eder,

Daha fazla bilgiye ihtiyacınız varsa, "derleyici ve yorumlayıcı arasındaki fark" için sadece Google.


3
Umm, ilk iki ifadenin ötesinde bunlardan bazılarını nereden aldığınızdan emin değilim. Bu, birkaç nesil önce birçok yorumlanmış dilde teknik olarak doğruydu, ancak platforma ve ayrıntılara gösterilen ilgiye bağlı olarak, belirli etkinlikler için derlenmiş koda yakın veya aynı zamanda derlenmiş kodda çalışan bir kodun yorumlanması mümkündür.
GrayWizardx

Günümüzde neredeyse tüm programlama dünyasını dolduran Java, C # ve JavaScript gibi dillerin, "Derlenmiş kod ciddi uygulamalar için daha iyidir" demek haksızlık olacaktır.
Sisir

2

Bu çok belirsiz bir ayrımdır ve aslında genellikle bir dilin kendisinin bir özelliği değildir, daha ziyade o dilde kodu çalıştırmak için kullandığınız programın bir özelliği.

Bununla birlikte, çoğu dil öncelikle bir biçimde veya diğerinde kullanılır ve evet, Java esasen her zaman derlenirken, javascript esasen her zaman yorumlanır.

Kaynak kodu derlemek, çalıştırıldığında kaynak tarafından tanımlanan davranışa sahip ikili, yürütülebilir bir dosya oluşturan bir programı çalıştırmaktır. Örneğin, javac, insan tarafından okunabilen .java dosyalarını makine tarafından okunabilir .class dosyalarına derler.

Kaynak kodu yorumlamak için, üzerinde bir ara dosya oluşturmadan, tanımlanmış davranışı hemen üreten bir program çalıştırılır. Örneğin, web tarayıcınız stackoverflow.com'u yüklediğinde, bir grup javascript'i (sayfa kaynağını görüntüleyerek bakabilirsiniz) yorumlar ve bu sayfaların sahip olduğu pek çok güzel etkiyi üretir - örneğin, yukarı oylama veya küçük bilgilendirici üstteki çubuklar.


Java ilk önce bayt kodunu çevirirken ve yalnızca JVM yürütülürken bunu makine koduna dönüştürür; Derlendiğini ve yorumlanmadığını söylemek doğru mu?
Sisir

1
Sanırım Java bayt kodunun yorumlandığını söyleyebilirsin, elbette, ama kimse Java bayt kodu yazmıyor. Java'nın kendisi genellikle bayt koduna göre derlenir.
Personman

2

Yorumlanan dil, çalışma zamanında kabuk komut dosyası oluşturma gibi talimatlara göre yürütülür ve derlenen dil, derlenen (CPU'nun anlayabileceği Assembly diline değiştirilen) ve ardından c ++ 'daki gibi çalıştırılan bir dildir.


0

Diğerlerinin de söylediği gibi, derlenmiş ve yorumlanmış bir programlama dilinin uygulanmasına özgüdür ; bunlar değil dille doğasında. Örneğin, C tercümanları var.

Bununla birlikte, programlama dillerini en yaygın (bazen kanonik) uygulamasına göre sınıflandırabiliriz (ve pratikte yaparız). Örneğin, C derlendi diyoruz.

İlk olarak, yorumlayıcıları ve derleyicileri belirsizlik olmadan tanımlamalıyız:

Bir yorumlayıcı dil için X herhangi bir program yürüten bir program (veya bir makine ya da genel olarak mekanizmanın sadece bir tür) bir p dili ile yazılmış X bu etkiler yapar ve tarifname tarafından öngörülen sonuçları değerlendirir bu şekilde X .

Bir derleyici gelen X ile Y herhangi bir program çeviren bir program (veya bir makine ya da genel olarak mekanizmanın sadece bir tür) bir p bir dil gelen X bir anlama sahip programı içine p' bir dil içinde Y yorumlamak bu şekilde p ' için tercüman Y aynı sonucu ve yorumlama ile aynı etkilere sahip olacaktır p için tercüman X .

Bir programcı bakış açısından, CPU'ların kendi ana makine dilleri için makine tercümanları olduğuna dikkat edin.

Şimdi, en yaygın uygulamasına bağlı olarak programlama dillerini 3 kategoride geçici olarak sınıflandırabiliriz:

  • Zor Derlenmiş diller: Programlar tamamen makine diline göre derlendiğinde. Kullanılan tek yorumlayıcı bir CPU'dur. Örnek: Genellikle, bir programı C'de çalıştırmak için, kaynak kodu daha sonra bir CPU tarafından çalıştırılan makine diline derlenir.
  • Yorumlanan diller: Orijinal programın herhangi bir kısmının makine diline derlenmesi olmadığında. Başka bir deyişle, yeni makine kodu üretilmez; sadece mevcut makine kodu yürütülür. CPU dışında bir yorumlayıcı da kullanılmalıdır (genellikle bir program). Örnek: Python'un kanonik uygulamasında, kaynak kodu önce Python bayt koduna derlenir ve sonra bu bayt kodu, Python bayt kodu için bir yorumlayıcı program olan CPython tarafından yürütülür .
  • Yumuşak Derlenmiş diller: CPU dışında bir yorumlayıcı kullanıldığında, ancak orijinal programın bazı kısımları da makine diline göre derlenebilir. Bu, kaynak kodunun önce bayt koduna derlendiği ve ardından bayt kodunun Java Yorumlayıcısı tarafından yorumlanabileceği ve / veya JIT derleyicisi tarafından daha fazla derlendiği Java örneğidir.

Bazen, yumuşak ve zor derlenmiş dillere basitçe derlenmiş olarak atıfta bulunulur, bu nedenle C #, Java, C, C ++ 'nın derlendiği söylenir.

Bu kategorizasyon içinde, JavaScript yorumlanmış bir dildi, ancak bu yıllar önceydi. Günümüzde, çoğu büyük JavaScript uygulamasında yerel makine diline JIT tarafından derlenmiştir, bu yüzden yumuşak derlenmiş dillere düştüğünü söyleyebilirim.

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.