Frage

Ich arbeite an einem Programm, das iterierte fraktale Systeme macht. Ich wollte die Funktionalität hinzufügen, wo jemand ihre eigenen Iterationsprozess definieren könnte, und diesen Code kompilieren, so dass es effizienter ausgeführt werden würde.

ich zur Zeit nicht wissen, wie dies zu tun und würde gerne Tipps, was zu lesen zu lernen, wie dies zu tun.

Das Hauptprogramm ist in C ++ geschrieben und ich bin vertraut mit C ++. In der Tat die meisten der Szenarien gegeben Ich weiß, wie es Code Montage zu konvertieren, die das Ziel erreichen würde, aber ich weiß nicht, wie die zusätzlichen Schritt zu wagen es Code Maschine zu konvertieren. Wenn möglich, möchte ich dynamisch den Code zu kompilieren wie, wie ich viele Spielsystem Emulatoren Arbeit glauben.

Wenn es unklar ist, was ich frage, sagen Sie mir, so kann ich klären.

Danke!

War es hilfreich?

Lösung

Einige CPU-Emulatoren behandeln den Maschinencode, als ob es Bytecode war und sie haben einen JIT-Kompilierung, fast so, als ob es Java. Dies ist sehr effizient, aber es bedeutet, dass die Entwickler brauchen eine Version des Compilers für jede CPU ihres Emulator läuft auf und für jeden CPU emuliert schreiben zu können.

Das bedeutet in der Regel funktioniert es nur auf x86 und ist ärgerlich für jeden, der etwas anderes verwenden möchten.

Sie könnten auch zu LLVM oder Java-Bytecode oder .Net CIL übersetzen und dann kompilieren, die auch funktionieren würde.

In Ihrem Fall bin ich nicht sicher, ob diese Art der Sache ist der beste Weg zu gehen. Ich denke, dass ich das tun würde durch dynamische Bibliotheken. Machen Sie ein Verzeichnis, das enthalten soll „Plugins“ und lassen den Benutzer ihre eigenen kompilieren. Machen Sie Ihr Programm das Verzeichnis scannen und laden jede DLL oder .so es findet.

es auf diese Weise tun bedeutet, dass Sie weniger Zeit mit dem Schreiben Code Compiler ausgeben und tatsächlich mehr Zeit Dinge getan.

Andere Tipps

Ist die Routine dynamisch in einer bestimmten Sprache sein müssen erstellt werden. Wenn die Antwort auf diese Frage lautet: „Ja, muss es C ++“ Sie sind wahrscheinlich kein Glück. C ++ ist über die denkbar schlechteste Wahl für Online-Neuübersetzung.

Ist der dynamische Teil der Anwendung (die fraktale Iterator-Routine) ein wichtiger Engpass CPU? Wenn Sie sich leisten können, in einer Sprache, die nicht kompiliert wird, können Sie wahrscheinlich selbst eine Menge Ärger ersparen. Lua und JavaScript sind beide stark optimiert interpretierte Sprachen, die nur wenige Male langsamer als native kompilierten Code ausgeführt werden.

Wenn Sie wirklich die dynamische Funktionalität müssen in Maschinencode kompiliert werden, Ihre beste Wette ist wahrscheinlich zu sein mit Klirren / llvm. Klirren ist die C / Objective-C (und einige andere) vorderen Ende von Apple entwickelt online, dynamische Neukompilierung eine gute Leistung zu machen. llvm ist das Backend Klirren verwendet von einem tragbaren Bytecode nativen Maschinencode zu übersetzen. Werden, dass Klappern geriet derzeit nicht viel von C ++ unterstützen, denn das ist so eine schwierige Sprache richtig zu machen.

Wenn Sie Ihre dynamische Erweiterungen in C schreiben kann (nicht C ++), finden Sie vielleicht die Tiny C Compiler von nutzen sein. Es ist unter der LGPL verfügbar, es kompatibel ist für Windows und Linux, und es ist eine kleine ausführbare Datei (oder Bibliothek) bei ~ 100 kb für den Präprozessor, Compiler, Linker und Assembler, von denen alle es sehr schnell der Fall ist. Der Nachteil, dass, natürlich, ist, dass es nicht auf die Optimierungen zu vergleichen, können Sie mit GCC bekommen. Ein weiterer möglicher Nachteil ist, dass es X86 ist nur AFAIK.

Wenn Sie haben entscheiden Montage zu schreiben, kann TCC damit umgehen - die Dokumentation sagt, es unterstützt eine Gas-ähnliche Syntax, und es tut X86-Opcodes unterstützen.

TCC auch unterstützt ANSI C, und es ist fast vollständig kompatibel mit C99.

Dass gesagt wird, können Sie entweder schließen TCC als ausführbare Datei mit Ihrer Anwendung oder verwenden libtcc (es gibt nicht zu viel Dokumentation von libtcc online, aber es ist in der Quellcode-Paket verfügbar). In beiden Fällen können Sie Verwendung TCC erzeugen dynamische oder gemeinsam genutzte Bibliotheken oder ausführbare Dateien . Wenn Sie die dynamische Bibliothek Route gehen, würden Sie nur in einem Render setzen (oder was auch immer) Funktion darin und dlopen oder LoadLibrary darauf und Render rufen, um schließlich den Benutzer gestalteten Rendering laufen. Alternativ können Sie eine eigenständige ausführbare Datei machen und popen es und tun Ihre Kommunikation durch den stdin Standalone und stdout.

Da Sie Pixel sind zu erzeugen auf einem Bildschirm angezeigt werden, haben Sie darüber nachgedacht, mit HLSL mit dynamischen Shader kompilieren? Das werden Sie auf SIMD-Hardware zugreifen entworfen für genau diese Art der Sache, sowie der dynamischen Compiler direkt in DirectX gebaut.

LLVM sollte in der Lage sein zu tun, was Sie tun mögen. Es ermöglicht Ihnen, eine Beschreibung des Programms bilden Sie in einer objektorientierten Weise erstellen möchten, und dann kann es diese Programmbeschreibung in nativen Maschinencode zur Laufzeit kompiliert werden.

Nanojit ist ein ziemlich gutes Beispiel dafür, was Sie wollen. Es erzeugt Maschinencode von einem Zwischenlangauge. Es ist C ++, und es ist klein und Cross-Plattform. Ich habe es nicht sehr intensiv genutzt, aber ich habe um nur für Demos liebäugelt.

Spucken Sie den Code in eine Datei und kompilieren Sie es als dynamisch geladene Bibliothek, laden Sie es dann und es nennen.

Gibt es Grund, warum Sie nicht eine GPU-basierte Lösungen nutzen können? Dies scheint für eine zu schreien.

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