Yorumlanan vs Derlenmiş: Yararlı bir ayrım?


29

Burada, derlenmiş dilin uyguladığı yorumlanmış ve yorumlanmış birçok soru var. Ayrımın gerçekten bir anlam ifade edip etmediğini merak ediyorum. (Aslında sorular genellikle dillerle ilgilidir, ancak gerçekten bu dillerin en popüler uygulamaları hakkında düşünüyorlar).

Bugün neredeyse hiçbir uygulama kesinlikle yorumlanmıyor. yani hemen hemen hiç kimse kodu bir seferde bir satır ayrıştırmaz ve çalıştırmaz. Ek olarak, makine kodunu derleyen uygulama da daha az yaygın hale geliyor. Artan bir şekilde, derleyiciler bir çeşit sanal makineyi hedeflemektedir.

Aslında, çoğu uygulama aynı temel strateji üzerinde birleşiyor. Derleyici, bir JIT aracılığıyla yorumlanan veya yerel koda derlenen bayt kodunu üretir. Bu, geleneksel derleme ve yorumlama fikirlerinin bir karışımıdır.

Böylece şunu soruyorum: Bugünlerde yorumlanmış uygulamalar ile derlenmiş uygulama arasında faydalı bir ayrım var mı?


7
@DeadMG Sandığınız kadar yeni değil: Tam zamanında ... kısa bir tarih ...
yannis

4
@DeadMG Son 10 yılda tanıtılan yeni dillerin büyük çoğunluğunun öncelikle bir tür VM'de çalıştığı göz önüne alındığında, bir noktaya sahip olduğunu söyleyebilirim. Tabii ki hala yerel kodlara göre derlenmiş diller var (ve gelecek on yıl olacak) ve bir JIT lüks kalacak (PyPy'lerin kendi yollarına sahip olması halinde olmayacak). Yani evet, olası abartı, ama ana akımın (şimdilik ve yakın gelecekte) bytecode compiler + muhtemelen JIT olarak göründüğünü kabul ediyorum.

4
@DeadMG, VM modeli sizin için "yeni" ise, uzun beyaz bir sakalınızın olması gerekir. P-codeilk olarak 1966'da tanıtılmıştı. IBM Aix 1986’dan beri hizmetinizde.
SK-mantık

6
Unix kabukları, Tcl ve benzerleri gibi şeyler her zaman tamamen yorumlanır, bu nedenle ayrım en azından akademik bir CS'de anlamlı olur. Ancak kodlayıcıların tercümanlar ve derleyiciler hakkında mırıldandığı durumlarda çoğu durumda hiçbir anlam ifade etmedikleri doğrudur.
SK-mantık

3
@ SK-mantık, yorumunuzu daha iyi bir cevap olduğunu düşünüyorum sonra aslında cevapların herhangi biri
Winston Ewert

Yanıtlar:


23

Yorumlamanın ve derlemenin sadece birbirimize alternatif olmadığını hatırlamak önemlidir. Sonunda, yazdığınız herhangi bir program (makine koduna derlenmiş olanlar dahil) yorumlanır. Kodu yorumlamak basitçe bir dizi talimat almak ve bir cevap vermek anlamına gelir.

Öte yandan, derleme, bir programı bir dile başka bir dile çevirmek anlamına gelir. Genellikle, derleme gerçekleştiğinde, kodun "daha düşük seviyeli" bir dilde derlendiği varsayılır (örneğin, makine kodu, bir tür VM bayt kodu vb.). Bu derlenmiş kod daha sonra hala yorumlanmaktadır.

Tercüme edilmiş ve derlenmiş diller arasında yararlı bir ayrım olup olmadığı sorusuna gelince, benim kişisel görüşüm, herkesin yorumlama sırasında yazdıkları koda ne olduğunu temel bir anlayışa sahip olması gerektiğidir. Bu nedenle, kodları JIT tarafından derleniyorsa veya bayt kodu önbelleğe alınmışsa, vb. İse, programcının en azından ne anlama geldiğine dair temel bir anlayışa sahip olması gerekir.


3
Evet, programcının temel bir anlayışa sahip olması gerekir. Fakat derlenmiş / yorumlanmış terminolojinin buna engel olup olmadığını merak ediyorum.
Winston Ewert

2
Teşekkür ederim!! Yorumlanan sadece "idam" ile eşanlamlıdır ve tüm programlar böyle yürütülür.
gardenhead

9

Bu ayrım derinden anlamlıdır, çünkü derlenmiş diller anlambilimi zorunlu olarak yorumlanmayan dillerle sınırlar. Bazı yorumlayıcı tekniklerin derlenmesi çok zor (pratik olarak imkansız).

Yorumlanan kod, çalışma zamanında kod oluşturma gibi şeyler yapabilir ve bu kodun varolan kapsamdaki sözcük bağlarına görünmesini sağlar. Bu bir örnek. Bir diğeri ise, tercümanların, kodun nasıl değerlendirildiğini kontrol edebilecek olan yorumlanmış kodla genişletilebilmesidir. Eski Lisp "fexprs" temeli budur: değerlendirilmemiş argümanlarla çağrılan ve onlarla ne yapılacağına karar veren işlevler (kodu yürümek ve değişkenleri değerlendirmek için gerekli ortama tam erişime sahip olmak, vb.). Derlenmiş dillerde, bu tekniği gerçekten kullanamazsınız; bunun yerine makroları kullanırsınız: derlendiği zaman değerlenmemiş argümanlarla çağrılan işlevler ve yorumlamak yerine kodu çevirirsiniz.

Bazı dil uygulamaları bu teknikler etrafında inşa edilmiştir; Yazarları derlemeyi önemli bir amaç olarak reddetmekte ve bu esnekliği benimsemektedir.

Yorumlama her zaman bir derleyicinin önyüklenmesinde kullanılan bir teknik olarak faydalı olacaktır. Somut bir örnek için CLISP'e (Common Lisp'in popüler bir uygulaması) bakın. CLISP kendi içinde yazılmış bir derleyiciye sahiptir. CLISP'yi kurduğunuzda, bu derleyici ilk bina adımları sırasında yorumlanmaktadır. Kendini derlemek için kullanılır ve derlendikten sonra derleme derlenir.

Tercüman çekirdeği olmadan, SBCL'nin yaptığı gibi mevcut bazı Lisp'lerle önyükleme yapmanız gerekir.

Yorumlama ile, derleme dilinden başlayarak mutlak sıfırdan bir dil geliştirebilirsiniz. Temel I / O ve çekirdek rutinleri geliştirin, ardından yine de makine dili olan bir değerlendirme yazın. Değerlendirdikten sonra, yüksek seviyede bir dilde yazın; makine kodu çekirdeği değerlendirmeyi yapar. Kütüphaneyi daha fazla rutinle genişletmek ve derleyici yazmak için bu özelliği kullanın. Bu yordamları ve derleyicinin kendisini derlemek için derleyiciyi kullanın.

Yorum: derlenmeye giden yolda önemli bir basamak taşı!


1
IMO, bu en iyi cevap. Kendi oyuncak dilim üzerinde çalışıyorum ve son paragraf geliştirdiğim yolu anlatıyor. Yeni fikirler üzerinde çalışmayı gerçekten çok kolaylaştırıyor. Ayrıca CLISP önyükleme işleminden bahsettiği için +1.
sinan

Teoride, herhangi bir “yorumlanmış” dil, yorumlayıcıdan oluşan bir EXE dosyası ve yorumlanan program için kaynak kod veya bayt kodunu oluşturarak “derlenmiş” bir dilde yapılabilir. Yine de çok verimli olmayabilir.
dan04,

Wirth ve arkadaşlarının, PASCAL'ı yeni makine mimarilerine taşımayı basitleştirmek için P kodunu nasıl icat ettiklerini okuyun. Bu 1970'lerin başındaydı.
John R. Strohm 26:16

1
Açılış paragrafınızın derleme ve yorumlamayı statik ve dinamik davranışla karıştırdığından şüpheliyim, ancak size şüphenin avantajını vereceğim ve sadece derlemek için "pratik olarak imkansız" olan anlamsal bir dil örneği isteyeceğim. Bir derleyicinin önyüklenmesiyle ilgili olarak, ilk uygulamanın uyguladığınız dilden başka bir yerde yazılması gerektiği doğrudur, ancak bir tercüman olması gerekmez, başka bir dilde yazılmış bir derleyici olabilir.
8bittree

1

Aslında birçok dil uygulaması hala kesin olarak yorumlanmaktadır, siz onların farkında olmayabilirsiniz. Birkaç isim: UNIX kabuk dilleri, Windows cmd ve PowerScript, Perl, awk, sed, MATLAB, Mathematica vb.


3
Perl'nin dahili olarak bytecode'a derlendiğini ve en azından Mathematica'nın derlenebileceğini düşünüyorum. Ve hiçbir şey awk ve sed'nin uygulanmasını gerektirmez (GNU coreutil'lerinin bazılarının, yürütmeden önce sonlu otomata düzenli ifadeler derlediklerini düşünüyorum, bu da onları tartışmalı bir şekilde "ara gösterim için derleme" kategorisine sokacaktı).

1
Aslında, eminim ki Perl, MATLAB, Mathematica, hepsi bytecode ile derler. PowerScript ile aşina değilim, yani Powershell mi demek istiyorsun? Öyleyse, CLR kullanarak ve bytecode kullanır.
Winston Ewert

@WinstonEwert, üzgünüm demek istedim PowerShell. Anladığım kadarıyla, ara bir forma çeviri, bir şeyin yorumlanmadığı anlamına gelmez. Heck, orijinal Dartmouth BASIC tercümanı yorumlamadan önce kaynağı belirteçlere çevirdi. Bahsettiğim araçların her biri, 1) bir kaynak satırını okuduğu bir moda sahiptir, 2) bu satırı bir çalıştırılabilir forma dönüştürür (yerel kod yerine bazı ara kodları), 3) bu satır için kodları çalıştırır, 4) 1'e geri dönün). Bu benim tercüman anlayışıma karşılık geliyor.
Charles E. Grant,

2
Bayt kodu derlenmiş anlamına gelir. Bir bytecode derleyicisi, sadece kaynağı alan ve onu bytecode'a dönüştüren bir programdır. Bu nedenle, tüm bytecode kullanımları bir bytecode derleyicisini içermelidir. Ancak bytecode da yorumlanmalı (veya JITted). Yani bytecode kullanan herhangi bir şey tercüman / derleyici hibritidir.
Winston Ewert,

4
Gerçekten, benim işim, insanların uygulamaları anlamadan "python yorumlanır" ve "Java derlenir" gibi ifadeleri atmasıdır. Bir uygulamayı bu terimlerle tanımlamanın bile faydalı olup olmadığını sorguladım. Gerçek genellikle daha karmaşıktır ve onu yorumlanmış / derlenmiş olarak kaynatmaya çalışmak faydalı değildir.
Winston Ewert

1

Bence: Kesinlikle Evet .

Aslında, çoğu uygulama aynı temel strateji üzerinde birleşiyor

Gerçekten, C ++, derleyici etki alanına genellikle tercümanlara verilen bazı üst düzey konseptleri taşımayı hedefliyor, ancak azınlık tarafında kalıyor ...


2
Clang + LLVM en popüler derleyici alet zinciri olana kadar bekleyin.
SK-mantık

@ SK-mantık, ismine rağmen, Clang + LLVM'nin yerel kod ürettiğine inanıyorum.
Winston Ewert,

1
@ Winston Ewert, sadece isterseniz. LLVM IR seviyesinde durabilir ve ne istersen yapabilirsin sonra - yorumla, JIT-derle, istediğin gibi kullan. Hatta Javascript'e çevirip
SK-mantik

@ SK-mantık, temiz şeyler! LLVM'nin bunu yapabileceğini bilmiyordum.
Winston Ewert,

1
Llvm'nin güzelliği, ön uç ile arka uç arasındaki kasıtlı bir ayrımdır. Ve talimat setini hedeflemeden önce ortadaki manipülasyon araçları. Tüm projenizi bytecode ile birleştirebilir ve daha sonra her şey boyunca optimize edebilirsiniz, diğer derleyicilerle birlikte tek bir dosya kaynağına veya kaynak ağaçtan aşağıya yolunu içeren en az birine sahip olmanız gerekir, böylece derleyici birleşik bir kaynak üzerinde çalışır. Ayrıca, llvm altındaki bir araç kümesi tüm hedeflere geneldir, her hedef için bir derleme yapmanız gerekmez, bir derleyici hepsine uyar (en azından hedefin hedefine).
old_timer

-1

Yararlı ayrım: yorumlanmış programlar çalışma zamanında işlev ekleyerek veya değiştirerek kendilerini değiştirebilir.


8
Saçmalık. Kendi kendini değiştiren (makine) kodu, kitaptaki en eski numaradır. Sonra tekrar, bazılarının bile yerel kodun nihayetinde silikon (CPU) içine dökülmüş bir tercüman tarafından yorumlandığını iddia ettiği iddia edilmektedir. Ancak bunu kabul edersek, tüm kodlar yorumlanır ve yapılacak bir ayrım yoktur.

2
@delnan haklı. Sadece yeni dillerin dinamik olarak yeni sınıflar oluşturarak ve kütüphaneleri yükleyerek / boşaltarak (veya örneğin .NET'te "montajlar") değiştirebileceklerini
ekleyeceğim

5
Common Lisp derlenmiştir, ancak çalışma zamanındaki işlev tanımlarını kolayca değiştirebilirsiniz.
SK-mantık

Bu, yorumlamanın gerçekten ilginç ve gerekli (örneğin Prolog'da) özelliğidir.
CapelliC
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.