Frage

Ich lese diese Frage die Unterschiede zwischen der Java Virtual Machine, um herauszufinden, und die .NET CLR und Benji Antwort hat mich gefragt, warum virtuellen Maschinen notwendig sind, um in erster Linie.

Von meinem Verständnis von Benji Erklärung, der JIT-Compiler von einer virtuellen Maschine interpretiert den Zwischencode in den eigentlichen Assembler-Code, der auf der CPU läuft. Der Grund, es zu tun hat, weil CPUs oft eine unterschiedliche Anzahl von Registern haben und nach Benji „einige Register sind für besondere Zwecke, und jeder Befehl erwartet, dass seine Operanden in verschiedenen Registern.“ Dies macht Sinn, dann, dass es einen Bedarf für einen Vermittler-Interpreter wie die virtuelle Maschine, so dass der gleiche Code kann auf jeder CPU ausgeführt werden.

Aber wenn das der Fall ist, dann, was ich nicht verstehe, ist, warum C oder C ++ Code in Maschinencode kompiliert der Lage ist, auf jedem Computer ausgeführt werden, solange es die richtige OS ist. Warum sollte dann ein C-Programm mich auf meinem Windows-Rechner erstellt einen Pentium mit der Lage sein, auf meinem anderen Windows-Rechner ausführen, um eine AMD mit?

Wenn Code C auf einer CPU laufen kann, was ist dann der Zweck der virtuellen Maschine? Ist es so, dass der gleiche Code kann auf jedem Betriebssystem ausgeführt werden? Ich weiß, dass Java hat VM-Versionen auf so ziemlich jedes Betriebssystem aber ist es eine CLR für andere Betriebssysteme außer Windows-?

Oder gibt es etwas, was ich bin fehlt? Ist das Betriebssystem eine andere Interpretation von Assembler-Code tut es läuft es auf die jeweilige CPU oder etwas anzupassen?

Ich bin sehr gespannt, wie das alles funktioniert, so dass eine klare Erklärung wäre sehr geschätzt.

. Hinweis: Der Grund, warum habe ich nicht nur meine Fragen als Kommentare in den JVM vs. CLR Frage schreiben, weil ich Kommentare nicht genug Punkte hat, um Posten noch = b

Edit: Danke für all die großen Antworten! So scheint es, was ich fehlte, war, dass, obwohl alle Prozessoren haben Unterschiede eine gemeinsame Standardisierung ist, in erster Linie die X86-Architektur, die eine ausreichend große Reihe gemeinsamer Merkmale bietet, so dass der C-Code auf einem X86-Prozessor zusammengestellt wird zum größten Teil arbeiten auf einem anderen X86-Prozessor. Dies fördert die Berechtigung für virtuelle Maschinen, nicht zu erwähnen, ich über die Bedeutung der Garbage Collection vergessen.

War es hilfreich?

Lösung

Die AMD und Intel-Prozessoren verwenden den gleichen Befehlssatz und Maschinenarchitektur (vom Standpunkt der Ausführung von Maschinencode).

C und C ++ Compiler kompilieren zu Maschinencode, mit Header entsprechend dem OS sie ausgerichtet sind. Sobald sie kompiliert aufhören in jeder Hinsicht, Form zu assoziieren oder mit der Sprache bilden sie in kompiliert wurden und lediglich binäre ausführbare Dateien. (Es gibt Artefakte taht zeigen kann, welche Sprache es aus kompiliert wurde, aber das ist nicht der Punkt hier)

So einmal kompiliert, werden sie an der Maschine verbunden ist (X86, die Intel und AMD Befehlssatz und Architektur) und das Betriebssystem.

Aus diesem Grunde ist sie auf jeder kompatibelen x86 Maschine ausführen kann, und jedes kompatible O (Win95 bis winvista, für einige Software).

Sie können jedoch nicht auf einem OSX Maschine laufen, auch wenn es auf einem Intel-Prozessor läuft -. Die binäre ist nicht kompatibel, wenn Sie zusätzliche Emulations-Software (wie Parallele oder eine VM mit Windows) ausführen

Darüber hinaus, wenn Sie sie auf einem ARM-Prozessor ausgeführt werden sollen, oder MIPS oder PowerPC, dann müssen Sie einen vollen Maschinenbefehlssatz Emulator ausführen, der den binären Maschinencode von X86 interpretiert in dem, was Maschine, die Sie es laufen lassen auf.

Kontrast, die mit .NET.

Die virtuelle Maschine .NET hergestellt wird, als ob es in der Welt viel besser Prozessoren waren - Prozessoren, die Objekte, Speicherzuweisung und die Garbage Collection und andere High Level-Konstrukte zu verstehen. Es ist eine sehr komplexe Maschine und kann nicht direkt jetzt in Silizium gebaut werden (mit einem guten Leistung), aber ein Emulator kann geschrieben werden, die es erlaubt auf jedem vorhandenen Prozessor ausgeführt werden.

Auf einmal können Sie eine maschinenspezifische Emulator für jeden Prozessor Sie .NET auf, ausführen möchten, schreiben und dann kann jeder .NET-Programm darauf ausgeführt werden. Keine Notwendigkeit, über das Betriebssystem oder die zugrunde liegende CPU-Architektur zu kümmern -. Wenn es ein .NET-VM ist, dann wird die Software ausführen

Aber lassen Sie uns ein wenig weiter gehen - wenn Sie diese gemeinsame Sprache haben, warum nicht Compiler machen, die andere Schriftsprache in sie umwandeln

So, jetzt können Sie eine C, C #, C ++, Java, Javascript, Basic, Python, Lua, oder jede andere Sprache Compiler, den Code geschrieben konvertiert, so dass es auf dieser virtuellen Maschine ausgeführt werden.

Sie haben die Maschine aus der Sprache um 2 Grad distanzierte, und mit nicht zu viel Arbeit, die Sie jemand ermöglichen beliebigen Code zu schreiben und es auf jedem Rechner laufen, so lange wie ein Compiler und eine VM besteht, die beiden zur Karte Grad der Trennung.

Wenn Sie immer noch fragen, warum dies eine gute Sache ist, sollten Sie früh DOS-Maschinen, und was für Microsofts real Beitrag für die Welt war:

Autocad hatte Treiber für jeden Drucker schreiben sie drucken konnten. So tat Lotus 1-2-3. In der Tat, wenn Sie Ihre Software zu drucken wollen, mußten Sie Ihre eigenen Treiber schreiben. Wenn es 10 Drucker waren, und 10 Programme, dann 100 verschiedene Stücke im Wesentlichen hatte der gleiche Code wird separat und unabhängig voneinander geschrieben.

Was Windows 3.1 versucht, zu erreichen (mit GEM entlang, und so vielen anderen Abstraktionsschichten) ist es der Druckerhersteller einen Treiber macht so für ihren Drucker geschrieben, und der Programmierer schrieb einen Treiber für die Windows-Druckerklasse.

Jetzt mit 10 Programmen und 10 Druckern, nur 20 Teile des Codes haben geschrieben werden, und da die Microsoft-Seite des Code waren für alle gleich, dann Beispiele von MS bedeuteten, dass man sehr wenig Arbeit zu tun hatte.

Jetzt wurde ein Programm nicht nur auf die 10-Drucker beschränkt sie zu unterstützen wählte, aber alle Drucker, deren Hersteller für in Windows-Treiber zur Verfügung gestellt.

Das gleiche Problem auftritt, in der Anwendungsentwicklung. Es gibt wirklich ordentlich Anwendungen, die ich nicht, weil ich eine MAC verwenden nicht verwenden können. Es gibt eine Tonne von Duplizierung (wie viele Weltklasse-Wort-Prozessoren brauchen wir wirklich?).

Java gemeint war, dieses Problem zu beheben, aber es viele Einschränkungen hatte, von denen einige sind nicht really gelöst.

.NET ist näher, aber niemand entwickelt Weltklasse-VMs für andere Plattformen als Windows (mono ist so nah ... und doch nicht ganz da).

So ... Deshalb haben wir VMs müssen. Da möchte ich mich nicht einfach auf ein kleineres Publikum begrenzen, weil sie eine OS / Maschinenkombination unterscheidet sich von meinem eigenen gewählt haben.

-Adam

Andere Tipps

Ihre Annahme, dass C-Code auf jedem Prozessor ausgeführt werden kann, ist nicht korrekt. Es gibt Dinge, wie Register und endianness die kompilierte C-Programme, die nicht auf einer Plattform macht funktionieren wird, während es auf einem anderen funktionieren könnte.

Allerdings gibt es gewisse Ähnlichkeiten, die Aktien-Prozessoren zum Beispiel Intel x86-Prozessoren und AMD-Prozessoren teilen sich eine ausreichend große Menge von Eigenschaften, die meisten Code kompiliert gegen einen auf dem anderen laufen. Wenn Sie jedoch keine prozessorspezifischen Eigenschaften verwenden möchten, dann müssen Sie einen Compiler oder einen Satz von Bibliotheken, die das für Sie tun.

Was, warum Sie eine virtuelle Maschine, über die Aussage wollen würde, dass es Unterschiede in Prozessoren für Sie behandeln wird, gibt es auch die Tatsache, dass virtuelle Maschinen Dienste Code anzubieten, die Programme in C kompiliert nicht zur Verfügung stehen ++ (nicht verwaltet heute).

Der prominenteste Service angeboten wird, Garbage Collection, von der CLR und die JVM angeboten. Beide virtuellen Maschinen bieten Ihnen diesen Service kostenlos. Sie verwalten den Speicher für Sie.

Dinge wie die Überprüfung der Grenzen, Zugriffsverletzungen (während immer noch möglich, sie sind extrem schwer) werden ebenfalls angeboten.

Die CLR bietet auch eine Form von Code Sicherheit für Sie.

Nichts davon werden als Teil der Grundlaufzeitumgebung für eine Reihe von anderen Sprachen angeboten werden, das mit einer virtuellen Maschine arbeitet nicht.

Sie können einige von ihnen durch die Verwendung Bibliotheken, aber dann, dass Sie Kräfte in ein Muster von Verwendung mit der Bibliothek, während in .NET und Java-Dienste, die Ihnen durch die CLR und JVM angeboten werden, sind in ihren Zugang konsistent.

Im Wesentlichen erlaubt es für ‚Managed Code‘, was bedeutet, genau das, was er sagt - die virtuelle Maschine den Code verwaltet, wie es läuft. Die drei wichtigsten Vorteile sind Just-in-Time-Kompilierung, verwaltet Zeiger / Garbage Collection und Sicherheitskontrolle.

Für die Just-in-Time-Kompilierung ein, Uhren die virtuelle Maschine den Code ausführen und so wie der Code öfter ausführen, wird es reoptimised schneller laufen. Sie können dies nicht mit nativen Code.

Managed-Pointer sind auch leichter zu optimieren, da die virtuelle Maschine sie verfolgt, wie sie um gehen, sie auf unterschiedliche Weise der Verwaltung je nach ihrer Größe und Lebensdauer. Es ist schwierig, dies in C ++ zu tun, weil man nicht wirklich sagen, wo ein Zeiger gehen wird nur den Code zu lesen.

Sicherheit ist ein selbsterklärend ein, stoppt die virtuelle Maschine von dem Code Dinge zu tun, sollte es nicht, weil es zu beobachten. Ich persönlich denke, das ist wahrscheinlich der wichtigste Grund, warum Microsoft chose Code für C # verwaltet.

Im Grunde mein Punkt ist, weil die virtuelle Maschine des Code sehen kann, wie es geschieht, kann es Dinge tun, die das Leben auf dem Programmierer einfacher und den Code schneller machen.

Die meisten Compiler, auch native Code-Compiler, eine Art Zwischensprache verwendet werden.

Dies ist vor allem getan Compiler Baukosten zu reduzieren. Es gibt viele (N) Programmiersprachen in der Welt. Es gibt auch viele (M) harte ware-Plattformen der Welt. Wenn Compiler gearbeitet, ohne eine Zwischensprache, die Gesamtzahl der „Compiler“, die geschrieben werden müssten, um alle Sprachen auf allen Hardware-Plattformen unterstützen N * M sein.

Doch durch eine Zwischensprache definiert und einen Compiler nach oben in zwei Teile, ein vorderes Ende und ein hinteres Ende mit dem vorderen Ende kompiliert Quellcode in IL und das hintere Ende Kompilieren IL in Maschinencode zu brechen, können Sie weg nur N + M-Compiler mit dem Schreiben. Dieser endet eine enormen Kosteneinsparungen zu sein.

Der große Unterschied zwischen CLR / JVM Compiler und nativen Code-Compiler ist die Art und Weise das vordere Ende und das hintere Ende Compiler miteinander verbunden sind. In einem nativen Code-Compiler werden die beiden Komponenten in der Regel in die gleiche ausführbaren Datei kombiniert, und beide werden ausgeführt, wenn der Programmierer trifft „Build“ in der IDE.

Mit CLR / JVM Compiler, dem vorderen Ende und dem hinteren Ende zu unterschiedlichen Zeiten ausgeführt werden. Das vordere Ende wird bei der Kompilierung ausgeführt, IL produzieren, die den Kunden tatsächlich ausgeliefert wird. Das hintere Ende wird dann in einem separaten Bauteil ausgebildet, die zur Laufzeit aufgerufen wird.

Also, das die alternative Frage bringt: „Was sind die Vorteile der Verzögerung Backend Kompilierung bis zur Laufzeit“?

Die Antwort lautet: "Es kommt darauf an"

Durch die Verzögerung zurück Ende Kompilierung bis zur Laufzeit wird es möglich, einen Satz von Binärdateien zu versenden, die auf mehreren Hardware-Plattformen ausgeführt werden können. Es macht es auch möglich, Programme Vorteil von Verbesserungen im Backend Kompilierungstechnologie zu nehmen, ohne umgeschichtet werden. Es kann auch eine Grundlage für die effiziente viele dynamische Sprachfunktionen zu implementieren. Schließlich bietet es die Möglichkeit, die Sicherheit und Zuverlässigkeit Abhängigkeiten zwischen separat kompiliert, dynamisch verknüpften Bibliotheken (DLLs) einzuführen, die nicht mit im Voraus Maschinencode Kompilierung ist.

Es gibt jedoch auch Rücken ziehen. Die Analyse notwendige umfangreiche Compiler-Optimierungen implementieren kann teuer werden. Dies bedeutet, dass „JIT“ Backends oft tun wird weniger Optimierungen als Upfront-Backends tun. Dies kann die Leistung schaden. Auch die Notwendigkeit, den Compiler zur Laufzeit aufzurufen, erhöht sich auch die Zeit, die notwendig zur Last Programme. Programme mit „upfront“ Compiler erzeugt nicht solche Probleme haben.

Zum einem Code Maschine ist nicht die niedrigste Form von Anweisungen für eine CPU. Todays x86-CPUs sich die X86-Befehl in ein anderes internes Format unter Verwendung von Mikro eingestellt interpretieren. Die einzigen Menschen, die tatsächlich Programm Mikro der Chip-Entwickler Ingenieur-Typen sind, die treu und schmerzlos das Vermächtnis x86-Befehl Chip emulieren maximale Leistung mit dem heutigen Technologien zu erreichen.

Entwickler-Typen haben immer weitere Schichten von Abstraktionen schon länger wegen der Macht und Funktionen, die sie bringen. Nachdem alle besser Abstraktionen neue Anwendungen ermöglichen geschrieben schneller und zuverlässiger werden. Unternehmen interessieren sich nicht über das, was oder wie sie Code sieht aus wie sie nur der Job wollen zuverlässig und schnell erledigt. Ist es wirklich wichtig, wenn die C-Version einer Anwendung wenige Millisekunden dauert weniger aber die doppelte Zeit nehmen, endet zu entwickeln?

Die Geschwindigkeit Frage ist fast ein nicht Argument so viele Unternehmensanwendungen, die Millionen von Menschen dienen in Plattformen / Sprachen wie Java geschrieben werden - zB GMail, GMaps. Vergessen Sie über die Sprache / Plattform ist am schnellsten. Was noch wichtiger ist, dass Sie die richtigen Algorithmen verwenden und effecient Code schreiben und den Job zu erledigen.

AMD und Intel Prozessoren haben beide x86-Architektur, wenn Sie c / c ++ Programm auf einer anderen Architektur ausführen möchten Sie einen Compiler für diese Architektur zu verwenden, die gleiche binäre ausführbare Datei wird über verschiedene Prozessorarchitekturen nicht ausgeführt werden.

  

Ich weiß, Java hat VM-Versionen auf so ziemlich jedes Betriebssystem aber ist es eine CLR für andere Betriebssysteme außer Windows-?

Mono

In einer sehr vereinfachten Weise ist das, weil Intel und AMD die gleiche Assemblersprache implementiert, mit der gleichen Anzahl von Registern, etc etc ...

So Ihr C-Compiler kompiliert Code auf Linux zu arbeiten. Das Montage wird mit einem Linux ABI , so lange, wie das Kompilierungsprogramm auf Linux laufen wird , auf x86-Montage und die richtige Funktion Unterschrift, dann ist alles Dandy.

Versuchen Sie nun, dass die kompilierten Code nehmen, und es aufkleben, sagen Linux / PPC (zum Beispiel Linux auf einem alten iBook). Das wird nicht funktionieren. Wo, wie ein Java-Programm würde, weil die JVM auf der Linux / PPC-Plattform implementiert wurde.

Versammlung Langauge heute ist im Grunde eine andere Schnittstelle, die ein Programmierer zu programmieren. x86 (32-Bit) ermöglicht EAX, EBX, ECX, EDX für allgemeine Zwecke ganzzahlige Register und F00-F07 für Gleitkomma- zuzugreifen. Hinter den Kulissen hat die CPU tatsächlich hundert mehr Register und purzelte das Zeug um die Leistung zu verdrängen.

Sie haben Recht in Ihrer Analyse, Java oder C # entwickelt wurden, konnte direkt zu kompilieren auf jedem Rechner zu laufen, und wahrscheinlich schneller sein würde, wenn sie das tut. Aber die virtuelle Maschine Ansatz ermöglicht die vollständige Kontrolle der Umgebung, in der der Code ausgeführt wird, die VM eine sichere Sandbox erstellt, die nur Befehle mit der richtigen Sicherheitszugriff erlaubt auszuführen potenziell schädlichen Code - wie Passwort zu ändern, oder die Aktualisierung eines HD-Boot-Sektor. Es gibt viele andere Vorteile, aber das ist der Killer Grund. Sie können keine Stackoverflow in C # bekommen ...

Ich denke, die Prämisse Ihrer Frage gültig ist - Sie sind sicherlich nicht die erste Frage zu stellen. So überprüfen http://llvm.org einen alternativen Ansatz zu sehen (das ist jetzt ein Projekt, das ausgeführt wird? Oder gesponserten von Apple)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top