www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Befehls-Interpreter


Autor: Ralf Altmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias Matkowski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Altmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.