Forum: Mikrocontroller und Digitale Elektronik Befehls-Interpreter


von Ralf Altmann (Gast)


Lesenswert?

Hallo,

wie kann ich in C für einen 8051er einen "Befehls-Interpreter"
schreiben? Ich hab mir jetzt schon ein bisschen den Kopf heissgedacht,
aber egal was mir einfällt, entweder würde es ein riesiges if... else
if... Wirrwar geben, oder einen recht komplexen switch...case Baum!

Ein weiteres Problem an der Sache wird auch sein, das ich
String-Funktionen in der gegenwärtigen Form (sprintf, usw.) nicht
verwende, sondern selbstgeschriebene Routinen für die serielle
Schnittstelle, die auch mit Parity-Check arbeiten, allerdings nur
byteweise.

Mit den üblichen String-Funktionen wird so ein Interpreter wohl
einfacher zu lösen sein, oder?

Kann mir jemand auf die Sprünge helfen?

Danke

Gruß Ralf

von Mathias Matkowski (Gast)


Lesenswert?

Was genau möchtest du interpretieren? Bytecode oder irgendeine
Skriptsprache?

Bytecode wird vermutlich ein riesiges switch (hab ich aber noch nie
ausprobiert); bei einer Skriptsprache gibt es geschicktere
Möglichkeiten.
Die musst du nämlich zuerst einmal parsen und einen syntax tree
aufbauen. Erst dann gehts ans Interpretieren, was dank des syntax trees
nicht mehr allzu kompliziert ist.
Zu allererst musst du aber die Grammatik definieren.

Wie man einen Parser/Compiler schreibt ist aber nicht in ein paar
Sätzen zu erklären.
Diese FAQ könnte dir helfen:
http://www.c-plusplus.de/forum/viewtopic.php?t=41470

von Markus (Gast)


Lesenswert?

Das mit dem syntax tree ist zwar im Prinzip richtig, aber mir scheint,
daß z.B. Bascom darauf verzichtet. Das führt dann dazu, daß man keine
komplizierten Ausdrücke schreiben kann (Bascom kann z.B. kein x = a + b
+ c, sondern nur x = a + b, x = x + c). Das macht die Sache wesentlich
einfacher (und natürlich auch weniger leistungsfähig).

Das mit den vielen if bzw. switch ist normal, insbesondere wenn man das
mit einer Statemachine realisiert.

Markus

von Ralf Altmann (Gast)


Lesenswert?

Mhm... okay, mal sehen. Wenn ich die Begriffe von euch richtig verstehe,
ist meine Anwendung dann ein Byte-Code Interpreter. Jeder Befehl ist 1
Byte groß. Je nach Befehl gibt es dann entweder eine festgelegte oder
eine variable Datenmenge hinten dran.

@Markus:

Dann war mein Ansatz mit den if bzw. switch schon richtig? Dann werd
ich mir das nochmal genauer überlegen.

Gruß Ralf

von Matthias (Gast)


Lesenswert?

Hi


bitte?
Bascom kann sowas wie x = x + a + b nicht? Dann ist das Ding ja
wirklich so übel wie mir meine Vorurteile bisher nahelegten.

Matthias

von Markus (Gast)


Lesenswert?

@Matthias:

Wie gesagt, ich vermute, daß er das ohne Parsetree macht, denn dann
wird das Verarbeiten von solchen Ausdrücken sofort wahnsinnig
kompliziert. Deswegen wurde bei Bascom wohl darauf verzichtet.

Die Stärken von Bascom liegen halt woanders: Während die Frischlinge
beim WinAVR noch suchen, wie sie das Ganze überhaupt zum Laufen
bringen, da haben Bascom-User das Programm schon geschrieben, Simuliert
und zum MC übertragen.

Markus

von OldBug (Gast)


Lesenswert?

...und wissen überhaupt nicht, was der Codewizard denn jetzt alles
"gezaubert hat"...

von Markus (Gast)


Lesenswert?

@Oldbug:
Natürlich nicht, aber das ist auch nicht nötig. Am Anfang interessieren
ganz andere Dinge. Natürlich will man langfristig nicht mit Bascom
arbeiten, aber für die ersten 10 Projekte ist das ideal und danach
verstehen die Leute auch soviel davon, daß der Umstieg auf eine andere
Sprache nicht allzuschwer fallen sollte.

Markus

von Rufus T. Firefly (Gast)


Lesenswert?

Bytecode muss übrigens kein gigantisches switch-Statement implizieren -
da lässt sich ein (Funktions-)Pointerarray auch sehr schön verwenden.
Als Abfallprodukt erhält man ausserdem enorme Geschwindigkeit, da zum
Aufruf einer durch Bytecode definierten Funktion nur ein zusätzlicher
Arrayzugriff erforderlich ist.

Das Pointerarray muss aber 256 Einträge groß sein, sonst muss vor
Zugriff der Wertebereich der Bytecodes überprüft werden. Unbenutzte
Einträge sind im Array mit NOP oder vergleichbarem zu belegen
(natürlich ist nicht der NOP-Opcode gemeint, sondern eine Funktion, die
nichts tut). Nullpointer dürften hier spannende Resultate liefern ...

von Markus (Gast)


Lesenswert?

@Rufus:
Als Anfänger habe ich mich gewundert, warum switch überhaupt existiert
(if-else ist ja nicht soviel komplizierter) und warum es nur mit
ordinalen Werten arbeitet. Mittlerweile vermute ich, daß der Sinn darin
besteht, daß man dann mit Sprungtabellen arbeiten kann und sich somit
sogar den Vergleich spart. Letztendlich ist es das gleiche wie Dein
Pointerarray, nur eleganter.

Markus

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.