Forum: Compiler & IDEs Codegenerator für Eclipse / GCC


von Andreas M. (schnitzeltony)


Lesenswert?

Hallo,

es soll eine Library erstellt werden, die ASCII-Befehle dekodiert. Die 
Befehle beginnen mit einer Kennung gefolgt von beliebigen Daten. Die 
'schnelle' Lösung ist kein Problem: ein Array im Flash mit Elementen 
einer Struktur, die die notwendigen Informationen enthalten. Ein Teil 
der Struktur ist die Kennung.
Wird ein Befehl empfangen, ist das Array so lange zu durchsuchen, bis 
der passende Befehl gefunden worden ist.

Der Haken an der Lösung: Das ganze kann bei vielen Befehlen 
(vergleichbare Projekte hatten schon mal >50 Befehle) ziemlich langsam 
werden, da im schlechtesten Fall die komplette Liste zu durchforsten 
ist.

Nun zu meiner Idee: Wie wäre es, einen balancierten Binärbaum zu 
verwenden. Dadurch reduzieren sich die Suchschritte erheblich. Da der 
Inhalt des Baums schon zum Zeitpunkt der Übersetzung fest steht, brauche 
ich auf dem Zielsystem nur auslesen - die Balancierung entfällt.

Mir ist zu Ohren gekommen, dass es Plugins für Eclipse für 
Codegeneratoren gibt, die sich für vielfältige Aufgaben konfigurieren 
lassen. Es wäre sehr geschmeidig, wenn mir ein solcher den balancierten 
Baum nach meinen Vorgaben im Quelltext erstellt.

Hat jemand Erfahrungen mit Codegeneratoren?
Wenn ja welche Systeme setzt Ihr ein?
Kennt Ihr Links, die einem Anfänger auf diesem Gebiet weiterhelfen?

von Karl H. (kbuchegg)


Lesenswert?

Andreas Müller schrieb:

> Der Haken an der Lösung: Das ganze kann bei vielen Befehlen
> (vergleichbare Projekte hatten schon mal >50 Befehle)

Na ja, 50 ist noch nicht wirklich viel. Aber ich verstehe was du meinst.

> Nun zu meiner Idee: Wie wäre es, einen balancierten Binärbaum zu
> verwenden.

Vom Prinzip her keine schlechte Idee. Aber du treibst zu viel Aufwand 
:-)

> lassen. Es wäre sehr geschmeidig, wenn mir ein solcher den balancierten
> Baum nach meinen Vorgaben im Quelltext erstellt.

Du brauchst den Baum nicht explizit.
Sortier dein Kommandos alphabetisch und benutz eine binäre Suche 
anstelle der lineare Suche. Das Ergebnis ist identisch zu einem 
balanziertem Baum, ohne dass du den Baum benötigst.

von Andreas M. (schnitzeltony)


Lesenswert?

Karl heinz Buchegger schrieb:
> Vom Prinzip her keine schlechte Idee. Aber du treibst zu viel Aufwand
> :-)

Vielleicht hast Du Recht aber trotzdem (böse Zungen behaupten, ich neige 
zur Sturheit :-) Ich habe während der Programmierung auf Controllern 
schon öfter den Wunsch verspürt, von Codegeneratoren Dinge erledigen zu 
lassen. Oft kommt genau das Szenario vor: Ich weiß schon bei der 
Erstellung des Programms genau, welche Daten/Algorithmen anfallen. Ich 
habe mir bisher mit Makros geholfen (mit all den Beschränkungen, die 
diese haben).

Also zurück zu dem Beispiel und vergiss mal den Binärbaum und nimm die 
binäre Suche (wie vorgeschlagen): Ich möchte eine Library erstellen, die 
später in verschiedenen Applikationen verwendet wird. Sollte der 
Applikationsprogrammierer mal einen schlechten Tag haben (oder einfach 
die korrekte Reihenfolge groß/klein/numerisch nicht kennen) und die 
Befehle falsch einsortieren, geht's ans langwierige Suchen. Auch hier 
würde mir ein Codegenerator weiterhelfen.

Meine Suche hat mich bisher zu http://www.openarchitectureware.org und 
XTEXT geführt. Das scheint ein ziemlicher Brummer zu sein ist aber sehr 
viel versprechend...

von Karl H. (kbuchegg)


Lesenswert?

Andreas Müller schrieb:

> Auch hier
> würde mir ein Codegenerator weiterhelfen.

Oder du gibst ihm eine Funktion, mit der er testen kann, ob seine 
Tabelle i.O. ist. Ist ja schnell gemacht.

Für einfachere Commandlines, vor allem wenn alle Befehle die gleiche 
Grundstruktur haben, verwende ich dein Schema mit Kommandotabelle und 
Funktionspointer.
Für kompliziertere Sachen benutz ich aber meist Compiler-Generatoren. 
Das geht einfach schneller und ist zuverlässiger. Gut, auf einem µC 
hatte ich das Problem so noch nie wirklich, da bin ich mit der 
Tabellen-Struktur eigentlich immer ausgekommen. Das Hauptproblem bei 
diesen Generatoren: Sie benutzen oft ziemlich ungeniert dynamische 
Stringallokierung, und das wird dann auf einem Mega8 fad :-)

von Peter (Gast)


Lesenswert?

Du könntest auch mit einer "HASH"-Tabelle arbeiten um die Abfragen zu 
beschleunigen.

Du berechnest für jedes Kommando zum Beispiel eine einfache Checksumme 
(1-Byte) oder für grössere Befehlslisten z.B eine 16-Bit CRC.

Der Komando-Interpreter (if oder case Struktur) wird dann viel 
schneller, wenn Du nur noch Byte oder Integer Vergleiche hast, anstelle 
von Stringcompaires...

von fritz (Gast)


Lesenswert?

"GNU gperf is a perfect hash function generator"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.