Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Rund um die Programmierung ::  Forth anyone?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
retro-fan
Unregistrierter




Beitrag retro-fan Unregistrierter 10:41:54 16.03.2017   Titel:   Forth anyone?            Zitieren

hi, ich beschäftige mich gerade mit forth, einer programmiersprache aus der zeit der 8-bitter, die ziemlich in vergessenheit geraten ist. was eigentlich recht schade ist, da das konzept einer erweiterbaren wortliste in verbindung mit einer stackmaschine (upn) irgendwie genial ist.

als begleitliteratur lese ich Leo Brodie's "starting forth".
als umgebung benutze ich einen in java geschriebenen forth-interpreter (vermutlich forth-79 kompatibel)

hat jemand noch tipps für mich?
danke schon mal ... :)
muemmel
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2007
Beiträge: 3544
Beitrag muemmel Mitglied 14:30:01 16.03.2017   Titel:   Re: Forth anyone?            Zitieren

Hi Retro-Fan,

retro-fan schrieb:
da das konzept einer erweiterbaren wortliste

Ist das nicht eigentlich jedes (ordentliche) Programm?
Nur woanders heißen sie halt Komponenten, proceduren oder funktionen... Das sind auch nur (selbst oder vom herstelelr) vorgefertigte Arbeitstiere, die mit einem entsprechendne Aufruf zum Arbeiten animiert werden.

Wenn Du schreibst:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Programm SchnickschnackRechnen
{
  Eingeben;
  Berechnen;
  Ausgeben;
}
 
und dann schreibst
 
Eingeben
{
  KursorPositionieren;
  EingabeaufforderungSchreiben;
  EngabeEntgegennehmen;
}
...


Dann ist das nichts anderes als die Bildung neuer Worte in Forth.

Forth ist damals zur Echzeitsteuerung von Radioteleskopen entwickelt worden. Und auf diesem Sektor liegen auch seine größten Stärken. Du kannst damit auch gut ne Waschmaschine programmieren.

Für die praktische Anwendung ist es etwas spröde, da die UPN-Schreibweise für normale Programmierer doch ienen ziemlichen Knoten im Kopf erfordert. Außerdem sehe ich die Arbeitsweise als Stackmaschine für größere Projekte als ein wenig sperrig an. Du musst immer zusehen, wie Du die benötigten Parameter in der richtigen Reihenfolge auf den Stack bekommst. Änderungen an einzelnen "weiter unten" steckendne Teilen sind da nicht ganz einfach. An sich ist ja (fast) jeder Prozessor mehr oder weniger eine Stackmaschine, aber es hat schon sienen Grund, warum einem der Compiler die Arbeit damit abnimmt.

Der wiuchtigste Grund für Forth dürfte damals gewesen sein, dass UPN-Programmierung sehr einfach durch den Compiler oder Interpreter auswertbar ist. Als ich mal einen Formelinterpreter in enem früheren Projekt brauchte, hab ich den auch als UPN-Stackmaschine realisiert, aber das umschreiben der vielen hundert Einzelnen Formeln in die umgekehrt polnische Notation war echt eine Schweinearbeit.

Als Spaßobjekt und Hobby ist sowas immer gut zu machen, auch um die eigenen Hirnwindungen geschmeidig zu halten..., aber für produktive Zwecken würde ich es nicht mehr nehmen.

Wenn Du aber wirklich damit arbeiten willst, solltest Du mal nach einem geeigneten Tool suchen (git es) das aus normelen Anweisungen UPN-code macht.

Gruß Mümmel

_________________
Muemmel ante portas
bekennender Maskulinist der schon länger hier lebt
Artchi
Autor

Benutzerprofil
Anmeldungsdatum: 16.03.2002
Beiträge: 9084
Beitrag Artchi Autor 19:08:28 16.03.2017   Titel:              Zitieren

Naja, die Proceduren sind auch eine Art Wortschatz... stimmt. Aber der Clou bei Forth ist, das diese zur Laufzeit definiert werden.

Aber ansonsten hat Forth nichts was mich reizen würde. muemmel hat schon den großen Nachteile aufgezählt, nämlich die Umgekehrte polnische Notation. Dagegen ist C und C++ Kindergarten!

OK, das wäre jetzt echt ungerecht, Forth komplett abzuschreiben. Es gibt einen einzigen Fall, wo ich Forth einsetzen würde: man hat ein nacktes System, das vielleicht nicht mal sowas wie ein BIOS hat. Und man soll da jetzt irgendwas mit drauf machen, weil man höchstens einen Maschinensprachemonitor dafür hat. In dem Fall würde ich mir einen Forth-Interpreter schreiben, um das Henne-Ei-Problem zu lösen... auch bekannt als Bootstrep. Dann könnte man in kleinen Forth-Schritten sich Progrämmchen schreiben um ein BIOS und Interpreter für bessere Sprachen zu erschaffen... und um dann Forth endlich los zu werden. :D ;)

Ja, Forth hat seine Berechtigung. Aber ganz bestimmt nicht für den täglichen Einsatz. Sondern da, wo einem nur ganz wenige Hilfsmittel zur Verfügung stehen. Vielleicht noch auf einem kleinen System, wo man nur Assembler nutzen kann, noch kleine Scripte einbetten will ohne groß eine Script-Engine aufzufahren. Aber mehr auch nicht.

Es gibt übrigens zwei Sprachen, die sich an Forth ohne UPN orientieren. Und die machen dann wirklich Spaß!

Einmal das aus Amiga-Zeiten bekannte, aber schon lange auf PC portiertes REBOL: http://rebol.com/
Habe ich damals mit rumgespielt und war doch angetan. Aber irgendwann blieb die Entwicklung stehen.
Der REBOL-Kern ist deshalb mittlerweile auch Open Source. Aber interessant ist das Gesamtpaket, also mit GUI- und Internet-Runtime. Der Gedanke von Forth ist dort wirklich umgesetzt... ohne UPN.

Zweiter Kandidat ist http://www.red-lang.org/ Einfach mal anschauen, weil dieses scheint aktiv in Entwicklung zu sein... sozusagen das lebende REBOL.

_________________
http://www.kharchi.eu


Zuletzt bearbeitet von Artchi am 19:14:29 16.03.2017, insgesamt 1-mal bearbeitet
retro-fan
Unregistrierter




Beitrag retro-fan Unregistrierter 20:12:30 16.03.2017   Titel:              Zitieren

hallo leute, erstmal danke für eure beiträge.

mummel: eine konverterung infix nach postfix und zurück ist ein standardproblem. dafür gibt es fertige algorithmen. so viel handarbeit ist dazu gar nicht nötig.

all: upn finde ich gar nicht so schlimm. es war nur am ersten tag gewöhnungsbedürftig aber wenn man verstanden hat wie ein stack funktioniert, dann ist upn doch okay. ich persönlich mag es sogar lieber als die übliche schreibweise.

ich beschäftige mich nur interessehalber mit forth und glaube, dass die sprache ein ungaubliches potential hat, wenn man sich gut damit auskennt. ich vermute, dass sich vieles damit eleganter lösen lässt als in c oder java.

dass forth kaum noch jemand kennt, liegt bestimmt einerseits am upn und andererseits an den vielen schlechten implementierungen aus hobbyprogrammierer-bastelküchen.
zufallswert
Unregistrierter




Beitrag zufallswert Unregistrierter 20:44:09 16.03.2017   Titel:   Re: Forth anyone?            Zitieren

muemmel schrieb:

retro-fan schrieb:
da das konzept einer erweiterbaren wortliste

Ist das nicht eigentlich jedes (ordentliche) Programm?
Nur woanders heißen sie halt Komponenten, proceduren oder funktionen...

das kann man nicht vergleichen, weil das Vokabular bei Forth zur Laufzeit erweitert werden kann.

muemmel schrieb:
Wenn Du schreibst:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Programm SchnickschnackRechnen
{
  Eingeben;
  Berechnen;
  Ausgeben;
}
 
und dann schreibst
 
Eingeben
{
  KursorPositionieren;
  EingabeaufforderungSchreiben;
  EngabeEntgegennehmen;
}
...


Dann ist das nichts anderes als die Bildung neuer Worte in Forth.

nein, das ist nur ein Spezialfall der Bildung neuer Wörter.

In Forth kann man während der Erzeugung eines neuen Worts zwischen Compiler- und Interpreter-Zustand umschalten; man kann z.B. während der Compilierung eine Zwischenrechnung durchführen und das Ergebnis in die Wortdefinition einkompilieren.
zufallswert
Unregistrierter




Beitrag zufallswert Unregistrierter 22:16:56 16.03.2017   Titel:   .            Zitieren

eine wichtige Anwendung von Stackmaschinen ist die als Ziel für Zwischencode oder auch Endcodes von Compilern. Man kann den Zielcode dann auf einer virtuellen Maschinen mit Stackorientiertem Befehlssatz laufen lassen oder die Codes vor dem Laufen in Maschinencodes für echte CPUs umsetzen.

Wenn man den beim Parsing aufgebauten abstrakten Syntaxbaum in DFS-Ordnung abgrast, entsteht der Code nämlich in genau der Reihenfolge, wie eine Stackmaschine ihn braucht.
HERE @ SWAP
Unregistrierter




Beitrag HERE @ SWAP Unregistrierter 23:40:12 20.03.2017   Titel:              Zitieren

Sehr empfehlenswert für alle die sich für Programmiersprachen
interessieren:

Teil 1: https://github.com/Alexan ....... /blob/master/jonesforth.S
Teil 2: https://github.com/Alexan ....... /blob/master/jonesforth.f

Ich kannte forth vorher nicht und werde vermutlich auch nie damit
programmieren aber ich bin froh das jetzt mit im Kopf haben.
Andromeda
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.12.2006
Beiträge: 2021
Beitrag Andromeda Mitglied 02:32:56 21.03.2017   Titel:              Zitieren

HERE @ SWAP schrieb:

Ich kannte forth vorher nicht und werde vermutlich auch nie damit
programmieren aber ich bin froh das jetzt mit im Kopf haben.


Exotische Sprachen sind immer interessant.
Hier ein Forth für die JVM, das ziemlich vollständig ist: https://github.com/nietoperz809/JForth

Vordefinierte Wörter:
Zitat:

> wordsd
Words:
Name: "!", Primitive: true, Immediate: false
Name: "'", Primitive: true, Immediate: true
Name: "(", Primitive: true, Immediate: true
Name: "*", Primitive: true, Immediate: false
Name: "+", Primitive: true, Immediate: false
Name: "+!", Primitive: true, Immediate: false
Name: "+loop", Primitive: true, Immediate: true
Name: "-", Primitive: true, Immediate: false
Name: ".", Primitive: true, Immediate: false
Name: "/", Primitive: true, Immediate: false
Name: "0<", Primitive: true, Immediate: false
Name: "0=", Primitive: true, Immediate: false
Name: "0>", Primitive: true, Immediate: false
Name: "1+", Primitive: true, Immediate: false
Name: "1-", Primitive: true, Immediate: false
Name: "2+", Primitive: true, Immediate: false
Name: "2-", Primitive: true, Immediate: false
Name: ":", Primitive: true, Immediate: false
Name: ";", Primitive: true, Immediate: true
Name: "<", Primitive: true, Immediate: false
Name: "<<", Primitive: true, Immediate: false
Name: "=", Primitive: true, Immediate: false
Name: ">", Primitive: true, Immediate: false
Name: ">>", Primitive: true, Immediate: false
Name: ">r", Primitive: true, Immediate: false
Name: "@", Primitive: true, Immediate: false
Name: "E", Primitive: true, Immediate: false
Name: "PI", Primitive: true, Immediate: false
Name: "abs", Primitive: true, Immediate: false
Name: "acos", Primitive: true, Immediate: false
Name: "and", Primitive: true, Immediate: false
Name: "array", Primitive: true, Immediate: false
Name: "asin", Primitive: true, Immediate: false
Name: "atan", Primitive: true, Immediate: false
Name: "atan2", Primitive: true, Immediate: false
Name: "begin", Primitive: true, Immediate: true
Name: "binary", Primitive: true, Immediate: false
Name: "bye", Primitive: true, Immediate: false
Name: "closeByteReader", Primitive: true, Immediate: false
Name: "closeReader", Primitive: true, Immediate: false
Name: "closeWriter", Primitive: true, Immediate: false
Name: "constant", Primitive: true, Immediate: false
Name: "cos", Primitive: true, Immediate: false
Name: "cosh", Primitive: true, Immediate: false
Name: "cr", Primitive: true, Immediate: false
Name: "decimal", Primitive: true, Immediate: false
Name: "depth", Primitive: true, Immediate: false
Name: "do", Primitive: true, Immediate: true
Name: "drop", Primitive: true, Immediate: false
Name: "dup", Primitive: true, Immediate: false
Name: "else", Primitive: true, Immediate: true
Name: "execute", Primitive: true, Immediate: false
Name: "exp", Primitive: true, Immediate: false
Name: "false", Primitive: true, Immediate: false
Name: "forget", Primitive: true, Immediate: true
Name: "gaussian", Primitive: true, Immediate: false
Name: "hex", Primitive: true, Immediate: false
Name: "i", Primitive: true, Immediate: false
Name: "if", Primitive: true, Immediate: true
Name: "j", Primitive: true, Immediate: false
Name: "leave", Primitive: true, Immediate: true
Name: "length", Primitive: true, Immediate: false
Name: "load", Primitive: true, Immediate: false
Name: "log", Primitive: true, Immediate: false
Name: "log10", Primitive: true, Immediate: false
Name: "loop", Primitive: true, Immediate: true
Name: "max", Primitive: true, Immediate: false
Name: "min", Primitive: true, Immediate: false
Name: "mod", Primitive: true, Immediate: false
Name: "not", Primitive: true, Immediate: false
Name: "openByteReader", Primitive: true, Immediate: false
Name: "openReader", Primitive: true, Immediate: false
Name: "openWriter", Primitive: true, Immediate: false
Name: "or", Primitive: true, Immediate: false
Name: "over", Primitive: true, Immediate: false
Name: "pick", Primitive: true, Immediate: false
Name: "pow", Primitive: true, Immediate: false
Name: "r>", Primitive: true, Immediate: false
Name: "r@", Primitive: true, Immediate: false
Name: "random", Primitive: true, Immediate: false
Name: "readByte", Primitive: true, Immediate: false
Name: "readLine", Primitive: true, Immediate: false
Name: "rot", Primitive: true, Immediate: false
Name: "round", Primitive: true, Immediate: false
Name: "setbase", Primitive: true, Immediate: false
Name: "sin", Primitive: true, Immediate: false
Name: "sinh", Primitive: true, Immediate: false
Name: "sp", Primitive: true, Immediate: false
Name: "spaces", Primitive: true, Immediate: false
Name: "sqrt", Primitive: true, Immediate: false
Name: "subString", Primitive: true, Immediate: false
Name: "swap", Primitive: true, Immediate: false
Name: "tan", Primitive: true, Immediate: false
Name: "tanh", Primitive: true, Immediate: false
Name: "then", Primitive: true, Immediate: true
Name: "toDouble", Primitive: true, Immediate: false
Name: "toLong", Primitive: true, Immediate: false
Name: "toString", Primitive: true, Immediate: false
Name: "true", Primitive: true, Immediate: false
Name: "until", Primitive: true, Immediate: true
Name: "variable", Primitive: true, Immediate: false
Name: "words", Primitive: true, Immediate: false
Name: "wordsd", Primitive: true, Immediate: false
Name: "writeByte", Primitive: true, Immediate: false
Name: "writeEol", Primitive: true, Immediate: false
Name: "writeString", Primitive: true, Immediate: false
Name: "xor", Primitive: true, Immediate: false

_________________
My Browser User Agent String is Mozilla/5.0 (X11; SunOS i86pc; rv:10.0.6) Gecko/20100101 Firefox/10.0.6


Zuletzt bearbeitet von Andromeda am 03:40:04 21.03.2017, insgesamt 1-mal bearbeitet
HERE @ SWAP
Unregistrierter




Beitrag HERE @ SWAP Unregistrierter 22:37:32 21.03.2017   Titel:              Zitieren

Andromeda schrieb:
HERE @ SWAP schrieb:

(... jonesforth tutorial ...)

Ich kannte forth vorher nicht und werde vermutlich auch nie damit
programmieren aber ich bin froh das jetzt mit im Kopf haben.


Exotische Sprachen sind immer interessant.
Hier ein Forth für die JVM, das ziemlich vollständig ist: https://github.com/nietoperz809/JForth


Ok, zum Lernen kann man sowas machen. Aber in echt will man ja nicht
aus seiner Java-Umgebung ausbrechen um dann in forth zu programmieren.

Das jonesforth-Tutorial zeigt ja gerade, wie sich forth auf einfache
Weise direkt in Maschinencode umsetzen lässt. Man hat also eine
Verbesserung erreicht (während Java -> Forth == Verschlechterung).
zufallswert
Unregistrierter




Beitrag zufallswert Unregistrierter 22:52:24 21.03.2017   Titel:   .            Zitieren

Übersehe ich da was oder wo sind [ und ] ?
C++ Forum :: Rund um die Programmierung ::  Forth anyone?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.