Also könnte ich eine immerwiederkehrende Formel zum Beispiel in ein "WORD" packen, um somit eine übersichtlichere Struktur im Forth Programm zu haben? Oder bestimmte Abfragen ebenfalls?
In erster Linie sind Worte in Forth gleichbedeutend mit Unterprogrammen in anderen Sprachen. Beim programmieren zerlegst du das Problem in entsprechende sinnvolle Teilfunktionen, welche du schrittweise als Wort realisierst. Schau dir mal diesen Text im Download an:
http://hive-project.de/wp-content/uploa ... sophie.pdf
Wenn du also eine Waschmaschine programmieren möchtest, hast du vielleicht folgendes Wort:
: kochwäsche
wassereinlauf 95 grad heizung 60 min trommel aus heizung wasserauslauf spülen schleudern ;
Dieses Wort beschreibt dein Problem wie eine Kochwäsche abläuft - zumindest nach meinem Kentnissstand...

Für dieses Wort benötigst du aber nun wieder einige Worte wie "Wassereinlauf" usw., die im Grundwortschatz nicht vorhanden sind:
: wassereinlauf \ füllt die maschine mit wasser
ein einlauf schalten
5 min warten
aus einlauf schalten ;
: wasserauslauf \ leert die waschmaschine
ein auslauf schalten
5 min warten
aus auslauf schalten ;
: spülen
wassereinlauf
1 min trommel
wasserauslauf ;
: schleudern
ein auslauf schalten
10 min trommel
aus auslauf schalten ;
usw.
Bei der Sequenz "95 grad heizung" wird ein Temperaturwert in °C auf dem Stack übergeben, "grad" wandelt ihn in einen für die Heizsteuerung nötigen Wert und "heizung" stellt diese Temperatur ein.
Die reale Programmierung in Forth findet natürlich in anderer Richtung als hier beschrieben statt, da ja beim compilieren eines Wortes immer schon die verwendeten Worte im Wörterbuch sein müssen. Man beginnt als immer mit den grundlegenden Worten, testet diese sofort und baut aus diesen Worten komplexere Sachen, bis man ausgehend vom Grundwortschatz bis zu einem Wort kommt, welches mein Problem beschreibt bzw. löst.
Im Prinzip ist das aber bei vielen Sprachen ähnlich. Bei Forth gibt es aber einige coole Besonderheiten:
1. Unterprogrammaufrufe haben extrem geringe "Kosten".
2. Wort = Unterprogramm|Daten + Datensatz
3. Sehr effiziente Testmöglichkeiten.
4. Forth ist in Forth programmiert.
Ich bin kein Forthprofi, deshalb entspricht das mehr meinem persönlichen Verständnis.
Zu 1. Unterprogrammaufrufe haben extrem geringe "Kosten".: Forth verwendet zwei Stacks: einen Return- und einen Datenstack. Die meisten anderen Sprachen, wie auch Spin, verwenden nur einen Stack. Wenn nun in Spin ein Unterprogramm aufgerufen wird, so werden alle Übergabeparameter auf den Stack geschaufelt inklusive abschließend die Returnadresse. Dann verarbeitet das Unterprogramm die Daten auf dem Stack, speichert das Ergebnis wieder auf diesem und führt ein Return aus. Das aufrufende Programm holt sich nun wieder das Ergebnis vom Stack und macht weiter. Das sind massig Stackoperationen bei einem einzigen Unterprogrammaufruf, also auch eine hoher Zeitaufwand (Kosten).
In Forth bleiben Daten fast immer direkt auf dem Datenstack und werden direkt und ohne Kopieraktionen dort verarbeitet. Ein Wort muss also nicht erst die Übergabeparameter auf den Stack speichern, da diese sich in den meisten Fällen schon dort befinden. Für einen Unterprogrammaufruf fallen also auch kaum "Kosten" in Form von Ausführungszeit für das Parameterhandling an.
Was bringt's: In Forth kann man Teilprobleme ohne Aufwand in sehr kleine Bausteine zerlegen. Damit ist die Speicherauslastung sehr effizient. Wenn man zum Beispiel in Spin so programmiert, wird man feststellen, das das Programm sehr langsam, je mehr man das Programm in Teilprobleme in Form von Unterprogrammen zerlegt - viel langsamer als Forth. Es hat schon seinen Grund, das Femto-Basic im wesentlichen aus einigen gigantischen Unterprogrammen besteht. Man könnte diese zwar sehr übersichtlich in Teilprobleme/Unterprogramme zerlegen, aber dann wäre das Basic extrem langsam. Schau es dir mal an, da gibt es Routinen, welche über viele Bildschirmseiten gehen!
Und jetzt betrachte mal die Forth Quelltext: Dort wirst du viele Worte finden, die teilweise nur Einzeiler sind. Das spart sehr viel Speicher, ist sehr gut zu testen und übersichtlich.
Zu 2. Wort = Unterprogramm|Daten + Datensatz: Ein Wort in Forth enthält nicht nur ein Unterprogramm, sondern auch Informationen wie den Namen der Routine, um diese Funktion zu verwalten. Das Wörterbuch ist dabei wie eine minimalistische Datenbank in Form einer verketteten Liste, in welcher die Routinen verwaltet werden können. Und zusätzlich enthält Forth nun auch Worte, um genau diese Verwaltungsfunktionen zu realisieren, wie zum Beispiel "forget" und "words".
Aber ein Wort muss nicht nur Programmcode, sondern kann auch Daten enthalten. Eine Variable oder Konstante ist solch ein Beispiel: Dabei wird ein Wort compiliert, welches einen Datenwert enthält und gleichzeitig die Information, mit welchem anderen Wort diese Daten verarbeitet werden können. Ruft man nun eine Variable auf, wird der Code ausgeführt um mit dieser Variable umzugehen: Dieser Code legt die Adresse der Variable auf den Stack und nun kann mit ! oder @ auf diese Variable zugegriffen werden.
3. Sehr effiziente Testmöglichkeiten: Wenn ich meine Waschmaschine programmiere, kann ich sofort mit "ein auslauf schalten" oder "aus auslauf schalten" die Funktion testen. Ich muss nicht erst eine Testumgebung programmieren, denn alles was man man zum testen benötigt (im wesentlichen der Interpreter und die Datenübergabe per Datenstack) ist immer im Forth enthalten.
4. Forth ist in Forth programmiert: Der Forthcompiler, der Interpreter und alle anderen Aspekte sind in Form von vielen Bausteinen (Worten) direkt in Forth programmiert. So kann man problemlos auch den Compiler direkt in Forth erweitern oder man kann schauen, wie die bestehenden Worte arbeiten, indem man einfach in die Quelltexte schaut.
Was momentan aber im Forth auf dem Hive noch fehlt, ist ein Quelltexteditor.
Wie baue ich ein Programm auf. Gibt es hier auch Programmzeilen wie im Basic?
Ich glaube ich verstehe die Frage nicht - was verstehst du unter Programmzeilen?
: sqr ( n -- n*n )
dup * ;
Dieses Wort berechnet das Quadrat von n und legt das Ergebnis auf dem Stack ab. Das sind zwei Programmzeilen, man könnte es aber auch als ": sqr dup * ;" in eine Zeile packen. Was meinst du genau?
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford