Widziałem tutaj ten ładny obraz . Dowiedziałem się, że wszystkie kompilatory obsługujące język .net konwertują kod źródłowy na CIL
format. Teraz Microsoft nigdy nie wprowadza .NET
całego systemu operacyjnego, pisząc CLR dla wszystkich systemów operacyjnych. Dlaczego więc zachować taki pośredni format kodu i CLR, aby wykonać ten CIL. Czy to nie ból głowy? Dlaczego Microsoft tak wybrał?
EDYCJA Ten rodzaj architektury ma swoją cenę. Zmniejszy to wydajność, prawda? Java robi to, aby zachować niezależność platformy, z jakiego powodu .NET to robi? Dlaczego nie zachować prostego kompilatora typu C? Jakikolwiek sposób będzie wymagał również kompilatora do konwersji kodu na CIL, jeśli będę musiał dodać nowy język, jedyną różnicą, jaką by to zrobił, był język docelowy. Tat jest wszystkim.
Odpowiedzi:
Ponieważ muszą napisać tylko jeden kompilator dla C # do CIL - co jest trudną częścią. Utworzenie interpretera (lub częściej kompilatora Just-In-Time) dla CIL na platformę jest stosunkowo łatwe w porównaniu z pisaniem kompilatora z kodu C # na (na platformę) kod wykonywalny.
Poza tym środowisko wykonawcze może obsłużyć wszystko, co kompiluje się do CIL. Jeśli chcesz nowego języka (np. F #), musisz napisać dla niego tylko jeden kompilator i automatycznie uzyskać wsparcie platformy dla rzeczy obsługiwanych przez platformę .NET.
Aha, mogę pobrać bibliotekę .NET i uruchomić ją w systemie Windows lub Linux na Mono bez ponownej kompilacji (zakładając, że wszystkie moje zależności są spełnione).
Jeśli chodzi o wydajność, jest to dyskusyjne. Istnieją „prekompilatory”, które zasadniczo pobierają CIL i tworzą natywne pliki binarne. Inni twierdzą, że kompilatory just-in-time mogą dokonywać optymalizacji, których po prostu nie potrafią kompilatory statyczne. Z mojego doświadczenia wynika, że wiele zależy od tego, co robi twoja aplikacja i na jakiej platformie ją uruchamiasz (głównie jak dobry jest JITer na tej platformie). Bardzo rzadko spotykam się ze scenariuszem, w którym .NET nie był wystarczająco dobry .
źródło
readonly
pól. Tradycyjne kompilatory mogą wykonać niektóre z tych optymalizacji, ale tylko wtedy, gdy można je wykryć za pomocą analizy statycznej. Natomiast jitter może stwierdzić w czasie wykonywania, że (na przykład) sekcja kodu nie wykonuje żadnej użytecznej pracy, ponieważ modyfikowane obiekty lub zmienne nie są nigdzie indziej wymienione. Nie jestem ekspertem od drgań, ale jest to w zasadzie kwestia siły analizy dynamicznej vs. statycznej..NET ma język pośredni (CIL / MSIL) i specyficzne dla platformy implementacje niezależnego od platformy środowiska uruchomieniowego (CLR) z tego samego powodu, dla którego robi to Java. Microsoft zamierzał C # bezpośrednio konkurować z Javą, i robi to w systemach operacyjnych, na które Microsoft celuje (swoim własnym).
Korzyści, mimo że .NET jest obsługiwany tylko na platformach Windows (lub innych systemach operacyjnych, które działają podobnie do .NET, jak Mono / Linux), są podobne do Java:
Ze względów antymonopolowych stwardnienie rozsiane jest ostrożne, aby nie zostać zbyt mocno zakłóconym na innych głównych platformach, takich jak Android, Mac OSX / iOS i Linux; jednak rzeczywiście istnieją zespoły rozwijające się dla wszystkich trzech platform. Istnieje opracowana przez MS wersja pakietu Office dla OSX, istnieje wiele aplikacji, w tym aplikacje Office Interop na iOS i Android, Skype (obecnie produkt Microsoft) działa na Linuksie, a Microsoft nawet widział, że przyczynia się do jądra Linuksa (głównie w sposób myślenia o wirtualizacji).
źródło
System operacyjny Windows jest dostępny dla różnych typów procesorów, dziś głównie x64, x86, Intel, ARM.
CIL / CLR jest niezależny od platformy sprzętowej - różnice te są „usuwane” przez środowisko wykonawcze IL. Na przykład zestaw .NET skompilowany dla „dowolnego procesora” może zwykle być wykonywany na Win64 jako proces 64-bitowy, a Win32 jako proces 32-bitowy, bez potrzeby dostarczania różnych plików wykonywalnych.
Co więcej, CIL pozwala na przechowywanie metadanych w zestawach, co nie jest łatwe w przypadku natywnych bibliotek DLL (możliwe jest oczywiście, że MS zrobił to wcześniej z komponentami COM, ale ta technologia nigdy nie była tak łatwa w obsłudze jak komponenty .NET). To sprawia, że tworzenie komponentów oprogramowania jest o wiele prostsze i stanowi podstawę refleksji / introspekcji we wszystkich językach .NET.
źródło