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.