Myślę, że należy wprowadzić rozróżnienie, jednak niekoniecznie musi to być „skompilowany” i „zarządzany”. To nie są przeciwieństwa; język może być kompilowany i nie może być zarządzany, lub interpretowany (nieskompilowany) i zarządzany, lub oba, a nawet oba.
„Skompilowany” język to po prostu taki, w którym istnieje krok, który przekształca kod źródłowy napisany przez programistę w bardziej regularny „kod bajtowy”, który jest wykonywany przez maszynę. „Maszyna” może być faktycznym procesorem lub „maszyną wirtualną”, która wykonuje dodatkowe operacje na kodach bajtowych w celu przetłumaczenia ich na „natywne” instrukcje maszyny. Antonimem języka „skompilowanego” jest język „interpretowany”, w którym kod źródłowy jest przetwarzany w instrukcji kodu bajtowego w czasie wykonywania, wiersz po wierszu podczas ich wykonywania, bez kroku kompilacji. Hybrydą między nimi jest „szarpanie”, z „JIT” (Just In Time), co zwykle jest interpretacją jednorazowego kroku wykonywanej maszyny;
Język „zarządzany” to język przeznaczony do tworzenia programów, które są konsumowane w określonym środowisku wykonawczym, które prawie zawsze zawiera interpreter kodu bajtowego; „maszyna wirtualna”, która pobiera kod programu i wykonuje dodatkową transformację specyficzną dla maszyny lub środowiska. Środowisko może również obejmować zarządzanie pamięcią, takie jak „śmieciarz” i inne funkcje „bezpieczeństwa” mające na celu utrzymanie działania programu w „obszarze izolowanym” przestrzeni i narzędzi, jednak takie funkcje nie są wyłączną domeną „zarządzanych” środowisk wykonawczych . Praktycznie wszystkie interpretowane języki można uznać za zarządzane, ponieważ wymagają one, aby interpreter działał pod liniami wykonywanego kodu „użytkownika”. Ponadto języki JVM i .NET (Java, Scala, C #, VB, F #, IronWhthing) są kompilowane do języka pośredniego lub IL, który jest powierzchownie podobny pod względem formy i funkcji do binarnego języka asemblerowego, ale nie przylega w 100% do żadnego „rodzimego” zestawu instrukcji. Instrukcje te są wykonywane przez JVM lub CLR .NET, co skutecznie tłumaczy je na natywne instrukcje binarne specyficzne dla architektury procesora i / lub systemu operacyjnego maszyny.
Tak więc języki można ogólnie opisać jako „skompilowane” lub „zinterpretowane” oraz jako „niezarządzane” (lub „rodzime”) i „zarządzane”. Istnieją języki, które można opisać jako dowolną ich kombinację, z wyjątkiem możliwych „interpretowanych natywnych” (co byłoby prawdą tylko w przypadku odręcznych kodów szesnastkowych, gdzie to, co zostało napisane przez programistę, jest wykonywane); jeśli uznasz warstwę interpretacyjną za „środowisko wykonawcze” (które jest łatwe do argumentowania i trudne do argumentowania), wówczas wszystkie interpretowane języki są „zarządzane”.
Jeśli chcesz uzyskać wiedzę techniczną, prawie wszystkie programy kierowane obecnie na wielozadaniowy system operacyjny są „zarządzane”; system operacyjny utworzy „maszynę wirtualną” dla każdego uruchomionego programu, w którym program myśli (lub przynajmniej nie musi wiedzieć inaczej), że jest to jedyna działająca rzecz. Kod może wywoływać w sobie i do innych bibliotek, do których się odwołuje, tak jakby ten program był jedyną rzeczą załadowaną do pamięci; podobnie wezwania do alokacji pamięci RAM i innej wyższej pamięci do przechowywania danych i manipulowania nimi oraz sterowania urządzeniami są kodowane tak, jakby cała architektura pamięci była dostępna. Maszyna wirtualna (i system operacyjny za nią) następnie tłumaczy różne wskaźniki pamięci na rzeczywistą lokalizację programu, jego danych i przechwytuje sterowniki urządzeń itp. Najczęściej odbywa się to poprzez zastosowanie przesunięcia pamięci (każda maszyna wirtualna otrzymuje blok 2 GB czy cokolwiek z pamięci, zaczynając od adresu X, który program może traktować tak, jakby ten X był adresem 0) i jako taki jest bardzo tani, ale istnieją inne rzeczy, za które odpowiedzialne jest jądro systemu operacyjnego, takie jak planowanie procesów i komunikacja między procesami, które są trudniejsze w zarządzaniu. Jednak ten podstawowy wzorzec na ogół nie jest uważany za „zarządzany”, ponieważ program nie musi wiedzieć, że jest uruchamiany przez maszynę wirtualną i często nadal jest odpowiedzialny za utrzymywanie „przydzielonej” pamięci w czystości. Program, który został zaprojektowany do działania w wierszu poleceń MS-DOS, można uruchomić na nowszych systemach operacyjnych Windows, które nie mają już nawet środowiska MS-DOS; program otrzymuje zamiast tego środowisko „wirtualnej konsoli” i pod warunkiem, że nie próbuje opuścić tego „piaskownicy”