2015-09-18 18 views
5

Używam C# .NET dla aplikacji sieci web. Czytałem, że kompilacja JIT dzieje się w czasie wykonywania, co oznacza (popraw mnie, jeśli się mylę), że kompilacja nastąpi, gdy żądanie trafi IIS.Kiedy następuje kompilacja z wyprzedzeniem (AOT)?

Kolejna kompilacja odbywa się przy użyciu csc.exe podczas fazy kompilacji rozwiązania przy użyciu MSBuild do konwersji kodu wysokiego poziomu na CIL.

Jeśli nie było JIT i chcieliśmy użyć AOT, to gdzie by to wszystko pasowało?

Moje pytanie brzmi, w którym punkcie w całej fazie od kodu budynku do pierwszego żądania, kompilacja AOT dzieje? (Platforma/framework nie ma znaczenia)

+1

"Budynek" jest wtedy, gdy kompilacja AOT odbywa się tak jak aplikacje C, C++, kod C# zostanie skompilowany bezpośrednio do kodu maszynowego dla konkretnej platformy, która została określona podczas "budowania". – shashi

+2

Cóż, platforma/framework mają znaczenie. Jedynym kompletnym czystym AOT w .NET jest kilka tygodni przed typowym użytkownikiem uruchamiającym program. Na serwerze Store w Redmond, używając .NET Native. Nie ma nic wspólnego z aplikacją internetową, możesz używać tylko Ngen. Kod odbicia i niektóre generyczne są wciąż pomijane. –

Odpowiedz

10

Po wielu badaniach i Google dowiedziałem się, że moje podstawowe zrozumienie kompilatorów było błędne.

Kompilator to program, który konwertuje program w języku X do programu w języku Y. Język może być dowolny (natywny kod maszynowy, kod pośredni/kod bajtowy, inny język Z lub ten sam język).

Kompilator niekoniecznie jest programem, który konwertuje program w języku X na m-code.

Na przykład kompilacja dzieje się z kodu C# wysokiego poziomu do CIL przy użyciu kompilatora csc.exe. (Jak mogłem przegapić? Duh!)

Również czas w Ahead-of-time i just-in-time kompilatory odnosi się do wykonywania. Tak więc w kompilatorze Ahead-Of-Time kompilacja odbywa się przed uruchomieniem programu, zwykle dodawana jako krok kompilacji. W kompilatorze Just-in-Time kompilacja wciąż dzieje się podczas uruchamiania programu.

Aby umieścić go w C# .NET perspektywy i odpowiedzieć na moje pytanie, CIL jest generowany przez MSBuild użyciu csc.exe bez rozpatrzenia, czy CLR wykorzystuje kompilator JIT lub AOT. W chwili uruchomienia programu uruchamiany jest kompilator JIT lub AOT. AOT kompilator kompiluje całych zespołów (w CIL lub języka X) do natywnego kodu maszynowego (języka Y) przed uruchomieniem programu. Kompilator JIT kompiluje poszczególnych metod i klas (w CIL lub języka X) do natywnego kodu maszynowego (języka Y) w przypadku gdy metody są nazywane.

CLR zapewnia domyślnie kompilator JIT, ale obsługuje także kompilację AOT przy użyciu Native Image Generator(Ngen.exe).

+0

Dobre badania. Zauważ, że termin AOT jest zwykle używany, gdy kompilacja odbywa się w czasie instalacji. Dobrym przykładem jest nowy system operacyjny Android (ART) w systemie Android 5.0+, który kompiluje aplikacje po ich zainstalowaniu zamiast JITing. @shashi skomentował twój pierwotny post dotyczący aplikacji Sklepu Windows. MS był kompilatorem AOT do aplikacji Windows Phone Phone, ale zamiast kompilować się przez telefon podczas instalacji, jest na serwerze Windows Store, zanim zostanie pobrany i zainstalowany przez użytkownika. Apple robi coś podobnego w aplikacjach Apple Watch. – LearningFast

+0

Kiedy tak się dzieje: * Kompilator AOT kompiluje całe zestawy (w języku CIL lub język X) na macierzysty kod maszyny (język Y) przed uruchomieniem programu * – kravemir

Powiązane problemy