Forum: PC-Programmierung C-Code -> Zustandsautomat


von 0fh (Gast)


Lesenswert?

Hallo,

ich bin momentan für ein C Projekt auf der Suche nach einer Software, 
die es ermöglicht aus dem C-Code heraus eine übersichtlichere 
Darstellung zu generieren. Ideal wäre, wenn der C Code (mit 
Funktionsaufrufen und Returns) in einem Zustandautomaten abgebildet 
wird. Ein kurzes Googlen ergab leider keinen großen Erfolg. Evtl. kennt 
hier jemand eine solche Software, die er vielleicht sogar empfehlen 
kann. Das würde mir einiges an Handarbeit ersparen. Vielen Dank im 
Voraus!


von Ha Jo (Gast)


Lesenswert?

Hallo,

hier ein Artikel über Statemachines (in englisch).

Am Ende gibt es einen Link für den Download von
C-Source dazu. Hab es nicht eingesetzt, aber beim
durchsehen des Sources machte es einen übersichtlichen
Eindruck.

Vielleicht kannst Du ja etwas damti anfangen.

Kuckst Du hier:
http://www.embedded.com/showArticle.jhtml?articleID=10700829

Joachim

von Karl H. (kbuchegg)


Lesenswert?

> Ideal wäre, wenn der C Code (mit
> Funktionsaufrufen und Returns) in einem Zustandautomaten
> abgebildet wird.

Hmm.
Ein Programm das ein beliebiges Anderes analysiert und einen
äquivalenten Zustandsautomaten erzeugt stelle ich mir schwierig
vor. Ich würde sogar sagen, dass du berühmt würdest wenn du
sowas hinkriegst, denn das würde das Turing-Halteproblem lösen.
Nur leider hat Alan Turing vor mehr als 60 Jahren bewiesen,
dass das im Allgemeinen nicht möglich ist.

von Ha Jo (Gast)


Lesenswert?

Oh mann, da hab ich wohl etwas falsch verstanden. :-(
Aber es steht ja da:

> auf der Suche nach einer Software,
> die es ermöglicht aus dem C-Code heraus eine übersichtlichere
> Darstellung zu generieren

Da ist eigentlich nichts falsch zu verstehen.

Ist auch warm hier, ca: 29°C, da arbeitet mein Denkaparat
nicht mehr so richtig.

Sorry.

Joachim

von yalu (Gast)


Lesenswert?

Angeregt durch Karl heinzs Beitrag möchte ich nun auch etwas
rumtheoretisieren. Konkreter wird's dann weiter unten :-)

Computer werden üblicherweise als äquivalent zu einer Turing-Maschine
betrachtet, da man dadurch grundlegende Erkenntnisse der theoretischen
Informatik in die Praxis umsetzen kann. Bei der Entwicklung von
Programmiersprachen wie C wird darauf geachtet, dass sie Turing-
vollständig sind, d. h. dass in ihnen jede beliebige Turing-Maschine
realisiert werden kann.

Ich gehe davon aus, dass du mit Zustandsautomat einen endlichen
Automaten meinst. Endliche Automaten sind weniger mächtig als
Turing-Maschinen, d. h. jeder endliche Automat kann als
Turing-Maschine dargestellt werden, aber nicht umgekehrt.

Aus dem Geschriebenen folgt, dass ein C-Programm im Allgemeinen nicht
endlicher Automat dargestellt werden kann.

So ist das zumindest in der Theorie.

In der Praxis sieht es anders aus: Computer sind keine Turing-
Maschinen, sondern endliche Automaten, weil sie auf Grund der
begrenzten Speicherkapazität nur endlich viele Zustände annehmen
können*. Damit lassen sich entgegen dem oben Geschriebenen alle
C-Programme, die auf einem realen Computer lauffähig sind, ebenfalls
durch einen endlichen Automaten beschreiben. Man kann sogar alle auf
einem Computer lauffähigen Programme durch endliche Automaten
darstellen, die dieselben Zustände (alle möglichen Speicher- und
Registerbelegungen) und Zustandsübergänge (gegeben durch den
Hardwareaufbau) haben und sich lediglich in ihrem Anfangszustand
unterscheiden. D. h. du kannst dir (theoretisch) den Zustandsgraphen
mit einem sehr spitzen Bleistift und viel Geduld auf ein großes Stück
Papier malen, dieses an die Wand hängen und für jedes Programm, das du
entwickelst, den zugehörigen Startzustand farblich markieren. Damit
hast du die gewünschte Darstellung. Ob diese übersichtlicher ist als
der C-Quellcode wage ich allerdings zu bezweifeln.

> Ein Programm das ein beliebiges Anderes analysiert und einen
> äquivalenten Zustandsautomaten erzeugt stelle ich mir schwierig vor.
> Ich würde sogar sagen, dass du berühmt würdest wenn du sowas
> hinkriegst, denn das würde das Turing-Halteproblem lösen.

Das ist hier nicht das Problem. Geht man vom (unendlichen)
Turing-Modell aus, ist die Umsetzung in einen endlichen Automaten
nicht etwa schwierig oder algorithmisch nicht lösbar, sondern i. Allg.
schlichtweg nicht existent. Geht man vom Modell des endlichen
Automaten aus, ist die Umsetzung relativ leicht durchführbar, wenn
eine formale Beschreibung der Computerhardware vorliegt. Diese steckt
bspw. in jedem Rechnersimulationsprogramm drin.

*) Die Anzahl der Zustände ist allerdings so groß, dass die Turing-
Maschine ein handlicheres, wenn auch nicht 100%ig korrektes Modell
darstellt.

Genug theoretisiert. Ich wollte dir mit diesem Geschwätz eigentlich
nur sagen, dass die ausschließliche Verwendung von endlichen Automaten
i. Allg. nicht das geeignete Mittel ist, um komplexe C-Programme
übersichtlicher darzustellen. Man kann damit aber gewisse Teilaspekte
von Programmabläufen verdeutlichen. Andere Teilaspekte können bspw.
durch Klassendiagramme (bei objektorientierter Programmierung) oder
Sequenzdiagramme dargestellt werden.

Die Entscheidung, welche Aspekte mit welchen Mitteln beschrieben
werden, erfordert nach dem derzeitigen Stand der Technik jedoch den
Einsatz natürlicher Intelligenz, die manchmal durch geeignete Tools
(z. B. bei der Erstellung von Klassendiagrammen) unterstützt werden
kann.

Auch für die klassische Darstellung von Algorithmen mittels
Flussdiagrammen und Struktogrammen gibt es Tools, die sogar meist
vollautomatisch arbeiten. Da diesen Tools aber die Fähigkeit zur
Abstraktion fehlt, ist das Ergebnis meist wieder ein C-Programm, bei
dem um zusammenhängende Blöcke Kästchen gezeichnet werden und
Steuerkonstrukte wie Schleifen und Verzweigungen durch entsprechende
grafische Symbole ersetzt werden. Da diese Darstellunge bei komplexen
Algorithmen deutlich mehr Platz brauchen als ihr C-Äquivalent, ist
ihre Übersichtlichkeit aber meist schlechter als der ursprüngliche
C-Code.

Die beste Softwaredokumentation besteht meiner Meinung nach immer
noch aus gut kommentiertem Quellcode, einer Prosabeschreibung der
grundlegenden Ideen, die in dem Programm realisiert wurden, und
einigen manuell und mit Verstand angefertigten Bildchen (z. B.
Zustandsgraphen, Klassendiagramme, Sequenzdiagramme, Zeitdiagramme,
geometrische Skizzen, Regelkreisdiagramme oder was sonst eben so
passt), die Sachverhalte abstrahieren, d. h. wesentliche Dinge
darstellen und unwesentliche weglassen.

von Ha Jo (Gast)


Lesenswert?

Klasse beschrieben finde ich. Und Deinem Fazit, Zitat: "Die beste 
Softwaredokumentation besteht meiner Meinung nach immer
noch aus gut kommentiertem Quellcode,......", stimme ich voll und ganz 
zu.

Bin sogar etwas erstaund, wie jemand, der so gut theorisieren kann, dann 
doch auf den Boden zurückfällt und praktisch gut verwendbare Gedanken 
hat ;-)
Ist mir selten passiert. Die meisten bleiben in Ihrer Theorie und wollen 
diese auch in die Praxis umsetzen, scheitern aber oft.

Nun ja, dann einen schönen Tag.

Joachim

von Dirk (Gast)


Lesenswert?

Vielleicht hat sich der OP auch falsch ausgedrueckt. Ist vielleicht ein 
Flussdiagramm vom Programm gemeint?

Für groessere Programme schnappe ich mir ein Blatt und erstelle das 
Flussdiagram auf Papier, weil doch des oefteren radiert werden muss.

Ein Programm welches direkt aus dem C-Syntax ein Flussdiagramm 
inpretiert kenne ich nicht, falls jemand einen Interpreter kennt wie 
werden Interrupts berücksichtig  (und nasty interrupts) ?




von Schorsch (Gast)


Lesenswert?

in der prozeduralen entwicklung kenne ich mich nicht aus (denke aber, 
dass es da schelcht aussieht), aber zur OOP gibt es tools die modelle 
(UML) und code verknüpfen und konsistent halten.

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.