Assembler, Compiler, Interpreter Vor-/Nachteile?
hallo,
ich versuche grade die vor und nachteile von den 3 Programmiersprachen einfach gegenüber zu stellen. Bis jetzt habe ich: Vorteile: Interpreter: Übersetzt immer nur 1 Zeile, dadurch Fehlersuche einfacher; Compiler: Übersetzt das komplette Programm dadurch schneller
Nachteile: Interpreter: Langsamer da immer nur 1 Zeile übersetzt wird; Compiler: Fehlersuche schwerer da komplettes Programm übersetzt wird.
Kann mir jemand nach diesem simplen Musten evtl auch Vor und Nachteil(e) vom Assembler nennen? Was ich im Netz finde kann ich nicht so einfach erklären wie bei Compiler, Interpreter.
4 Antworten
Die Antworten zum Compiler und Interpreter von den anderen sind ziemlich gut, aber ich möchte nochmal auf einen Pseudo-Vorteil bzw. gravierenden Nachteil von Assembler hinweisen:
Auf aktuellen Desktop Systemen (x86, x64 und teilweise auch ARM) sollte rein theoretisch ein Stück Code, geschrieben in Assembler, am schnellsten laufen, aaaaber moderne CPUs sind ultra-komplexe Dinger, es gibt unzählige (Hardware- und / oder Microcode-) Bugs, man muss hunderte (!) Seiten von Errata lesen und ständig das Pipelining im Hinterkopf behalten, um WIRKLICH effizienten Code schreiben zu können.
Keine Frage, das ist möglich, aber der Aufwand übersteigt fast immer bei weitem den Nutzen, im Sinne von Entwicklungszeit.
Früher in den 90ern war allen Entwicklern bekannt, dass "inc ax" langsamer ist als "add ax, 1", und deshalb wurde die zweite Methode eingesetzt, auch wenn das den Code etwas mehr aufbläht.
Heutzutage gibt es ähnliche Dinge zu beachten, nur hundert mal komplexer und auch quantitativ (fast) unüberschaubar.
Deshalb eignet sich Assembler heutzutage meistens nur noch dazu, fertigen Code zu analysieren / reversen, in einer kompilierten Sprache Inline-Assembler mit nur einer Hand voll spezieller Instruktionen zu nutzen, oder auf einem Mikrocontroller zu entwickeln, wo die Zahl der möglichen Instruktionen und die Gesamtkomplexität noch recht einfach überschaubar ist.
Nichtsdestortrotz macht Assembler großen Spaß und man kann damit wirklich überdurchschnittlich kleine und flinke Programme schreiben, aaaaber das frisst wie gesagt a) verdammt viel Zeit und b) muss man sich da gerade bei modernen CPUs wirklich richtig gut auskennen, um eine Konkurrenz zu akutellen Compilern sein zu können.
Eigentlich stimmt nichts davon.
Erstmal Compiler, Interpreter und Assembler sind keine Sprachen(Ansichtssache bei Assembler), sondern Übersetzungsprogramme.
Es ist keine Frage davon, wie viele Zeilen sie übersetzen, sondern wann sie übersetzen. Compiler übersetzen zeitlich getrennt von der Ausführung, Interpreter übersetzen unmittelbar vor oder währen der Ausführung.
Fehlersuche ist eher Frage von Syntax und Semantik als von Wahl des Übersetzungsprogramms, wobei einige Compiler bessere Fehlermeldungen geben als andere.
Compiler, Interpreter
Sind keine Sprachen es sind "Arten" wie der code zum übersetzt wird in Maschienensprache. C++, C#, Java das sind Programmiersprachen.
c++-> Compiler
c#,Java -> Interpreter
Schau mal da steht alles wichtige drin:
https://www.c64-wiki.de/wiki/Unterschiede_zwischen_Assembler,_Interpreter_und_Compiler
Ja das waren die normal fälle. Ja grundsätzlich hast du recht.
Das ist falsch! C# und Java sind keine Interpreter! Es sind Compiler, die jedoch nicht direkt in Maschinencode übersetzen, sondern in IL, respektive Java Bytecode.
Diese werden dann von der Runtime per JIT Compiler in den tatsächlichen maschinencode übersetzt und ausgeführt.
Das sind nicht drei Programmiersprachen, sondern Programme, welche Programmcode in Maschinencode übersetzen.
Den von Dir genannten Vorteil des Interpreters verstehe ich nicht. Die syntaktische Fehlersuche beim Interpreter wäre viel aufwändiger, wenn immer nur eine Zeile übersetzt würde. Außerdem arbeitet quasi kein Interpreter heute mehr so, dass er zeilenweise übersetzt.
Der Compiler übersetzt das Programm ebenfalls in einem Rutsch. Das macht aber die Fehlersuche nicht schwieriger.
Wenn Du Vor- und Nachteile von Assembler, Compiler und Interpreter gegenüberstellen möchtest, dann nimm doch lieber sowas (nicht vollständig):
Assembler Vorteile: Programme sehr schnell, da auf einen speziellen Prozessor optimierbar.
Assembler Nachteile: Ausführbares Programm nur auf eine Architektur optimiert, Schwer lesbar, geschweige denn zu verstehen, Fehlersuche schwierig.
Interpreter Vorteile: Programme sind flexibel auf jeder Plattform ausführbar, sofern der Interpreter hierfür verfügbar ist.
Interpreter Nachteile: Häufig langsam, da bei jedem Programmstart das Programm erst übersetzt werden muss.
Compiler Vorteile: Programme ähnlich schnell wie bei Assembler, ausführbares Programm kann weitergegeben werden, Interpreter nicht nötig.
Compiler Nachteile: Programm ist auf eine Architektur festgelegt, außer, es wird für andere Plattformen ebenfalls compiliert.
Wobei das streng genommen nur der Standard ist. Man kann C++ interpretieren, man kann C# kompilieren.
Ob Java kompiliert ist, ist Ansichtssache und es gibt Programme die Java mitsamt JVM komplett kompilieren.