+ All Categories
Home > Documents > preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere...

preForthwiki.forth-ev.de/lib/exe/fetch.php/events:preforth...• hier i386-Assembler • weitere...

Date post: 22-Apr-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
28
preForth ein minimaler bootstrap-fähiger Forth-Kern Ulrich Hoffmann <[email protected]> 1 Samstag, 7. April 2018
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

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

Ü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

• 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

• 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

• 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

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

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

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

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


Recommended