Czuję się zagubiony, gdy ludzie próbują rozróżnić języki skompilowane i języki zarządzane. Z doświadczenia rozumiem, że większość uważa skompilowane języki za C, C ++, podczas gdy zarządzanymi językami są Java, C # (Oczywiście jest ich więcej, ale to tylko kilka przykładów). Ale czym dokładnie jest podstawowa różnica między tymi dwoma typami języków?
Rozumiem, że każdy program, niezależnie od używanego języka, jest zasadniczo „kompilowany” w niskopoziomowy kod maszynowy, który jest następnie interpretowany, podobnie jak to czyni z zarządzanych języków podzbiór skompilowanych języków (tzn. Wszystkie zarządzane języki są skompilowane języki, ale nie na odwrót)?
Odpowiedzi:
Różnica nie polega na „skompilowaniu” a „zarządzaniu”, są to dwie osie ortogonalne. Przez „zarządzany” zwykle rozumieją obecność zarządzania pamięcią zebraną w pamięci i / lub obecność infrastruktury maszyny wirtualnej. Oba nie mają absolutnie nic wspólnego z kompilacją i tym, co ludzie uznają za przeciwne.
Wszystkie te „różnice” są dość rozmyte, sztuczne i nieistotne, ponieważ zawsze można łączyć zarządzaną i niezarządzaną pamięć w jednym środowisku wykonawczym, a różnica między kompilacją a interpretacją jest również bardzo niejasna.
źródło
Cytując Wikipedię:
Kod zarządzany wymaga środowiska wykonawczego (takiego jak .NET CLT) do wykonania.
źródło
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”
źródło
Język zarządzany w prostych słowach jest to język wysokiego poziomu, który zależy od usług udostępnianych przez środowisko wykonawcze, takich jak usługa usuwania śmieci, dlatego jest ogólnie nazywany zarządzany, ale nie jest to jedyna usługa, z której korzysta , a niektóre z tych usług są
security services, exception handling, standard types
używaneCommon Language Run-time CLR
do uruchamiania, np. w językach .Net lub w środowisku wirtualnym, takim jak Java, które używa JVM Java Virtual Machine.Język niezarządzany to język niskiego poziomu wykonywalny bezpośrednio przez system operacyjny bez potrzeby korzystania z wirtualnych usług uruchomieniowych lub języka pośredniego, takich jak
C, C++
niezarządzany kod wytwarzany przez takie języki wykorzystuje procedury biblioteczne, które są dynamicznie połączone z systemem operacyjnym, aby uzyskać kod do wykonania, zwany bibliotekami DLL (Dynamic Link Libraries), niezarządzany kod uzyskuje bezpośredni dostęp do pamięci, dlatego jest szybszy niż kod zarządzany, ale chyba że budujesz sterownik sprzętowy lub zaawansowaną grę wideo, tak naprawdę nie chcesz używać niezarządzanych języków, ponieważ współpraca z niedoświadczonymi programistami, takimi jak stan roli, może być niebezpiecznawith great power comes great responsibility
i dlatego istnieją języki zarządzane, które pomagają programistom w tworzeniu rozszerzalnego kodu bez zanurzania się w system, ale nadal możesz tworzyć mieszany kod, jeśli potrzebujesz, w tych artykułach wyjaśniono wszystko:Przegląd interoperacyjności zarządzanego / niezarządzanego kodu
Przykład: mieszanie niezarządzanego kodu C ++, C ++ / CLI i C #
źródło