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!
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
> 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.
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
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.
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
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) ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.