Yönetilen Diller ve Derlenmiş Dil Farkı?


18

İnsanlar derlenmiş diller ile yönetilen diller arasında bir ayrım yapmaya çalıştıklarında kafam karışıyor. Deneyimlerime göre, yönetilen diller Java, C # iken çoğu derlenmiş dili C, C ++ olarak kabul ediyorum (Açıkçası daha fazlası var, ancak bunlar sadece birkaç örnektir). Ancak iki dil türü arasındaki temel fark tam olarak nedir?

Anladığım kadarıyla, hangi dili kullandığınızdan bağımsız olarak herhangi bir program, daha sonra yorumlanacak olan düşük düzeyli bir makine koduna "derlenir", bu da yönetilen dilleri derlenmiş dillerin bir alt kümesi yapar (yani, tüm yönetilen diller derlenmiş ancak başka bir şekilde değil)?


2
Bu terim Microsoft tarafından üretilir, dar anlamda Java da yönetilir. - Hemen hemen tüm vakalarda yönetilen compiles.Also, bu, ben ilişkili olabileceğine inanıyoruz o birinin bir alt kümesi gibi dillerin aklınıza gelebilecek programmers.stackexchange.com/questions/72446/...
shabunc

Kodu çalışma süresinden önce (Java gibi) daha makine tarafından yönetilebilir bir şeyle (statik olarak) derleyen bir dil ile çalışma zamanında bunu yapan bir dil (Python gibi) arasında büyük bir fark olduğunu unutmayın. Önemli bir fark, çalışma zamanından önce statik olarak derlemenin, derleyiciye ağır hız geliştirmelerine neden olabilecek bazı optimizasyonlar yapma şansı vermesidir (Java'nın JIT, şube tahmini için kodu yeniden düzenleme vb.).
Shivan Dragon

6
@ShivanDragon, bir "dil" hiçbir şey derlemez. Uygulanması yapar. Python'u statik olarak derleyebilirsiniz (örneğin PyPy veya IronPython'a bakın). OTOH, dinamik olarak yazılan bir dille verimli bir şekilde yapmak gerçekten zor ("izleme JIT", "soyut yorumlama, vb
SK-logic

@ SK-mantık: kabul ettim, bir kötü adam dedim. Dile değil platforma atıfta bulunmak istedim.
Shivan Dragon

@shabunc Aslında Derlenmiş Yönetilen bir alt kümesi olduğunu söyleyebilirim. Yönetilen bir dil, derlenmiş bir dilin (neredeyse aynı hızda) yapabileceği her şeyi yapabilir ve daha sonra Yönetilen bir dil derlenebildiğinden daha fazlasını yapabilir. C'ye yönetilen bir dilin özelliklerini vermek için bir "VM" oluşturmanız ve bunu aslında bir yönetilen dil haline getirmeniz gerekir.
Bill K

Yanıtlar:


47

Fark "derlenmiş" ile "yönetilen" arasında değildir, bunlar iki dik eksendir. "Yönetilen" ile, bunlar normalde çöp toplanmış bellek yönetiminin varlığı ve / veya sanal makine altyapısının varlığı anlamına gelir. Her ikisinin de derleme ve insanların tersi gördüğü her şeyle hiçbir ilgisi yoktur.

Tüm bu "farklılıklar" oldukça bulanık, yapay ve alakasızdır, çünkü yönetilen ve yönetilmeyen belleği tek bir çalışma zamanında karıştırmak her zaman mümkündür ve derleme ile yorumlama arasındaki fark da oldukça belirsizdir.


2
Temelde aklımda olan şey bu, ama bu ayrımı yapmaya devam eden birçok insanla karşılaştım. Açık cevap için teşekkürler.
l46kok

Yönetilen kod, çalışma zamanında çalıştırdığınız yürütme ortamına bakmak için bir ara dile sahip olmak anlamına gelir, değil mi? Yani ara dilin (diyelim ki bayt kodu) bir derleyici tarafından üretilmesi gerekiyor. IMO, o çiftler "yönetilen" kod ve "derleme" kavramını biraz. Ancak, dil "derlenmiş" ise, bu bir yönetilen kod verir (örn. C ++ vs Java)
zgulser

@zgulser, hayır, ara diller dik. Yönetilen, dil çalışma zamanı ile entegre bir GC'ye sahip olmak anlamına gelir. Örneğin, OCaml çalışma zamanı "yönetilir", ancak doğrudan yerel olarak derlenir.
SK-logic

8

Vikipedi teklifi yapmak için:

Yönetilen kod, Microsoft tarafından yalnızca Ortak Dil Çalışma Zamanı sanal makinesinin (bayt kodu ile sonuçlanan) yönetimi altında yürütülmesi gereken ve çalışacak olan bilgisayar programı kaynak kodunu tanımlamak için kullanılan bir terimdir.

Yönetilen kodun yürütülmesi için bir çalışma zamanı (.NET CLT gibi) gerekir.


5
Yönetilen kodun bir çerçeveyle ilgisi yoktur. Belleği yöneten bir çalışma zamanına ihtiyaç duyar .
Oded

Belki de benim ifade biraz kapalı, ama .NET framework aslında bir "ortak dil çalışma zamanı" değil mi?
janvdl

3
Hayır. CLR'yi içerir, ancak Temel Sınıf Kütüphanelerini, IL belirtimini ve daha fazlasını içerir.
Oded

4

Bence bir ayrım var, ancak mutlaka “Derlenmiş” ve “Yönetilen” arasında değil. Bunlar karşıt değiller; bir dil derlenebilir ve yönetilemez veya yorumlanamaz (derlenemez) ve yönetilebilir, ya da her ikisi birden, hatta hiçbiri

"Derlenmiş" bir dil, geliştirici tarafından yazılan kaynak kodunu makine tarafından yürütülen daha düzenli bir "bytecode" a dönüştüren bir adımdır. "Makine", gerçek işlemci veya bayt kodlarında "yerel" makine talimatlarına dönüştürmek için ek işlemler gerçekleştiren bir "sanal makine" olabilir. "Derlenmiş" bir dilin zıttı, kaynak kodunun bir derleme adımı olmadan yürütüldüklerinde satır satır yürütüldükleri sırada satır bayt kodlarına dönüştürüldüğü "yorumlanmış" bir dildir. Aralarındaki bir melez, genellikle yürütme makinesi tarafından tek seferlik bir adım olarak yorumlanan "JIT" (Tam Zamanında) 'dan "jitting" dir;

"Yönetilen" dil, neredeyse her zaman bir bayt kodu yorumlayıcı içeren belirli bir çalışma ortamı ortamında tüketilen programları üretmek için tasarlanmış bir dildir; programın kodunu alan ve ek makine veya ortama özgü dönüşüm gerçekleştiren bir "sanal makine". Ortam ayrıca, "çöp toplayıcı" ve programın alan ve araçların "sanal alanı" içinde çalışmasını amaçlayan diğer "güvenlik" özellikleri gibi bellek yönetimini de içerebilir, ancak bu özellikler "yönetilen" çalışma zamanlarının tek alanı değildir. . Yorumlanan tüm diller yönetilen olarak değerlendirilebilir, çünkü yorumlayıcının yürütülen "kullanıcı" kodu satırlarının altında çalışmasını gerektirirler. Ayrıca, JVM ve .NET dilleri (Java, Scala, C #, VB, F #, IronWhatever), biçim ve işlev olarak ikili bir montaj diline yüzeysel olarak benzer olan, ancak herhangi bir "yerel" komut kümesine% 100 bağlı olmayan bir ara dile veya IL'ye derlenir. Bu talimatlar, JVM veya .NET'in CLR'si tarafından yürütülür; bu, bunları etkili bir şekilde CPU mimarisine ve / veya işletim sisteminin işletim sistemine özgü yerel ikili talimatlara dönüştürür.

Dolayısıyla, diller genellikle "derlenmiş" veya "yorumlanmış" ve "yönetilmeyen" (veya "yerel") ve "yönetilen" olarak tanımlanabilir. Olası "yorumlanmış yerel" dışında bunların herhangi bir kombinasyonu olarak tanımlanabilecek diller vardır (bu sadece geliştirici tarafından yazılanın yürütüldüğü şey elle yazılmış onaltılı opcodlar için geçerli olacaktır); yorumlama katmanını bir "çalışma zamanı" olarak görürseniz (bu tartışması kolay ve tartışması zor), yorumlanan tüm diller "yönetilir".

Teknik olmak istiyorsanız, günümüzde çok görevli bir işletim sistemini hedefleyen neredeyse tüm programlar "yönetilmektedir"; İşletim Sistemi, çalışan her program için programın çalışan tek şey olduğunu düşündüğü (veya en azından aksini bilmek zorunda olmadığı) bir "sanal makine" oluşturur. Kod kendi içinde ve başvurulan diğer kütüphanelere çağrı yapabilir, sanki bu program belleğe yüklenen tek şeymiş gibi; benzer şekilde, veri ve kontrol cihazlarını saklamak ve işlemek için RAM ve daha yüksek bellek tahsis etmeye yönelik çağrılar, tüm bellek mimarisi kullanılabilirmiş gibi kodlanır. VM (ve arkasındaki işletim sistemi) daha sonra çeşitli bellek işaretleyicilerini programın gerçek konumuna, verilerini ve kancalarını aygıt sürücülerine vb. ya da her türlü hafızayı, programın X'in 0 adresi gibi davranabileceği X adresinden başlayarak) ve bunu yapmak çok ucuzdur, ancak işlem zamanlamasının ve süreçler arası iletişim gibi OS çekirdeğinin sorumlu olduğu başka şeyler de vardır. trickier yönetmek için. Bununla birlikte, programın sanal bir makine tarafından çalıştırıldığını bilmek zorunda olmadığı ve genellikle ayrılan belleğini "temiz" tutmaktan sorumlu olduğu için, bu temel model genellikle "yönetilen" olarak kabul edilmez. MS-DOS komut satırında çalıştırılmak üzere tasarlanmış bir program, artık altında MS-DOS ortamına sahip olmayan yeni Windows işletim sistemlerinde çalıştırılabilir; bunun yerine programa "sanal konsol" ortamı verilir ve bu "korumalı alandan" ayrılmaya çalışmaması şartıyla


"diller genellikle" derlenmiş "veya" yorumlanmış "olarak tanımlanabilir. - Hayır, yapamazlar. Derleme ve yorumlama, dillerin değil, derleyicilerin ve tercümanların özellikleridir. "Derlenmiş dil" terimi bile bir anlam ifade etmiyor. İngilizce yazılmış bir dil olsaydı, bir tür hatası olurdu.
Jörg W Mittag

2
Derleyiciler ve tercümanlar genellikle derleme veya yorumlama için tasarlanmış çok özel dil lehçelerini derleme ve yorumlamada bulunur. Kimse bildiğim JavaScript kaynak kodunu derlemiyor ve kimse C # 'ı yorumlamıyor. Diller şu veya bu şekilde tüketilecek şekilde tasarlanmıştır . Bu nedenle, dilin kendisine "derlenmiş" veya "yorumlanmış" olarak atıf yapmak genellikle kabul edilebilir, çünkü dilin kullanıldığı ortamın tamamı bu iki adımdan birini içerir.
KeithS


en.wikipedia.org/wiki/Interpreted_language - "Teorik olarak, herhangi bir dil derlenebilir veya yorumlanabilir, bu nedenle bu atama, yalnızca bir dilin temel özelliklerinden değil, ortak uygulama pratiği nedeniyle uygulanır."
KeithS

@KeithS, wikipedia neredeyse mükemmel değil. Bir makalenin belirli bir geçersiz terim için mevcut olması, bu terimi daha geçerli hale getirmez. Evet, diller her zaman belirli bir yürütme tarzı göz önünde bulundurularak tasarlanmıştır, ancak bunları yalnızca tasarımcıların niyetine göre "derlenmiş" veya "yorumlanmış" olarak adlandırmak yine de üretken değildir. Ve bir yoruma gelince, herhangi bir şekilde uygun bir "tercüman" bulmak gerçekten zordur. Tcl muhtemelen türünün son örneği. Diğer sözde "tercümanlar" aslında derleyicilerdir.
SK-logic

2

Yönetilen Dil basit terimlerle, çöp toplama hizmeti gibi bir çalışma zamanı ortamı tarafından sağlanan hizmetlere bağlı olan üst düzey bir dildir, bu yüzden genel olarak yönetilir olarak adlandırılır, ancak kullandığı tek hizmet bu değildir ve bu hizmetlerden bazıları security services, exception handling, standard types, Common Language Run-time CLR.Net dillerinde veya Java gibi `Sanal Sanal Makine JVM kullanan bir sanal ortamda yürütmek için kullanır .

Yönetilmeyen Dil , sanal çalışma zamanı hizmetlerine veya ara dile gerek kalmadan doğrudan işletim sistemi tarafından yürütülebilir düşük seviyeli bir dildir, bu diller gibi C, C++yönetilen kodlar , bu diller tarafından üretilen yönetilmeyen kod, işletim sistemini dinamik olarak bağlayan kütüphane yordamlarını kullanır. (Dinamik Bağlantı Kütüphaneleri) olarak adlandırılan kodu yönetin, yönetilmeyen kod doğrudan belleğe erişir, bu yüzden yönetilen koddan daha hızlıdır, ancak bir donanım sürücüsü veya sofistike video oyunu oluşturmazsanız, yönetilmeyen dilleri gerçekten kullanmak istemezsiniz. özellikle rol durumu gibi deneyimsiz geliştiricilerle çalışmak tehlikeli olabilirwith great power comes great responsibilityve bu nedenle, geliştiricilerin sistemin altına dalmadan genişletilebilir kod üretmelerine yardımcı olmak için yönetilen diller var, ancak yine de ihtiyacınız varsa karışık kod oluşturabilirsiniz, bu makaleler her şeyi açıklıyor:

Yönetilen / Yönetilmeyen Kod Birlikte Çalışabilirliğine Genel Bakış

Örnek: Yönetilmeyen C ++, C ++ / CLI ve C # kodunu karıştırma

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.