.NET'te CIL ve CLR neden gereklidir?


11

Bu güzel görüntüyü burada gördüm . .Net dilini destekleyen tüm derleyicilerin kaynak kodunu CILformata dönüştürdüğünü öğrendim . Microsoft artık .NETtüm işletim sistemleri için bir CLR yazarak tüm işletim sistemlerini getirmiyor. O zaman neden böyle bir ara kod formatı ve bu CIL'i çalıştırmak için bir CLR saklayın. Bu başa çıkmak için bir baş ağrısı değil. Microsoft neden böyle olmayı seçti?

EDIT Bu tür mimarinin bir fiyatı var. Performansı düşürecek, değil mi? Java bunu platform bağımsızlığını korumak için yapar, ne nedenle .NET yapar? Neden basit bir düz C gibi derleyici tutmuyorsunuz. Herhangi bir şekilde, herhangi bir yeni dil eklemem gerekirse kodu CIL'e dönüştürmek için bir derleyici gerektirecektir, tek farkı hedef dildir. Tat hepsi.


3
Çünkü derleyicileri CIL'e yazmak daha kolaydır. Ve yerel derleyiciye bir CIL yazmak, doğal olarak kullanılan her dile bir derleyiciden daha kolaydır.
Oded

9
@ratchetfreak: MS'nin CLR'yi diğer platformlara taşımamasının bir nedeni olabilir, ancak ilk etapta bir CLR'ye sahip olmanın bir nedeni değildir (bu aslında bir portu kolaylaştırır , bu yüzden argümanınız MS bashing gibi ses çıkarır, ) üzgünüm
Doktor Brown

12
Ayrıca 'M $' için aşağı oy, bu nedir 1998?
Alan B

3
Eric Lippert bunu tartışıyor (3. paragraftan başlayarak; ilk 2 paragraf Roslyn hakkındadır). Kısa cevap Oded'in yorumu ve Telastyn'in cevabı doğru; sadece <İşletim sistemi sayısı> derleyiciler yerine <İşletim sistemi sayısı> + <Dil sayısı> derleyicileri kodlamanız yeterlidir.
Brian

3
@busy_wait: Başvurulan sayfada birkaç dezavantaj var. Örneğin, "iki uygulamadaki yapılandırma bilgileri, aynı bağımlı derleme için farklı bağlayıcı kararlara neden olabilir." Anında üretmek bu sorunları önler. Bu, derlemenin uygulama dağıtıldıktan sonra gerçekten yapılması gerektiği anlamına gelir (ve aslında, NGEN her hedef makinede çalıştırılmalıdır; distribütör tarafından çalıştırılamaz).
Brian

Yanıtlar:


29

Çünkü onlar sadece C # CIL için bir derleyici yazmak gerekir - zor kısmı bu. Platform başına CIL için bir yorumlayıcı (veya daha sık, Just-In-Time derleyicisi) yapmak, C # 'dan (platform başına) yürütülebilir koda bir derleyici yazmakla karşılaştırıldığında nispeten kolaydır.

Bunun ötesinde, çalışma zamanı CIL ile derlenen her şeyi işleyebilir. Yeni bir dil (F # gibi) istiyorsanız , bunun için sadece bir derleyici yazmanız gerekir ve .NET'in desteklediği şeyler için tüm platform desteğini otomatik olarak alırsınız.

Oh, ve ben bir .NET dll almak ve (tüm bağımlılıkları tatmin olduğunu varsayarak) yeniden derleme olmadan Windows veya Linux üzerinde Mono üzerinden çalıştırabilirsiniz.

Performansa gelince, tartışmalı. Esas olarak CIL'i alan ve yerel ikili dosyalar oluşturan "ön derleyiciler" vardır. Diğerleri, tam zamanında derleyicilerin statik derleyicilerin yapamayacağı optimizasyonları yapabileceğini savunuyor. Deneyimlerime göre, bu, uygulamanızın ne yaptığına ve hangi platformda çalıştırdığınıza bağlıdır (çoğunlukla JITer'in bu platformda ne kadar iyi olduğunu). .NET'in yeterince iyi olmadığı bir senaryoya girmem çok nadir .


"yorumlayıcı" `? Her zaman MS sadece bir JITter sağlar düşündüm?
Doc Brown

1
@DocBrown - eh, evet - bence yanlış isim. Tamir ediyorum.
Telastyn

+1, bu cevabı kabul edebilmem için düzenlemem için biraz açıklama ekleyebilir misiniz
vikkyhacks

Yüksek performanslı çalışma zamanları genellikle bir tercüman ve JIT derleyicisini (karışık mod yürütme) birleştirir. .NET hakkında emin değilim, ancak birçok Java VM'si bu yaklaşımı kullanıyor.
Cyanfish

2
@busy_wait: Her türlü şey. Yönlendirme, kopya yayılımı, gereksiz kodların kaldırılması, çarpma / bölmelerin kaymalara dönüştürülmesi, readonlyalanları kullanarak diğer aritmetik işlemler . Geleneksel derleyiciler bu optimizasyonlardan bazılarını yapabilir, ancak statik analizle tespit edildiklerinde. Aksine, bir jitter çalışma zamanında kodun bir bölümünün (örneğin) değiştirdiği nesnelere veya değişkenlere başka hiçbir yerde referans verilmediğinden yararlı bir iş yapmadığını öğrenebilir. Ben titremeler konusunda uzman değilim ama temelde dinamik ve statik analizin gücü meselesi.
Aaronaught

14

.NET, Java ile aynı nedenden ötürü bir ara dile (CIL / MSIL) ve platforma özgü bir çalışma zamanının (CLR) platforma özel uygulamalarına sahiptir. Microsoft, C # ile Java'nın doğrudan rekabet etmesini amaçladı ve Microsoft'un hedeflediği işletim sistemlerinde (kendi).

.NET, yalnızca Windows platformlarında (veya Mono / Linux gibi .NET gibi çalışan diğer işletim sistemlerinde) desteklense de avantajları Java'ya benzer:

  • Yönetilen Bellek Çalışma Zamanı - Yönetilmeyen C / C ++ 'dan farklı olarak, C # / VB.NET geliştiricilerinin nesne ömrünü sıkı bir şekilde kontrol etme konusunda endişelenmeleri gerekmez. Java gibi, CLR de yığın içinde kapsamı bırakan nesneleri otomatik olarak serbest bırakan bir çöp toplayıcıya sahiptir. Bu, yönetilmeyen çalışma zamanlarına alışmış biri için küçük görünse de, C / C ++ 'da çok yaygın olan işaretçi aritmetiğin "kara büyüsünü" caydırmak gibi aşırı ikincil bir avantaja sahiptir.
  • Platform Bağımsızlığı - Windows Vista ve Windows 7, Windows XP'den farklı çalışır. Windows 8 hala farklı çalışıyor. Windows 8 Mobile dahil Windows Mobile sürümleri farklı şekilde çalışır. Farklı donanım, farklı mimari, farklı yetenekler. Hedef ortam hala bir .NET geliştiricisi için önemli olsa da, tüm bu işletim sistemleri için uyumlu bir C / C ++ programı oluşturmak için bilinmesi gerekenlerle karşılaştırıldığında özel bilgi miktarı çok azalır. AC # dev ücretsiz çok daha fazlasını alır.
  • Web uygulaması desteği - Henüz C ++ 'da baştan sona yazılan, müşteriye dönük, sunucuya yazılan bir web uygulaması görmedim. Web sunucusu , elbette, Apache, ISS, hepsi genellikle hız / verimlilik nedenleriyle yönetilmeyen bir çalışma süresine karşı çalışır. Ancak, C ++ web uygulamaları oluşturmak için kullanılan bir dil değildir. C # (Java gibi) dır. Yeni nesil ASP paradigmasını desteklemek için sıfırdan tasarlandı. Bu, sanal alanda çalışmak üzere tasarlanmış koddur; hangi sanal alan (ISS'ye ASP.NET eklentisi veya "masaüstü" CLR) nispeten önemsizdir.
  • Dil / çalışma zamanı bağımsızlığı - C ++ derleyicisi C ++ kaynak kodunu alır ve bir makine dili kullanarak bir işlemci mimarisi için montaj kodu üretir. Farklı bir mimariyi ve / veya makine dilini desteklemek için tamamen yeni bir derleyici yazılmalıdır (ve tamamen yeni bir çalışma zamanı kitaplığı seti derlenmelidir). AC # derleyicisi C # kaynak kodunu alır ve donanıma özgü JITer'in makine koduna çevirdiği CIL'yi üretir. Aynı JITer, kaynak dil ne olursa olsun herhangi bir CIL programını çevirebilir (ve birkaç tane vardır; C #, VB.NET, F # ve IronHaskell, IronRuby, IronLisp, vb. Gibi bir dizi "Demir" dil bağlantı noktası). Aynı derleyici, donanımı ne olursa olsun, herhangi bir JITer'in çalışabileceği bir dili CIL'e dönüştürebilir.
  • "Doğru" koda odaklanın - C ++ geliştiricileri için, en önemli olana bağlı olarak bir şey yapmanın birçok "doğru" yolu vardır; bellek verimliliği, CPU verimliliği, donanım bağımsızlığı, OS bağımsızlığı, vb. Bunların her biri öncelikli olduğunda kod çok farklı görünebilir. C #, Fowler ve meslektaşlarının (C ++ topluluğundaki kod tasarımında büyük ölçüde C'den yukarı hareket eden bir topluluğa öğreterek kod tasarımında reform yapmak için çalışan) kavramsal derslerin kalbini alan bir grup tarafından tasarlandı. iyi gelen eski bir C ++ tarzı işlev işaretçisi işi çok daha temiz ve daha az nesne yapmayacağı zaman, daha önce gelen diller tarafından öğrenilen pratik dersler (Java dahil ve Yüce Nesne'ye yakın fanatik itaati) yönelimli).

Antitröst nedenleriyle MS, Android, Mac OSX / iOS ve Linux gibi diğer büyük platformlarda çok fazla "müdahale" görmemeye dikkat ediyor; ancak, bu platformların üçü için de ekipler geliştiriyor. OSX için MS tarafından geliştirilen bir sürümü vardır, iOS ve Android için Office birlikte çalışma uygulamaları da dahil olmak üzere çok sayıda uygulama vardır, Skype (şimdi bir Microsoft ürünü) Linux'ta çalışır ve Microsoft'un Linux çekirdeğine (özellikle bir sanallaştırma zihniyeti).


1
"Henüz baştan aşağı C ++ ile yazılmış, istemci-yönelimli, sunucu-komut dosyasıyla yazılmış bir web uygulaması görmedim." - eski CGI'ları nereye koyarsınız? İlk web uygulamalarım (oldukları gibi önemsiz)% 100 C idi. O zamanlar (90'ların ortaları) cgi'de standart işi yapmak için bir .c ve .h yazmak daha kolaydı ('script' dilleri sadece sahnede de ortaya çıkıyor).

hm ... CGI, CGI ... Sanırım duydum, ama KeithS ile birlikteyim, henüz bir tane görmedim :)
DXM

@DXM eski dinamik içerik modeli, web sunucusu çatalı için bir süreçti ve standart yerlere (sorgu parametreleri ve benzeri, belirli ortam değişkenlerine gitti) - Ortak Ağ Geçidi Arayüzü. Bu işlemin çıktısı daha sonra içerik olarak geri gönderildi. Eski günlerde, perl veya python yerine C veya C ++ bilen bir programcı bulmak daha kolaydı (ve sh, bu tür işler için çok tıknazdı).

1
Java ile benzerliğin önemini hafife almayın. Sun, MS'e JVM limanları için dava açtı ve bazı yasal puanlar kazandı (aptalca, IMHO). CIL ve CLR bundan ilham alıyor ve J # 'ın başka yasal işlemleri tetiklemeden Java'ya olabildiğince yakın olduğunu fark edeceksiniz. Çok büyük bir fark, CLR'nin dil agnostik olmasıdır. Gerçekten bir program gerekirse C #, F # ve J # karışımı yazabilirsiniz. Java'yı diğer dillerdeki kütüphanelerle karıştırmaya çalışın ve kararlı bir program edinin.
RBerteig

1
Ancak MSIL ve yerel kod arasındaki birlikte çalışma hem oldukça iyi tanımlanmıştır hem de çalışır. Ve görünüşe göre sadece tasarım ve kullanıcı topluluğunun tutumları ile çalışması bekleniyordu.
RBerteig

12

Windows işletim sistemi bugün çoğunlukla x64, x86, Intel, ARM olmak üzere farklı CPU tipleri için kullanılabilir.

CIL / CLR bu donanım platformundan bağımsızdır - bu farklılıklar IL yürütme ortamı tarafından "soyutlanır". Örneğin, "herhangi bir CPU" için derlenen bir .NET derlemesi, farklı yürütülebilir dosyalar sağlamaya gerek kalmadan, genellikle 64 bit işlem olarak Win64'te ve 32 bit işlem olarak Win32'de yürütülebilir.

Dahası, CIL, meta verilerin yerel DLL'lerle kolayca mümkün olmayan derlemelerde saklanmasına izin verir (elbette, MS bunu daha önce COM bileşenleri ile yapmıştır, ancak bu teknoloji .NET bileşenleri kadar kullanımı hiç bu kadar kolay olmamıştır). Bu, yazılım bileşenlerinin oluşturulmasını çok daha basit hale getirir ve tüm .NET dillerinde yansıma / içgözlemin temelidir .


Sadece buna biraz eklemek için, sadece farklı CPU türlerine izin vermekle kalmaz, aynı CPU türündeki (örneğin tüm x64) farklı sürümlere (Core i3 / i5 / i7) ve satıcılara (Intel vs. AMD) farklı olabilirler. derleyicisinin yararlanabileceği montaj talimatları setleri
DXM

2
@DXM: JIT'in gerçekten yaptığını biliyor musunuz? Yoksa bu daha varsayımsal bir şey mi?
Doc Brown

En azından bir MSDN blogu JIT derleyicisinin bunu yaptığını (veya 8 yıl önce yaptığını) iddia ediyor .

@DocBrown: Açıkçası elimde herhangi bir referans materyalim yok, ama uzun zaman önce bu konuda bir şeyler okuduğumu hatırladığımı sanıyordum. Bağlantıyı bulduğunuz için teşekkürler delnan. Çip üreticilerinin standart x86-x64'ün üstüne kendi talimatlarını eklemeyi sevdiğini bildiğimiz için mantıklı olurdu, bu yüzden makine avantaj sağlayabilirse neden olmasın?
DXM
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.