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)?
Antworten:
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.
quelle
So zitieren Sie Wikipedia:
Verwalteter Code benötigt zur Ausführung eine Laufzeit (wie .NET CLT).
quelle
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.
quelle
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 esCommon 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 responsibility
Aus 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
quelle