preforthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-assembler • weitere...
TRANSCRIPT
![Page 1: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/1.jpg)
preForthein minimaler bootstrap-fähiger Forth-Kern
Ulrich Hoffmann <[email protected]>
1Samstag, 7. April 2018
![Page 2: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/2.jpg)
Überblick
• Einleitung• preForth• simpleForth• interaktives Forth• Fazit
Bootstrapping Forth
2Samstag, 7. April 2018
![Page 3: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/3.jpg)
• EuroForth 2016
Implementing the Forth Inner Interpreter in High Level Forth
• Forth 2017
Stack der Stacks Strings auf dem Stack
• EuroForth 2017
handler based outer interpreter
Forth ist words - stacks - blocksJeff Fox
3Samstag, 7. April 2018
![Page 4: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/4.jpg)
• Forth überall (so viel wie möglich)
• bootstrap-fähiges, sich selbst generierendes System
• vollständige Transparenz
• einfach zu verstehen
• auf der Suche nach der Einfachheit
• biologische Analogie
• Kann Forth aus weniger als Forth entstehen?
Forth ist words - stacks - blocksJeff Fox
4Samstag, 7. April 2018
![Page 5: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/5.jpg)
preForth• Kann Forth aus weniger als Forth entstehen?
• Was kann man weglassen?
• kein DOES>
• kein BASE
• kein STATE
• keine formatierte Zahlenausgabe <# # #>
• kein CATCH/THROW
5Samstag, 7. April 2018
![Page 6: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/6.jpg)
preForth• Kann Forth aus weniger als Forth entstehen?
• Was kann man sonst noch weglassen?
• keine immediate Worte, d.h.• keine Kontrollstrukuren IF ELSE THEN BEGIN
WHILE REPEAT UNTIL• keine definierenden Worte - außer : • kein Speicher @ ! CMOVE ALLOT ,• kein input stream• kein dictionary, kein EXECUTE oder EVALUATE• nicht interaktiv
6Samstag, 7. April 2018
![Page 7: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/7.jpg)
preForth• Was bleibt dann noch über?
• Stack
• Returnstack
• Nur ?exit und Rekursion als Kontrollstrukturen
• :-Definitionen
• optional Tail Call Optimierung
• Ein- und Ausgabe via KEY/EMIT
• dezimale positive und negative Zahlen (eine Zelle)
• Zeichen-Literale in 'x'-Notation
• dezimale Zahlenausgabe (eine Zelle)
7Samstag, 7. April 2018
![Page 8: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/8.jpg)
preForth-Programme
: countdown ( n -- ) cr dup . ?dup 0= ?exit 1- tail countdown ;
Wie sehen sie aus?
5 countdown
5 4 3 2 1 0
8Samstag, 7. April 2018
![Page 9: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/9.jpg)
preForth-Programme
: dashes ( n -- ) ?dup 0= ?exit '-' emit 1- tail dashes ;
Wie sehen sie aus?
5 dashes
-----
9Samstag, 7. April 2018
![Page 10: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/10.jpg)
preForth-Programme
\ show displays topmost string
: show ( S -- ) ?dup 0= ?exit swap >r 1- show r> emit ;
Wie sehen sie aus?
cn-1 cn-2 ... c2 c1 c0 n
10Samstag, 7. April 2018
![Page 11: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/11.jpg)
preForth-Programme
: ."Hello,_world!" ( -- ) 'H' 'e' 'l' 'l' 'o' ',' bl 'w' 'o' 'r' 'l' 'd' '!' 13 show ;
Wie sehen sie aus?
Hello world!
11Samstag, 7. April 2018
![Page 12: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/12.jpg)
preForth-Operationen für Stack-Strings
•_dup ( S -- S S )
•_swap ( S1 S2 -- S2 S1 )
•_drop ( S -- )
•_show ( S -- )
• Muster
• dup pick ( S -- c ) erstes Zeichen
• swap 1+ ( S1 c -- S2 ) Zeichen anfügen
12Samstag, 7. April 2018
![Page 13: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/13.jpg)
Pick und Roll ?!
: pick ( xn-1 ... x0 i -- xn-1 ... x0 xi ) over swap ?dup 0= ?exit nip swap >r 1- pick r> swap ;
: roll ( xn-1 ... x0 i -- xn-1 ... xi-1 xi+1 ... x0 xi ) ?dup 0= ?exit swap >r 1- roll r> swap ;
: ?dup ( x -- x x | 0 ) dup dup ?exit drop ;
13Samstag, 7. April 2018
![Page 14: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/14.jpg)
Primitives
• Forth überall (so viel wie möglich)
• eine Basis muss es geben:
• 13 Primitives:emit key dup swap drop 0< -?exit >r r> nest unnest lit
14Samstag, 7. April 2018
![Page 15: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/15.jpg)
Defintion von PrimitivesFormulierung in der Plattform Zielsprache (hier i386-Asm)
code ?exit ( f -- ) pop eax or eax, eax jz qexit1 mov esi, [ebp] lea ebp,[ebp+4]qexit1: next;
15Samstag, 7. April 2018
![Page 16: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/16.jpg)
Beschreibung von ZielcodeFormulierung in der Plattform Zielsprache (hier i386-Asm)
prefixformat ELF
...
macro next { lodsd jmp dword [eax]}...;
pre
prelude
prefix
preamble
preformatted
16Samstag, 7. April 2018
![Page 17: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/17.jpg)
preForth compiler• Akzeptiert preForth-Programm von stdin
• Schreibt Plattform-Programme nach stdout
• hier i386-Assembler
• weitere Backends sehr einfach (C, geplant x64, stm8, NIGE)
• Selbst in preForth formuliert
• Kann sich selbst reproduzieren
• Erster Bootstrap via gForth oder SwiftForth
• Maschinencode wird über Plattform-Assembler erzeugt
17Samstag, 7. April 2018
![Page 18: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/18.jpg)
preForth compiler• Outer interpreter und compiler basieren auf Handlern
• Handler
• Handler werden in :-Definitionen kombiniert.
( S -- i*x 0 | S )
\ ?'x' detects and compiles a character literal: ?'x' ( S -- 0 | S ) dup 0= ?exit dup 3 - ?exit over ''' - ?exit 3 pick ''' - ?exit 2 pick >r _drop r> ,lit 0 ;
18Samstag, 7. April 2018
![Page 19: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/19.jpg)
preForth compiler• Handler werden in :-Definitionen kombiniert.
• Compiler loop:
: ] ( -- ) token \ get next token \ run compilers ?; ?dup 0= ?exit \ ; leave compiler loop ?\ \ comment ?tail \ marked as tail call ?'x' \ character literal ?lit \ number ?word \ word _drop tail ] ; \ ignore unhandled token and cycle
19Samstag, 7. April 2018
![Page 20: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/20.jpg)
generierter Plattform-Code
; ?exit_Qexit: DD _QexitX_QexitX: pop eax or eax, eax jz qexit1 mov esi, [ebp] lea ebp,[ebp+4]qexit1: next
; ?dup_Qdup: DD _nest_QdupX:
DD _dupDD _dupDD _QexitDD _dropDD _unnest
?exit ?dup
20Samstag, 7. April 2018
![Page 21: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/21.jpg)
Bootstrapping preForth
demo
21Samstag, 7. April 2018
![Page 22: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/22.jpg)
simpleForth
• preForth ist turing-vollständig.
Ein volles Forth in preForth zu formulieren ist möglich... ... aber es ist relativ mühsam.
• preForth erweitern: simpleForth
22Samstag, 7. April 2018
![Page 23: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/23.jpg)
simpleForth• simpleForth ist wie preForth• preForth ⊂ simpleForth
• zusätzlich:• Kontrollstrukturen: IF ELSE THEN BEGIN
WHILE REPEAT UNTIL• Definitionen mit und ohne Header im
generierten Code• Speicher: @ ! c@ c! allot c, , • variable constant• ['] execute• immediate Definitionen
23Samstag, 7. April 2018
![Page 24: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/24.jpg)
• volles Forth ("Forth") in simpleForth
• Work-in-Progress• mit neuen Forth-Techniken experimentieren
• Handler basierter Text-Interpretierer• NDCS• Speicherverwaltung• ...
• Derzeit klassisches ITC-System als proof of concept
Bootstrapping Forth
24Samstag, 7. April 2018
![Page 25: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/25.jpg)
Forth• Beispiel:
: sqr ( x -- x² ) dup * ;
: sqrt ( x² -- x ) 1 BEGIN 2dup / over - 2 / dup WHILE + REPEAT drop nip ;
: pyt ( a b -- c ) sqr swap sqr + sqrt ;
25Samstag, 7. April 2018
![Page 26: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/26.jpg)
Bootstrapping Forth
demo
26Samstag, 7. April 2018
![Page 27: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/27.jpg)
aktuelle Beobachtung
• "doppelte" Beschreibung1. für entstehendes Forth-Image2. für interaktives System• Kontrollstrukturen• Header
27Samstag, 7. April 2018
![Page 28: preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere Backends sehr einfach (C, geplant x64, stm8, NIGE) • Selbst in preForth formuliert](https://reader033.vdocument.in/reader033/viewer/2022042202/5ea3437f8ddba221f77f9c70/html5/thumbnails/28.jpg)
Fazit- Forth überall (so viel wie möglich)
computational clay
- bootstrap-fähiges, sich selbst generierendes System- vollständige Transparenz- einfach zu verstehen
- Kann Forth aus weniger als Forth entstehen? Ja - mit preForth ☺
Forth ist words - stacks - blocksJeff Fox
✔ ✔
28Samstag, 7. April 2018