Managed Languages ​​vs Compiled Language Unterschied?

18

Ich bin verwirrt, wenn Leute versuchen, zwischen kompilierten und verwalteten Sprachen zu unterscheiden. Erfahrungsgemäß betrachten die meisten kompilierten Sprachen C, C ++, während verwaltete Sprachen Java, C # sind (es gibt offensichtlich mehr, aber dies sind nur einige Beispiele). Aber was genau ist der Kernunterschied zwischen den beiden Arten von Sprachen?

Mein Verständnis ist, dass jedes Programm, unabhängig davon, welche Sprache Sie verwenden, im Wesentlichen in einen Maschinencode auf niedriger Ebene "kompiliert" wird, der dann interpretiert wird. Auf diese Weise werden verwaltete Sprachen zu einer Teilmenge der kompilierten Sprachen kompilierte Sprachen aber nicht umgekehrt)?

l46kok
quelle
2
Dieser Begriff ist von Microsoft geprägt, im engeren Sinne wird auch Java verwaltet. Fast in allen Fällen können wir von verwalteten Sprachen denken wie einer Teilmenge des einen , dass compiles.Also, das, wie ich glaube zusammenhängt - programmers.stackexchange.com/questions/72446/...
shabunc
Beachten Sie, dass es einen großen Unterschied zwischen einer Sprache gibt, die den Code (statisch) zu einer Sprache kompiliert, die vor der Laufzeit besser verwaltet werden kann (wie Java), und einer Sprache, die dies zur Laufzeit tut (wie Python). Ein wesentlicher Unterschied besteht darin, dass der Comiler beim statischen Kompilieren vor der Laufzeit einige Optimierungen vornehmen kann, die zu erheblichen Geschwindigkeitsverbesserungen führen können (z. B. JIT von Java, Neuordnung des Codes für die Verzweigungsvorhersage usw.).
Shivan Dragon
6
@ShivanDragon, eine "Sprache" kompiliert nichts. Seine Implementierung tut es. Und Sie können Python statisch kompilieren (siehe z. B. PyPy oder IronPython). OTOH, es ist wirklich schwer, es mit einer dynamisch getippten Sprache effizient zu machen (siehe "JIT verfolgen", "abstrakte Interpretation" usw.)
SK-logic
@ SK-Logik: Einverstanden, ich habe ein Bösewicht gesagt. Ich wollte mich auf die Plattform beziehen, nicht auf die Sprache.
Shivan Dragon
@shabunc Eigentlich würde ich sagen, dass Compiled eine Untermenge von Managed ist. Eine verwaltete Sprache kann alles, was eine kompilierte Sprache kann (praktisch mit der gleichen Geschwindigkeit), und mehr, da eine verwaltete Sprache kompiliert werden kann. Um C die Funktionen einer verwalteten Sprache zu geben, müssen Sie eine "VM" erstellen und sie tatsächlich zu einer verwalteten Sprache machen.
Bill K

Antworten:

47

Der Unterschied besteht nicht in "kompiliert" oder "verwaltet", dies sind zwei orthogonale Achsen. Mit "verwaltet" ist normalerweise das Vorhandensein einer Speicherverwaltung mit Speicherbereinigung und / oder das Vorhandensein einer Infrastruktur für virtuelle Maschinen gemeint. Beides hat absolut nichts mit Compilation zu tun und mit dem, was die Leute als Gegenteil ansehen.

All diese "Unterschiede" sind ziemlich unscharf, künstlich und irrelevant, da es immer möglich ist, verwalteten und nicht verwalteten Speicher in einer einzigen Laufzeit zu mischen, und ein Unterschied zwischen Kompilierung und Interpretation ist auch sehr vage.

SK-Logik
quelle
2
Dies ist, was ich im Grunde genommen im Sinn hatte, aber ich habe eine Menge Leute getroffen, die diese Unterscheidung immer wieder machen. Danke für die klare Antwort.
l46kok
Verwalteter Code bedeutet, dass eine Zwischensprache zur Verfügung steht, die unabhängig von der Ausführungsumgebung, in der Sie zur Laufzeit ausgeführt werden, bearbeitet werden muss. Diese Zwischensprache (sagen wir Bytecode) muss also von einem Compiler erzeugt werden. IMO, das Paar "verwaltet" Code und "Compilation" -Konzept ein wenig. Wenn die Sprache jedoch "kompiliert" ist, wird kein verwalteter Code
angezeigt
@zgulser, nein, Zwischensprachen sind orthogonal. Verwaltet bedeutet, dass ein GC in die Sprachlaufzeit integriert ist. Beispielsweise wird die OCaml-Laufzeit "verwaltet", obwohl sie direkt in die native kompiliert wird.
SK-logic
8

So zitieren Sie Wikipedia:

Verwalteter Code ist ein Begriff, der von Microsoft geprägt wurde, um Computerprogramm-Quellcode zu identifizieren, der nur unter der Verwaltung einer virtuellen Common Language Runtime-Maschine ausgeführt werden muss (was zu Bytecode führt).

Verwalteter Code benötigt zur Ausführung eine Laufzeit (wie .NET CLT).

janvdl
quelle
5
Verwalteter Code hat nichts mit einem Framework zu tun. Es benötigt eine Laufzeit , die den Speicher verwaltet.
Oded
Vielleicht ist mein Wortlaut ein bisschen abweichend, aber ist das .NET-Framework eigentlich keine "Common Language Runtime"?
Januar,
3
Nein. Beinhaltet die CLR, aber auch die Basisklassenbibliotheken, die IL-Spezifikation und mehr.
Oded
4

Ich denke, es muss ein Unterschied gemacht werden, aber es muss nicht unbedingt zwischen "Compiled" und "Managed" unterschieden werden. Dies sind keine Gegensätze; Eine Sprache kann kompiliert und nicht verwaltet oder interpretiert (nicht kompiliert) und verwaltet werden oder beides oder auch keines.

Eine "kompilierte" Sprache ist einfach eine, in der es einen Schritt gibt, der den vom Entwickler geschriebenen Quellcode in einen reguläreren "Bytecode" umwandelt, der von der Maschine ausgeführt wird. Die "Maschine" kann der eigentliche Prozessor sein oder eine "virtuelle Maschine", die zusätzliche Operationen an den Bytecodes ausführt, um sie in "native" Maschinenbefehle zu übersetzen. Das Antonyme für eine "kompilierte" Sprache ist eine "interpretierte" Sprache, in der der Quellcode zur Laufzeit ohne Kompilierungsschritt zeilenweise in Bytecode-Anweisungen umgewandelt wird. Ein Hybrid zwischen ihnen ist "Jitting", von "JIT" (Just In Time), was normalerweise von der ausführenden Maschine als ein einmaliger Schritt interpretiert wird.

Eine "verwaltete" Sprache ist eine Sprache, mit der Programme erstellt werden, die in einer bestimmten Laufzeitumgebung verwendet werden, die fast immer einen Bytecode-Interpreter enthält. Eine "virtuelle Maschine", die den Programmcode übernimmt und eine zusätzliche maschinen- oder umgebungsspezifische Transformation durchführt. Die Umgebung kann auch Speicherverwaltung enthalten, beispielsweise einen "Garbage Collector" und andere "Sicherheits" -Funktionen, mit denen das Programm in seiner "Sandbox" aus Speicherplatz und Tools ausgeführt werden soll. Diese Funktionen sind jedoch nicht die einzige Domäne "verwalteter" Laufzeiten . Praktisch alle interpretierten Sprachen können als verwaltet betrachtet werden, da sie erfordern, dass der Interpreter unter den Zeilen des ausgeführten "Benutzer" -Codes ausgeführt wird. JVM- und .NET-Sprachen (Java, Scala, C #, VB, F #, IronWhatever) werden in eine Zwischensprache oder IL kompiliert, die in Form und Funktion oberflächlich einer binären Assemblersprache ähnelt, jedoch keinem "nativen" Befehlssatz zu 100% entspricht. Diese Anweisungen werden von der JVM oder von der .NET-CLR ausgeführt, die sie effektiv in native binäre Anweisungen übersetzt, die für die CPU-Architektur und / oder das Betriebssystem des Computers spezifisch sind.

So können Sprachen im Allgemeinen als "kompiliert" oder "interpretiert" und als "nicht verwaltet" (oder "native") und "verwaltet" beschrieben werden. Es gibt Sprachen, die als eine beliebige Kombination davon beschrieben werden können, mit Ausnahme der möglichen "interpretierten Native" (was nur für handgeschriebene hexadezimale Opcodes zutrifft, bei denen vom Entwickler geschrieben wird, was ausgeführt wird). Wenn Sie die Interpretationsschicht als "Laufzeit" betrachten (was leicht zu argumentieren und schwer zu widerlegen ist), werden alle interpretierten Sprachen "verwaltet".

Wenn Sie technische Informationen benötigen, werden heutzutage fast alle Programme, die auf ein Multitasking-Betriebssystem abzielen, "verwaltet". Das Betriebssystem erstellt eine "virtuelle Maschine" für jedes laufende Programm, in der das Programm denkt (oder zumindest nicht wissen muss), dass es das einzige ist, das ausgeführt wird. Der Code kann Aufrufe in sich selbst und an andere Bibliotheken, auf die verwiesen wird, vornehmen, als wäre dieses Programm das einzige, was in den Speicher geladen wird. In ähnlicher Weise werden Aufrufe zum Zuweisen von RAM und anderem höheren Speicher zum Speichern und Bearbeiten von Daten und Steuergeräten so codiert, als ob die gesamte Speicherarchitektur verfügbar wäre. Die VM (und das Betriebssystem dahinter) übersetzt dann verschiedene Speicherzeiger in den tatsächlichen Speicherort des Programms, in seine Daten und verknüpft sie mit Gerätetreibern usw. Dies geschieht am häufigsten durch Anwenden eines Speicher-Offsets (jede VM erhält einen Block von 2 GB) oder was auch immer aus dem Gedächtnis, Ab der Adresse X, die das Programm so behandeln kann, als wäre diese X die Adresse 0), ist dies sehr kostengünstig. Es gibt jedoch noch andere Aufgaben, für die der Betriebssystemkern verantwortlich ist, wie z. B. die Prozessplanung und die Kommunikation zwischen Prozessen schwieriger zu handhaben. Dieses Grundmuster wird jedoch im Allgemeinen nicht als "verwaltet" betrachtet, da das Programm nicht wissen muss, dass es von einer virtuellen Maschine ausgeführt wird, und häufig immer noch dafür verantwortlich ist, den zugewiesenen Speicher "sauber" zu halten. Ein Programm, das für die Ausführung in der MS-DOS-Befehlszeile entwickelt wurde, kann unter neueren Windows-Betriebssystemen ausgeführt werden, unter denen sich nicht einmal mehr die MS-DOS-Umgebung befindet. Das Programm erhält stattdessen eine "virtuelle Konsole" und versucht nicht, diese "Sandbox" zu verlassen.

KeithS
quelle
"sprachen können im allgemeinen als" kompiliert "oder" interpretiert "bezeichnet werden - nein, das können sie nicht. Zusammenstellung und Interpretation sind Eigenschaften von Compilern und Dolmetschern, die keine Sprachen sind. Der Begriff "kompilierte Sprache" macht nicht einmal Sinn. Wenn Englisch eine getippte Sprache wäre, wäre dies ein Tippfehler.
Jörg W Mittag
2
Compiler und Dolmetscher sind in der Regel in der Lage, sehr spezifische Dialekte von Sprachen zu kompilieren und zu interpretieren, die entweder kompiliert oder interpretiert werden sollen. Niemand kompiliert JavaScript-Quellcode, den ich kenne, und niemand interpretiert C #. Die Sprachen sind entworfen , in der einen oder der anderen verbraucht werden. Daher ist es normalerweise akzeptabel, die Sprache selbst als "kompiliert" oder "interpretiert" zu bezeichnen, da die vollständige Umgebung, in der die Sprache verwendet wird, einen dieser beiden Schritte umfasst.
KeithS
en.wikipedia.org/wiki/Interpreted_language - "Theoretisch kann jede Sprache kompiliert oder interpretiert werden, daher wird diese Bezeichnung nur aufgrund der üblichen Implementierungspraxis und nicht aufgrund einer wesentlichen Eigenschaft einer Sprache verwendet."
KeithS
@ KeithS, Wikipedia ist bei weitem nicht perfekt. Die Tatsache, dass ein Artikel für eine bestimmte ungültige Bestimmung existiert, macht diese Bestimmung nicht mehr gültig. Ja, Sprachen werden immer unter Berücksichtigung einer bestimmten Ausführungsweise entworfen, aber es ist immer noch kontraproduktiv, sie nur auf der Grundlage der Absicht ihrer Designer als "kompiliert" oder "interpretiert" zu kennzeichnen. Und für eine Interpretation ist es wirklich schwierig, einen geeigneten "Dolmetscher" zu finden. Tcl ist wahrscheinlich der letzte seiner Art. Alle anderen sogenannten "Interpreter" sind in der Tat Compiler.
SK-logic,
2

Verwaltete Sprache in einfachen Worten: Es handelt sich um eine Hochsprache, die von den Diensten abhängt, die von einer Laufzeitumgebung ausgeführt werden, z. B. dem Garbage Collection-Dienst. Aus diesem Grund wird sie im Allgemeinen als verwaltet bezeichnet, aber dies ist nicht der einzige Dienst, den sie verwendet und einige dieser Dienste sind security services, exception handling, standard types, verwendet es Common Language Run-time CLR, wie in .NET - Sprachen oder einer virtuellen Umgebung wie Java auszuführen , die `Java Virtual Machine JVM verwendet.

Nicht verwaltete Sprache ist eine Sprache auf niedriger Ebene, die direkt vom Betriebssystem ausgeführt werden kann, ohne dass virtuelle Laufzeitdienste oder Zwischensprachen erforderlich sind. Solche Sprachen wie nicht C, C++verwalteter Code, der von solchen Sprachen erstellt wird, verwenden Bibliotheksroutinen, die dynamisch mit dem Betriebssystem verknüpft sind, um die zu erhalten Code zum Ausführen genannter DLLs (Dynamic Link Libraries), nicht verwalteter Code greift direkt auf den Speicher zu, weshalb er schneller ist als verwalteter Code. Wenn Sie jedoch keinen Hardwaretreiber oder ein ausgeklügeltes Videospiel erstellen, möchten Sie nicht wirklich nicht verwaltete Sprachen verwenden Besonders bei unerfahrenen Entwicklern wie dem Rollenzustand kann es gefährlich werden, damit zu arbeitenwith great power comes great responsibilityAus diesem Grund gibt es verwaltete Sprachen, die Entwicklern dabei helfen, erweiterbaren Code zu erstellen, ohne tief in das System einzutauchen. Sie können jedoch bei Bedarf auch gemischten Code erstellen. In den folgenden Artikeln wird alles erklärt:

Ein Überblick über die Interoperabilität von verwaltetem und nicht verwaltetem Code

Beispiel: Mischen von nicht verwaltetem C ++ -, C ++ / CLI- und C # -Code

Ashraf Abusada
quelle