Worum geht es dir denn?
Ob das prinzipell irgendwie geht oder hast du eine konkrete Aufgabe?
Solche Abbildungen wie du sie beschreibst müssen zB von Compilern gelöst werden, etwas ein Datum von a nach b verschieben. Schon das ist alles andere als einfach!
Wie macht man das am besten? Codegröße? Laufzeit? Wo liegen die Daten? im internen Ram? im Flash? extern? sind die Daten gecacht? in Registern? sind es Konstanten? ist die Konstante dem Compiler bekannt? wird das Datum später nochmals benötigt oder nicht mehr gebraucht? greift man in den Speicher besser indirekt oder direkt (falls möglich)?, wie ist die Abhängigkeit zu anderen Daten? kann der Befehl an eine andere Stelle im Befehlsstrom eingefügt werden, um eine Pipeline besser zu nutzen? braucht man Register zum Zwischenspeichern? welche und wieviele? Welche Nebeneffekte gibt es (Statusänderung, etc?) Wird das Datum durch das Bewegen verändert (kann zB passieren, wenn es in Floating-Point-Register gespeichert wird)?
Das sind nur einige Aspekte für ein 'normales' Bewegen von Daten, noch gar nicht mal algebraische/logische Operationen.
In GCC wird so was nach anderen Zwischenstufen nach RTL (Register Transfer Language) übersetzt. Zu anderen Compilern kann ich nichts sagen, weil man da nicht in die Quelle sieht. Die RTL beschreibt algebraisch, was im Programm abgeht, und zwar auf einer schon recht niedrigen, registernahen Ebene. Die Instruktionen, die ein Target versteht, werden in RTL formuliert und mit einem Assembler-Template versehen, das angibt, welcher Assembler-Schnippsel diesem Code entspricht. Dabei geht GCC davon aus, daß es einen bestimmten Mindest-Befehlsvorrat auf einem Target gibt. Andere Befehle sind optional und als Goodie zufügbar, um dichteren Code zu bekommen. Diese RTL-Beschreibungen (wie der Rest vom GCC auch) sind natürlich alle handgemacht, also nicht automatisch generiert.
Es gibt auch Bestrebungen, Compiler automatisch generieren zu lassen. Die Idee ist, daß die Hardwarehersteller die Spezifikation ihrer Controller in einer Form zur Verfügung stellen, die dazu heran gezogen werden kann. Das ist alles noch Forschung; wie weit man da ist, hab ich Momentan nicht den Überblick. Aber auf absehbare Zeit werden menschengeschriebene Code-Generatoren mit Abstand die besseren sein.
Für deinen konkreten Fall '1 Bit verschieben' gewinnt auf jeden Fall Brain 1.0.
Und lass mich raten. '1 Bit verschieben' ist auf einem PIC gar nicht lösbar. Um das realisieren zu können, brauchst du bestimmt ein Zwischenspeicher, in dem du rumwutzen darfst -- auch wenn der nur 1 Bit groß ist.
Als Suchbegriffe werden dich
- compiler generator
- compiler creator
- denotational semantics
- attribute grammar
zu Seiten führen, die dein Frage in der einen oder anderen Weise berühren.
Ist aber meist starker Tobak
Als Startpunkt:
David W. Krumme, David H. Ackley: A Practical Method for Code Generation Based on Exhaustive Search. 185-196 Electronic Edition (DOI: 10.1145/806994), 1982
Lesezeichen