FORTH Beispiel

\ FEUER Demo FEUERMELDER Anwendung ALL 11:26 14MAY93 \ Last changed screen # 000 ALL 11:26 14MAY93

\ (C) 1993 by Dipl.-Ing. Wolfgang Allinger 'ALL0593' \ c/o Ingenieurbuero Allinger \ Brander Weg 6 Tel/FAX: (+49)+212/66811 \ D-42699 Solingen Germany \ noncommercial use granted !!!

\ Diese lauffähige Demo zeigt, wie eine anwenderfreundliche, \ selbstdokumentierende Sprache am Beispiel eines FEUERMELDER \ aussieht. Hinweis: alles in "( )" und nach "\" ist Kommentar. \ ":" ... ";" sind neue Definitionen. \ "Feueralarm?" und "Feueralarm_bearbeiten" sind 2!! Programme. \ Diese Demo belegt weniger als 700 byte Programmspeicher und \ läuft praktisch auf beliebigen Rechnern ohne Änderung. \ HISTORY MASTER LOAD SCREEN ALL 11:19 14MAY93

DECIMAL \ default base

000 CONSTANT $VFEUER \ Version Kontrolle

: -FEUER FORGET $VFEUER ; \ entfernt dieses Programm wieder

\ 2 ?SCREENS THRU \ 1 LOAD lädt dann die Anwendungsblöcke \ bei SEQ file system auskommentieren !

\ ALL0593 v0.00 first release

\ .VFEUER ... constants ... USER Interface ALL 10:16 14MAY93

: .VFEUER $VFEUER CR . ; \ zeige Versionsnr.

-1 CONSTANT ja

\ Bereich Meldung .. alle für die jeweilige Umgebung anpassen

VARIABLE Meldung \ bits gesetzt wenns qualmt, n. Zeile setzt 5 Meldung ! \ zB: bit0 = Melder1, bit2 = Melder3 : Melder@ ( a -- u ) @ ; \ liefert Datum aus Adresse Meldung CONSTANT Melder0 \ liefert Adresse der 1. Meldung : Rauch ; \ evtl eine Maske.. für geräuchertes

16 CONSTANT bits/Meldung \ zB 16bit oder was auch immer 16 CONSTANT alle \ Anzahl Melder

\ Rauchmelder anwählen abfragen entdeckt? ALL 11:15 14MAY93

VARIABLE Rauchmelder \ 1 ... n

: anwählen ( d a -- ) NIP ( n 0 a -- n a ) ! ;

: abfragen ( a -- uMASKE uDATA )

@ 1- bits/Meldung /MOD ( -- rem qot ) Melder0 + Melder@ ( -- rem uDATA ) 1 ROT ( -- uDATA 1 rem ) SHIFT ( -- uDATA uMASKE ) \ rem -> MASKE SWAP ; ( -- uMASKE uDATA )

: entdeckt? ( uMASKE uDATA -- t=RAUCH) AND 0> ;

\ Feueralarm melden nächsten abgefragt? ALL 11:15 14MAY93

: Feueralarm ( -- ^string nMelder )

" Rauch an Melder Nr.: " ( -- ^string ) Rauchmelder @ ;

: melden ( ^string n -- ) CR SWAP COUNT TYPE . 7 EMIT ;

: nächsten ( -- d ) Rauchmelder @ 1+ 0 ;

: abgefragt? ( n a -- ? ) @ 1-

Reply to
Wolfgang Allinger
Loading thread data ...

Das ist aber schon ein wenig getrickst und könnte man so ähnlich mit C-Makros auch machen. Es suggeriert eine Natürlichsprachigkeit, die so nicht vorhanden ist. Z.B. würde

aufhören falls Rauch entdeckt?

bei einigen Systemen zu Fehlermeldungen oder Warnungen beim Compilieren führen und bei anderen zu Abstürzen zur Laufzeit. Gibt bessere Beispiele, wie man Forth, und speziell immediate-Wörter, einsetzen kann.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss
*Frank Buss* wrote on Thu, 09-04-09 05:20:

Mich erinnert das an die ubiquitären Telephoncomputer, die ich konsequent boycottiere, weil sie meine Wortwahl ebenso konsequent nie verstehen. Eine vorgegebene Liste von Alternativen mit Tastatureingabe mag weniger "hip" sein, aber sie funktioniert.

Reply to
Axel Berger

Geb ich ja auch zu, wenn ich schon vorführen will, was FORTH kann, dann richtig :-)

Das haben bisher viele C-Freaks behauptet, aber in locker 16 Jahren hat mir das noch keiner gezeigt.

BTW Ich hab gerade mal in den Stamps nachgesehen, ich hab damals für das ganze Beispiel, von Idee bis Test incl. reichlich Dokumentation 70min gebraucht. Und Spass hats auch gemacht. Bin mal gespannt, wie lange die Entwicklung von/mit C-Macros dauert und ob das auch Spass macht? :-p

So extrem nicht, aber man kann die Anwendungsprogramme weitgehend in der Sprache des Anwenders schreiben. So findet der sich einfacher zurecht.

Also statt 4711 P123 P!

Kann man auch schreiben

Speisewasserpumpe ein Dampferzeuger ein ...

und bei einem Motorenprüfstand

Drehmoment @ Drehzahl @ >Leistung Leistung ! schreiben

wobei der Kraftwerksfritze lieber liest:

Spannung @ Strom @ cosPHI @ >Leistung Leistung !

und >Leistung ist dann jeweils angepasst auf die Nutzung des Anwenders.

Klar, dass Forthler das wissen, ich schreibs ja nur für die (noch) nicht Forthler. Vielleeicht wird er eine oder andere ja wach :-)

Stymmpt, nur wer mindestens 3 Arten des Missbrauches kennt, beherrscht sein Werkzeug wirklich.

Hab schon lange keinen PC mehr mit

-1 @ flachgelegt hüstel RESETet :-)

Ich kenne keine schnellere Methode.

Her mit den Beipielen. Ich kenne kaum einfache.

Auch das interessiert mich sehr.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Amen!

--
Gruesse, Joerg

http://www.analogconsultants.com/

"gmail" domain blocked because of excessive spam.
Use another domain or send PM.
Reply to
Joerg

Gehen würde das.. nur will den Murks keiner.

Schon bei dem Trivial-Rauchmelder stehen mir die Haare zu Berge..

Wenn man die Sprache mit selbstdefinierten Schlüsselwörtern derart verbiegt, findet man doch später nie einen Fehler - um _wirklich_ zu verstehen, was "Rauchmelder abfragen." heisst, muss man doch ständig nachgucken, wie es definiert wurde..

full ack.

Ja, sicher. Magische Zahlen durch benamste Konstanten ersetzen macht Sinn.. das ist jetzt aber keine Besonderheit von Forth.

--
Thomas Kindler
Reply to
Thomas Kindler

Mahlzeit!

Funktioniert nicht. Habs Feuerzeug an den Rechner gehalten, macht keinen Pieps.

Gruß, Michael.

Reply to
Michael Eggert

Hallo!

"Wolfgang Allinger" wrote

Ich bin kein Programmierer und hatte auch nur mit Basic, Pascal und eben C zu tun. Wenn, dann muss ich nur für µController kleine Progrämmchen von paar hundert Zeilen schreiben. Ich kannte bis dato Forth nicht, aber das Beispiel war nicht gerade vorteilhaft um es mir schmackhaft zu machen. Wehe es sagt einer noch das die Leer- zeichen Absicht sind! Obige Zeile sieht eigentlich wie Assembler in schlimm aus.

alsdenn, Jens

Reply to
Jens Frohberg

Forth *ist* Assembler - allerdings in besser.

Reply to
Zweigeist

Du hast leider nicht richtig von Anfang an gelesen/verstanden. Alles in Klammern ist Kommentar. Und ich kann nicht erst einen 5 seitigen Grundlagenkurs in Forth davorschreiben. Leerzeichen sind in Forth die Trennung zwischen eigenständigen Worten ( Programme, Funktionen etc.)

Das obige könnte man auch ohne Kommentar so schreiben

: anwählen NIP ! ;

Aber ich finde es schlechten Stil, nicht zu dokumentieren, was da abläuft. Was Dir nicht gefällt, sind sog. Stack-Kommentare, die zeigen, was mit den Daten auf dem Stack passiert und was für Daten das sind. Im obigen Beispiel frisst das Wort ein double (d) und eine Adresse (a) und gibt nichts zurück. NIP verwirft die oberen 16 bit des double und lässt die unteren 16 bit als integer (n) zurück. ! (store) speichert n nach a und mit ; ist die Definition beendet. Mit : wird ein neues Wort definiert unter dem Namen, des nächsten Wortes (hier anwählen) aus dem Eingabestrom und der Compiler eingeschaltet. Der wird mit ; wieder abgeschaltet. Am Ende der Zeile ist das neue Wort anwählen fertig kompiliert.

Und ich wollte zeigen, dass man in Forth ausgesprochen einfach neue Worte (Funktionen) deklarieren kann, die das Schreiben einer Anwendung in der Sprache des Anwenders ermöglichen.

Was verstehst Du an dem Anwenderteil am Schluss nicht? Das es nicht aussieht, wie ein C-Programm sondern im Klartext zu lesen ist? Zeig die letzten Zeilen des Beispieles ab Feueralarm_bearbeiten mal Deiner LAG, und frag, ob sie kapiert, was es macht.

Ich hoffe nun ist es etwas klarer.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Dann brenn den Rechner am besten ganz ab. Ist für Dich vermutlich eh überflüssig :-)

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Dann macht mal, wie gesagt, bisher hat es mir keiner vorzeigen können. Ich nehme auch Murks an. Also keine Angst und Ausflüchte.

Das ist normal für C-Freaks, denen bricht ein Weltbild zusammen.

Du brauchts nicht wissen, wie es funktioniert, wenn es funktioniert und das macht, was da geschrieben steht: Rauchmelder abfragen.

Und in anderen Proggis musst Du auch die Definitionen einer Routine verstehen, wenn Du es warten willst. So what, in Forth ist es wesentlich einfacher.

Es geht eigentlich nicht um natürliche Sprache (auch das wurde in Forth schon gemacht) sondern darum, dass es der Anwender mit seinen Spezialausdrücken ohne Klimmzüge lesen kann und eben keinen Programmierer braucht, um zu verstehen, was da abläuft.

Nein, aber das die Namen einfach in der Fachsprache des Anwenders deklariert sein können, ist schon was besonderes.

Erklär mal, was (*(void(*)())0)() macht :-) Stammt aus einem C-Programm. Oder frag mal Deine LAG :-o

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Forth ist noch viel mehr und viel besser.

Interpreter, Compiler, Debugger, Betriebssystem, Multitasker, Scriptsprache und deckt die ganze Bandbreite von Maschinencode über Assembler, HLL bis Metasprache ab.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Wenn der Anwender erst das Programm lesen muß, um zu verstehen, was da abläuft, ist aber schon ziemlich was schief gelaufen während der Planung und Entwicklung :-)

Wieso sollte das in C nicht gehen?

In einigen Empfehlungen, wie MISRA, sind Funktionszeiger nicht erlaubt, daher würde man sowas gar nicht in Programmen sehen.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Naja, darum gings doch:

Die LAG würde also weiterprogrammieren:

Und sich wundern warum es Fehlermeldungen hagelt. Eben _wegen_ der vorgetäuschten Natürlichsprachigkeit.

Thomas

Reply to
Thomas Meier

Du hast aber versucht, zu argumentieren, dass das nicht nötig sei.

Kann man in C und jeder anderen imperativen Programmiersprache auch. Wenn man das in C genauso aufschreibt, kommt nur schlechter Stil raus, weil man in der natürlichsprachigen Notation keine Statusinformationen mitführen kann und alles global speichert.

bool rauch_entdeckt, alle_rauchmelder_abgefragt;

void feueralarm_bearbeiten() { do { rauchmelder_abfragen(); if (rauch_entdeckt) feueralarm_melden(); naechsten_rauchmelder_anwaehlen(); } while (not alle_rauchmelder_abgefragt); }

Ich würde allerdings void feueralarm_bearbeiten() { for (rauchmelder* = erster_rauchmelder(); rauchmelder != 0; rauchmelder = naechster_rauchmelder(rauchmelder) { if (rauchmelder_abfragen(rauchmelder) == Rauch_Entdeckt) feueralarm_melden(); } } schreiben.

Das ist nach kurzer Einweisung auch beim C-Programm klar. Nur ist beim C-Programm auch (mir zumindest) klarer, was gültige Erweiterungen sind; beim FORTH-Programm hingegen nicht, wie man die Worte permutieren darf. Natürlichsprachig wäre für mich zum Beispiel beginne ... aufhören wenn alle Rauchmelder abgefragt; Ist sicher nicht zulässig.

Stefan

Reply to
Stefan Reuther

Eine der Stärken von Forth ist die leichte Anwendbarkeit des Konzepts der strukturierten Programmierung, denn wenn man keine locales verwendet, kann man einfach sinnvoll wiederverwendbare Teile einer Definition ausschneiden und ein neues Wort dafür definieren, ohne sich wie bei C Gedanken um Übergabe- und Rückgabeparameter machen zu müssen.

Hier z.B. meine ersten Schritte in Forth:

formatting link

Man sieht sehr schön, daß es noch ziemlich nach C aussieht und die Refaktorierungsvorschläge der anderen Poster für den dump-Befehl sind ein schönes Beispiel dafür, wie dadurch der Code viel leichter verständlich und auch auf Korrektheit testbar ist.

Sinnvoll ist immediate immer dann, wenn man die Syntax erweitern möchte. In C ist es z.B. möglich, per "0x"-Prefix eine hexadezimale Zahl anzugeben. In Forth geht das nicht von Haus aus. Man kann aber das Wort $ definieren, was dann das folgende Wort zur Compilierzeit einliest und es als Hexadezimalzahl interpretiert:

formatting link

Ist ein gutes Beispiel für die Flexibilität von Forth. Könnte man auch leicht mit % für binäre Zahlen implementieren.

In C geht sowas nicht. Man könnte zwar ein Makro schreiben, muß dann aber bei der Anwendung Klammern verwenden. Und % als Makro in C zu definieren wäre auch nicht so gut :-)

Nicht direkt eine immediate-Anwendung, aber auch in diese Richtung geht das does> Wort. Damit kann man z.B. sowas wie C-Strukturen in Forth nachbilden. Ich habe das mal so gelöst:

\ start a named structed : start-struct ( name -- name-address 0 ) create here cell allot 0 does> @ ;

\ create a field in a struct : field ( index size name -- index+size ) create over , + does> @ + ;

\ finish the struct : end-struct ( name-address size -- name-address=size ) swap ! ;

Die Anwendung geht dann so:

\ struct RECT start-struct RECT 4 field left 4 field top 4 field right 4 field bottom end-struct

create temp-rect RECT allot

\ clear offscreen framebuffer : clear ( -- ) 0 temp-rect top ! 0 temp-rect left ! width temp-rect right ! height temp-rect bottom ! background-color call CreateSolidBrush dup temp-rect framebuffer-dc call FillRect drop DeleteObject drop ;

Ist ein Auszug aus meiner interaktiven grafischen Forth-Testumgebung:

formatting link

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Nö, kann ja mal sein, dass der Kunde was kaputt spielt oder in der Produktion mal was nicht geht und er unbedingt den Durchfluss an Messwertaufnehmer 4711 braucht. Ich häng dann am Telefon und sag ihm, hau mal auf die ESC Taste,

Tipper mal "4711 Durchfluss ." ein, was kommt als Zahl? Siehste, das iss der Durchfluss. Hmmm, ja aber das kann bei 123°C garnicht sein. An welchem Thermometer? Einlauftemperatur am Kessel 3

Na dann tippe doch "3 Kessel Einlauftemperatur ." Och, nur 25° da iss die Sicherung vom Heizkreis raus...!

Ahh, Danke!

Und später fragen die mich Löcher in den Bauch, warum die Fehlersuche so einfach ist.

Oder irgendein Trollo (im Einkauf üblichereise) hat ein anderes Material eingekauft. Hilfe, jetzt klappt der Process 4712 nicht mehr, bei der Umrechnung von X nach wasweisich muss jetzt noch alles mit 3,975 multipliziert werden. Bisher hamwa das nur durch 2 geteilt. Du meinst die Umrechnung von x>wasweisich? Jau, gut, dann tipp mal

: x>wasweisich 3975 1000 */ 2* x>wasweisich ;

und dann noch

x>wasweisich is x>wasweisich

gehts nun? Jau,

Mussu jetzt nach jedem Reset machen, bis ich mal wieder komme oder soll ich ein update des Programmes machen?

Nö, bis übermorgen hamwa den Mist wechgehauen. Dann mach ich den reset sowieso und alles läuft wie gehabt...

Der Meister tobt gerade im Einkauf, der knutsch Dich, wenn die Produktion wieder läuft, wenn er zurückkommt...

Örks, alles nur nicht knutschen, ich nehm lieber ein Bier. Ok, sach ich ihm.

Du kannst da "Kessel 3 Einlauftemperatur ." schreiben und das geht?

Theorie != Praxis, IIRC stammt das aus einem Programm auf einem PC.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Es geht nicht ums programieren, sondern ums verstehen, was da abläuft.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Nein, ich hab versucht zu zeigen, dass man Forth Programme in der Sprache des Anwenders schreiben kann, die der versteht:

Egal wie, Du musst dem Leser schon einiges an C beibringen, damit er das kapiert. Mein Beispiel kann er einfach lesen. Keine Klammern, keine Hyroglyphen...

Das wäre auch einfach zu machen, müsste ich die passenden Worte neu erfinden/ändern. Ist wirklich nur eine Fingerübung.

Forth ist keine statische Sprache, das ist ja der Vorteil. Bei Forth ist alles eine Erweiterung, was nicht zum Grundwortschatz gehört. Du erweiterst Forth solange, bis es Deine Anwendung erledigen kann. Dann ist das Programm fertig. Alles, was : .... ; schluckt ohne zu nörgeln ist gültig. Sinnvollerweise gibts Du den neuen Worten eine vernüftigen Namen und hälst die Definitionen möglichst klein.

Neue Worte werden aus vorher deklarierten Worten zusammengebaut...

Diese riesige Freiheit sollte man latürnich mit einer gewissen Disziplin ausnutzen.

Wenn Du mit aller Gewalt auch den Grundwortschatz umtaufen willst, ist das auch kein Problem, es sind alle Quellen dabei. Ob du damit glücklich wirst, alle DUP in DUPLICATE oder alle INC in ++ umzutaufen, sei dahingestellt. Aber können könnte man.

Wie gesagt, Forth ist was völlig anderes, wie alle anderen Sprachen, die ich kenne.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.