Schwieriger zu bauen: Emulator oder Compiler?

8

Haben Sie einen erfahrenen Entwickler mit 10 bis 20 Jahren Erfahrung, der weder einen Compiler noch einen Emulator entwickelt hat, was eher eine Herausforderung wäre?

Könnten Sie die Probleme vergleichen, die für beide Straßenblöcke wären?

Danke.

    
Mark Lindell 01.04.2009, 13:55
quelle

9 Antworten

10

Emulation und Kompilierung sind ziemlich unterschiedlich, werden aber tendenziell zusammengelegt, weil beide als "Low-Level" betrachtet werden.

Die Emulation einer einfachen Architektur wie einem 6502 oder Z80 wird für den CPU-Teil der Arbeit ziemlich einfach sein, aber es wird einen ziemlich großen Code-Teil zum Schreiben geben, da Sie für jede Anweisung eine Funktion haben müssen. Sie werden dies in irgendeiner Weise automatisieren wollen, von einer Befehlssatz-Spezifikation mit allen Zeitvorgaben und so, da das Eintippen alles in der Tat sehr mühsam sein wird. Alte CPU-Befehlssatz-Spezifikationen sind leicht zu finden, das hilft also sehr beim Erstellen von Emulatoren.

Darüber hinaus müssen Sie eine gewisse Ebene der Hardware-Emulation implementieren , die normalerweise Interrupts behandelt und generiert (z. B. den vertikal leeren Interrupt eines Anzeigegeräts, wenn der Emulator dafür vorgesehen ist) eine Spielekonsole, sagen). Dies wird wiederum ein gewisses Maß an Spezifikation und Codegenerierung erfordern, aber Sie werden wahrscheinlich das meiste von Hand schreiben müssen, da es nicht so repetitiv (und somit automatisierbar) wie der Befehlssatzcode sein wird.

Die Kompilierung umfasst eine Art von Sprachspezifikation für jede Sprache, für die Sie den Compiler implementieren, und ein Ziel, für das Sie Code ausgeben möchten. Die Ausgabe könnte direkt zu binär sein, könnte Assembly sein oder könnte sogar eine andere Sprache sein (dies ist wirklich nur ein Übersetzer, aber es zählt als Kompilation, wenn das Ziel als "ausreichend" Low-Level angesehen wird). Da Sie auf einer Hardware oder einer VM-Plattform ausgeführt werden, müssen Sie sich wahrscheinlich keine Gedanken über die Handhabung von Interrupts und dergleichen machen.

Stolpersteine ​​ für beide sind Komplexität und Korrektheit - für den Emulator müssen Sie es sehr genau arbeiten lassen, wenn Sie nicht auswählen sehr einfache Dinge zu emulieren. Sie müssen auch eine Art integrierten Debugger für den Emulator erstellen, sonst ist es fast unmöglich zu sagen, was schief läuft, wenn dies immer der Fall ist. Für einen Compiler sollte es ziemlich geradlinig sein, eine Spielzeugsprache oder eine kleine Teilmenge einer komplexeren Sprache zu übersetzen und im Laufe der Zeit aufzubauen.

Denken Sie daran, dass Sie mit diesen beiden Elementen in der Lage sein müssen, Eingaben zu erzeugen, um sie zu testen, und wenn Sie keine einfachen Eingaben erzeugen können, wird es sehr schwierig sein, von Anfang an debuggen zu lassen. Dies allein macht den Compiler leichter zu erreichen, imho (Das und das, was Sie wollen, haben Sie etwas, das sofort eine vollständige Konsole oder etwas emuliert:)

    
David Gardner 03.04.2009, 16:08
quelle
8

Ich habe beide geschrieben und würde sagen, dass andere Dinge gleich sind (Komplexität der Sprache oder Befehlssatz), es ist einfacher, einen Emulator zu schreiben, besonders wenn Sie versuchen, einen interessanter Emulator oder Compiler.

Der Grund ist, dass Sie mit einem Emulator versuchen, ein Low-Level-Ding mit einem anderen, ähnlichen Low-Level-Ding zu simulieren. Es ist nicht so schlimm. Mit einem Compiler versuchen Sie möglicherweise, Ideen auf sehr hoher Ebene (z. B. Objekte, erstklassige Funktionen, verwalteten Speicher, Zeichenfolge-Scannen) mit Tools auf sehr niedriger Ebene (Maschinenwörter und Maschinenanweisungen) zu implementieren. Diese Aufgabe ist nur viel schwieriger.

Natürlich können Sie für Spaßbanden einen Emulator schreiben, der nach dynamischer Binärübersetzung arbeitet. Dies ist die Kompilierung von Maschinencode für die emulierte Architektur in den Maschinencode für die native Architektur. So bekommst du den ganzen Spaß von beiden - und produzierst wirklich schnelle Emulatoren wie QEMU oder den vielbeachteten Digital FX! 32.

    
Norman Ramsey 02.04.2009 03:27
quelle
6

Ich habe beide geschrieben und würde sagen, dass ein Emulator generell einfacher ist. Natürlich hängt dies stark davon ab, was Sie zu emulieren versuchen (die Emulation eines IBM Mainframe auf einem iPhone könnte eine Herausforderung sein) und was Sie zu kompilieren versuchen (ein kleiner C-Compiler ist ziemlich einfach, fast ein vollständiger C ++ - Compiler) unglaublich schwierig.

    
anon 01.04.2009 14:04
quelle
3

Es hängt weitgehend davon ab, was Sie emulieren und was Sie kompilieren.

  • Ein Emulator, der ein sehr einfaches System (z. B. einen Rechner mit vier Funktionen) auf einem sehr leistungsfähigen System (z. B. einem modernen PC) emuliert, wird leicht zu schreiben sein.
  • Ein Compiler, der eine sehr einfache Sprache für ein einzelnes Ziel kompiliert (z. B. etwas, das fast direkt auf die Ausgabebaugruppe abbildet), wird leicht zu schreiben sein.
  • Ein Emulator, der ein sehr komplexes System (z. B. ein großes, proprietäres Computersystem) auf einem sehr einfachen System (z. B. einem PDA) emuliert, wird sehr schwer zu schreiben sein
  • Ein Compiler, der eine Sprache auf sehr hoher Ebene (z. B. vollständiges C ++) für viele Ziele kompiliert, wird sehr schwer zu schreiben sein
Daniel LeCheminant 01.04.2009 14:03
quelle
2

Meiner Meinung nach ist ein komplexer Compiler schwieriger zu schreiben als ein komplexer Emulator, und zwar aus dem einfachen Grund, weil der Compiler viel mehr Theorie beinhaltet.

Beim Entwerfen Ihrer Sprache XX gibt es eine ganze Reihe von Faktoren zu beachten, ganz zu schweigen von der Optimierung der Ausgabe des compilergenerierten Codes, der eine schwarze Kunst an sich ist. Mit einem Emulator haben Sie eine bereits gut definierte Umgebung mit einer meist gut definierten Sprache, die Sie implementieren möchten.

Jedenfalls empfehle ich irgendjemanden, einen Compiler zu schreiben und zu schreiben, weil er Ihnen ein tieferes Verständnis der Programmierung vermittelt, genau wie der Arzt über die Körperanatomie Bescheid wissen muss, obwohl er sie in seiner täglichen Arbeit vielleicht nicht braucht.

>

EDIT: Ich denke beide Fähigkeiten sind sehr nützlich und man kann sie kombinieren - sie sind nicht XOR.

Ich möchte meiner obigen Meinung hinzufügen, dass das Erstellen einer nicht-trivialen Programmiersprache einschließlich Laufzeitbibliotheken für die Interaktion mit Treibern, Datenbanken usw., die mit zukünftigen Versionen weiterentwickelt werden kann, aber immer noch abwärtskompatibel ist, eine der schwierigeren ist Bereiche in CS.

Ich stimme auch zu, dass, wenn die Plattform unbekannt ist, d. h. Sie etwas zurückentwickeln, es viel schwieriger ist, einen Emulator zu machen, aber OTOH, worum es bei OP nicht geht, war es das?

    
Anders K. 02.04.2009 03:09
quelle
1

Die Emulation von Software ist ziemlich geradlinig und relativ einfach, kann aber mühsam sein.

Das Schreiben eines Compilers kann sehr schwierig sein, aber es wird einfacher gemacht, indem man entweder ein gutes Arbeitswissen hat oder eine gute Menge von Spezifikationen (zB Backus-Naur-Form-Notation) der Sprache, für die man den Compiler schreibt.

Die Emulation von Hardware kann extrem schwierig sein, wenn Ihr Ziel ist, den Emulator auf vielen verschiedenen Plattformen arbeiten zu lassen (z. B. kann die Ausführung der Emulation eines Diskettenlaufwerks unter MSDOS mit den korrekten Fudge-Konstanten funktionieren, aber die Emulation schlägt fehl auf einer Multitasking-Plattform wie Vista oder Linux). Die Hardware-Emulation ist ebenfalls extrem schwierig, wenn nicht genügend Wissen darüber verfügbar ist, wie ihre Betriebsart durch Software gesteuert wird. Dies zwingt lange und lästige Reverse-Engineering, bevor der Fortschritt gemacht werden kann.

Alles in allem halte ich die Nachahmung für schwieriger.

    
shortbaldman 28.05.2009 03:02
quelle
1

Das Schreiben eines Emulators für eine bekannte emulierte Plattform ist nicht so schwierig (Sie können auch einen vorgefertigten CPU-Emulator verwenden und etwas Entwicklungszeit einplanen).

Das Schreiben eines Emulators für unbekannte emulierte Hardware ist viel schwieriger und verschiebt die Schwierigkeit auf andere Felder als Codeentwicklung: Mathematik, Kryptoanalyse, Sicherheitsprotokolle usw. Und als Entwickler müssen Sie Habe Geduld für das Trial-and-Error, das mit dem Prozess verbunden ist.

Stellen Sie sich zum Beispiel vor, wieviel Zeit CPS2 Emulation benötigt (CPS2 ROMs wurden verschlüsselt).

>     
Gabriele D'Antona 04.07.2009 07:51
quelle
1

Außerhalb des Kontexts kann es keine definitive Antwort geben: Es hängt alles davon ab, was Sie erreichen wollen und wogegen Sie konkurrieren .

Wenn es nur ein "Proof of Concept" ist, dann ist es in beiden Fällen ziemlich einfach.

Aber wenn Sie versuchen, eine komplexe Hardware oder mit hoher Genauigkeit zu emulieren, oder wenn Sie AAA-Kompilierungsqualität erreichen wollen, können Dinge schnell von hässlicher Komplexität werden. Die Komplexität wird nicht nur in den Algorithmen / Theorien des "Haupt" -Codes auftreten, sondern auch in allen Support-Tools, die Sie erstellen müssen (Debugger, Disassembler, Profiler usw.), damit Sie zum nächsten Schritt weitergehen können.

Das heißt, ein weiterer Aspekt, den es zu beachten gilt, ist, dass das Schreiben eines funktionierenden Compilers für nahezu jede beliebige Programmiersprache von angemessener Komplexität ist. Auf der anderen Seite gibt es Hardware, für die das Schreiben selbst eines Basisemulators sehr komplex sein kann

Wenn ich mit einem breiten Pinsel streiche, würde ich sagen, dass es einfacher ist, einen Compiler zu schreiben, weil es Ihnen ziemlich sicher gelingt, eine funktionierende Version zu erhalten, unabhängig von der Zielhardware oder Sprache. Es gibt keine solche Garantie für einen Emulator.

    
Eric Grange 17.07.2009 06:22
quelle
0

Das Schreiben eines Compilers ist viel schwieriger, da es sich um Dinge auf der unteren Ebene handelt (Links, Assemblys, die spezifisch für Ihre Architektur sind usw.).

Ein Emulator muss nur die Logik jedes ihm zugeführten Befehls ausführen (und ich weiß, dass ich dies vereinfache, aber ich nehme an, dass Sie die Spezifikationen für den Befehlssatz haben), jetzt ist es viel schwieriger, einen FAST-Emulator zu schreiben.

    
CookieOfFortune 01.04.2009 13:58
quelle