c# Wird C # teilweise interpretiert oder wirklich kompiliert?



6 Answers

Eine rein kompilierte Sprache hat einige Vorteile. Geschwindigkeit in der Regel und oft Arbeitssatzgröße. Eine rein interpretierte Sprache hat einige Vorteile. Flexibilität, keine explizite Kompilierungsstufe zu benötigen, die es uns ermöglicht, an Ort und Stelle zu arbeiten, und oft einfacher Portabilität.

Eine verkrustete Sprache passt in diesem Fall in einen Mittelweg.

Das ist ein Grund, warum wir uns eine verklemmte Sprache entweder als kompiliert oder als interpretiert vorstellen können, abhängig davon, an welcher Position, an welcher Metrik wir interessiert sind, und an unseren Vorurteilen für und gegen den einen oder anderen.

C # kann auch bei der ersten Ausführung kompiliert werden, wie es in ASP.NET geschieht, wodurch es in diesem Fall fast interpretiert wird (obwohl es immer noch nach IL kompiliert und dann in diesem Fall Jitter ist). Sicher, es hat so ziemlich alle Vorteile der Interpretation in diesem Fall (vergleichen mit VBScript oder JScript im klassischen ASP), zusammen mit vielen der Vorteile von kompiliert.

Streng genommen wird keine Sprache als Sprache ausgegeben, interpretiert oder kompiliert. Wir können C # in nativen Code einbinden (wenn es jedoch so etwas wie das dynamische Laden einer Assembly tut, wird es immer noch IL und jitting verwenden). Wir könnten einen Interpreter für C oder C ++ schreiben (mehrere Leute haben das schon gemacht). In seinem häufigsten Anwendungsfall wird C # jedoch zu IL kompiliert, das dann jitted wird, was nicht ganz die klassische Definition von interpretiert oder kompiliert ist.

c# interpreted-language compiled

Es gibt viele widersprüchliche Informationen darüber. Während einige sagen, dass C # kompiliert ist (wie es in IL und dann in nativen Code kompiliert wird, wenn es ausgeführt wird), sagen andere, dass es interpretiert wird, als es .NET benötigt. EN Wiki sagt:

Viele interpretierte Sprachen werden zuerst zu irgendeiner Form von virtuellem Maschinencode kompiliert, der dann entweder zur Laufzeit interpretiert oder in nativen Code kompiliert wird.

Ich bin ziemlich verwirrt. Kann jemand das klar erklären?




Zu viele Semantiken und Aussagen basieren auf Meinung.

Erstens: C # ist keine interpretierte Sprache; CLR und JVM gelten als "Laufzeiten" oder "Middleware", aber der gleiche Name gilt für Dinge wie Perl. Dies schafft eine große Verwirrung unter den Leuten, die sich mit Namen befassen.

Der Ausdruck "Interpreter", der auf eine Laufzeit verweist, bedeutet im Allgemeinen, dass vorhandener Code einen nicht-systemeigenen Code interpretiert. Es gibt zwei große Paradigmen: Parsen liest den rohen Quellcode und führt logische Aktionen aus; Die Bytecode-Ausführung kompiliert zuerst den Code in eine nicht-native binäre Darstellung, was viel weniger CPU-Zyklen zum Interpretieren erfordert.

Java wurde ursprünglich zu Bytecode kompiliert, dann ging es durch einen Interpreter; Jetzt liest die JVM den Bytecode und kompiliert ihn just in time in den nativen Code. CIL macht dasselbe: Die CLR verwendet Just-in-Time-Kompilierung für nativen Code.

Berücksichtigen Sie alle Kombinationen aus laufendem Quellcode, laufendem Bytecode, Kompilieren zu systemeigener Just-in-Time-Kompilierung, Ausführen von Quellcode über einen Compiler, Just-in-Time-native und so weiter. Die Semantik, ob eine Sprache kompiliert oder interpretiert wird, wird bedeutungslos.

Ein Beispiel: Viele interpretierte Sprachen verwenden Just-in-Time-Bytecode-Kompilierung. C # kompiliert zu CIL, welches JIT zu nativ kompiliert; im Gegensatz dazu kompiliert Perl sofort ein Skript zu einem Bytecode und führt dann diesen Bytecode durch einen Interpreter aus. Sie können eine C # -Assembly nur im CIL-Bytecodeformat ausführen. Sie können nur ein Perl-Skript im rohen Quellcodeformat ausführen.

Just-in-Time-Compiler führen auch eine Vielzahl von externen und internen Instrumenten. Die Laufzeit verfolgt die Ausführung verschiedener Funktionen und passt dann das Code-Layout an, um Verzweigungen und Code-Organisation für den jeweiligen Ausführungsablauf zu optimieren. Das bedeutet, dass JIT-Code schneller ausgeführt werden kann als nativ kompilierter Code (wie C ++ normalerweise ist oder wie C # durch IL2CPP läuft), weil das JIT seine Optimierungsstrategie an die tatsächliche Ausführung des laufenden Codes anpasst.

Willkommen in der Welt der Computerprogrammierung. Wir haben uns entschieden, es extrem kompliziert zu machen und dann an alle Dinge unbeschreibliche Namen anzuhängen. Der Zweck ist es, flamewars über die Definition von Wörtern, die keine praktische Bedeutung haben.




Zunächst einmal wollen wir die Definitionen von interpretiert und kompiliert verstehen.

"Kompilieren" (wenn auf Code Bezug genommen wird) bedeutet, Code von einer Sprache in eine andere zu übersetzen. Typischerweise von einem für Menschen lesbaren Quellcode in Maschinencode, den der Zielprozessor verarbeiten kann.

"Interpretieren" (wenn auf Code Bezug genommen wird) ALSO bedeutet, Code von einer Sprache in eine andere zu übersetzen. Aber dieses Mal wird es typischerweise verwendet, um von einem für Menschen lesbaren Quellcode in einen Zwischencode zu wechseln, der von einer virtuellen Maschine genommen wird, die ihn in Maschinencode übersetzt.

Nur um das klar zu stellen
Quellcode -> Compiler -> Maschinencode
Quellcode -> Compiler -> Bytecode -> Interpreter -> Maschinencode

Jede Sprache kann theoretisch interpreted oder compiled . Typischerweise wird Java in Bytecode kompiliert, der von der Java Virtual Machine in Maschinencode interpretiert wird. C # wird typischerweise in Bytecode interpretiert, der von der CLR, der Common Language Runtime, einer anderen virtuellen Maschine kompiliert wird.

Das Ganze ist ein Marketing-Gag. Der Ausdruck "interpretiert" wurde hinzugefügt (oder zumindest erhöht), um zu zeigen, wie ordentlich Just-in-Time-Kompilierung war. Aber sie hätten nur "kompiliert" verwenden können. Die Unterscheidung ist mehr eine Studie der englischen Sprache und der Geschäftstrends als irgendetwas von einer technischen Natur.




Ich glaube, das ist ein ziemlich altes Thema.

Aus meiner Sicht wird der interpretierte Code einen Interpreter durchlaufen, Zeile für Zeile übersetzen und gleichzeitig ausführen. Wie Beispiel Javascript, es ist ein interpretierter Code, wenn eine Zeile von Javascript in einen Fehler lief, wird das Skript nur brechen.

Während des kompilierten Codes wird er durch einen Compiler laufen und den gesamten Code auf einmal in eine andere Form von Code übersetzen, ohne ihn vorher auszuführen. Die Ausführung ist in einem anderen Kontext.




C # hat wie Java einen hybriden Sprachprozessor. Hybrid-Prozessoren führen sowohl die Interpretation als auch die Kompilierung durch.




Wenn wir der Definition des Interpreters zustimmen « In der Informatik ist ein Interpreter ein Computerprogramm, das Anweisungen, die in einer Programmier- oder Skriptsprache geschrieben sind, direkt ausführt, dh ausführt, ohne dass sie vorher in ein Maschinensprachenprogramm kompiliert werden müssen. »Es besteht kein Zweifel: C # ist keine interpretierte Sprache.

Dolmetscher auf Wikipedia




Related