The new Gforth Header Bernd Paysan, net2o M. Anton Ertl, TU Wien - - PowerPoint PPT Presentation

the new gforth header
SMART_READER_LITE
LIVE PREVIEW

The new Gforth Header Bernd Paysan, net2o M. Anton Ertl, TU Wien - - PowerPoint PPT Presentation

The new Gforth Header Bernd Paysan, net2o M. Anton Ertl, TU Wien Traditional Header New Requirements Complete Name Long Name alias compile-only machine-independence Old Gforth Header Complete Name Long Name alias compile-only


slide-1
SLIDE 1

The new Gforth Header

Bernd Paysan, net2o

  • M. Anton Ertl, TU Wien
slide-2
SLIDE 2

Traditional Header

slide-3
SLIDE 3

New Requirements

Complete Name Long Name alias compile-only machine-independence

slide-4
SLIDE 4

Old Gforth Header

link count name code field does-code parameter field nt xt body Complete Name Long Name alias compile-only machine-independence i

many ifs

slide-5
SLIDE 5

More Requirements

intelligent compile, dual-semantics words synonym to for value variations defer variations reduce ifs (mostly) unify nt and xt

slide-6
SLIDE 6

New Header

intelligent compile, dual-semantics words synonym to for value variations defer variations reduce ifs (mostly) unify nt and xt

name count link vt code field parameter field mcompile-only xt=nt body padding compile, (to) defer@ does/extra name>interpret name>compile name>string name>link

slide-7
SLIDE 7

Setters

name count link vt code field parameter field xt=nt body padding compile, (to) defer@ does/extra name>interpret name>compile name>string name>link

setter stack effect sets set-execute ( addr -- ) code field compile, set-does> ( xt -- ) code field does> does compile, set-optimizer ( xt -- ) compile,

  • pt:

set->int ( xt -- ) name>interpret set->comp ( xt -- ) name>compile compsem: immediate set-to ( xt -- ) (to)/defer! set-defer@ ( xt -- ) defer@ set->string ( xt -- ) name>string set->link ( xt -- ) name>link

slide-8
SLIDE 8

Example: Immediate

: imm>comp ( nt -- xt1 xt2 ) name>int [’] execute ; : immediate ( -- ) [’] imm>comp set->comp ; : default-name>comp ( nt -- xt1 xt2 ) name>int [’] compile, ; defer name>x : [ [’] name>interpret is name>x false state ! ; : ] [’] name>compile is name>x true state ! ; \ in text interpreter: ( c-addr u ) 2dup find-name dup if nip nip name>x execute else ( ... number handling ... ) then

slide-9
SLIDE 9

Example: Constant

: constant ( x "name" -- ) create , [’] @ set-does> [: >body @ ]] literal [[ ;] set-optimizer ;

slide-10
SLIDE 10

Example: Fvalue

: fvalue-to ( r xt-fvalue -- ) >body f! ;

  • pt: drop ]] >body f! [[ ;

: fvalue ( r "name" -- ) \ float-ext fconstant [: >body ]] Literal f@ [[ ;] set-optimizer [’] fvalue-to set-to ;

slide-11
SLIDE 11

Example: Defer

: value-to ( x xt -- ) >body ! ;

  • pt: ( xt -- ) \ run-time: ( x -- )

drop ]] >body ! [[ ; : defer-defer@ ( xt1 -- xt2 ) >body @ ;

  • pt: ( xt -- )

drop ]] >body @ [[ ; : perform @ execute ; : defer ( "name" -- ) create [’] abort , [’] perform set-does> [: >body ]] literal perform [[ ;] set-optimizer [’] value-to set-to [’] defer-defer@ set-defer@ ;

slide-12
SLIDE 12

Example: Dual-semantics: To

: to-int ( v "name" -- ) parse-name find-name dup 0= -13 and throw (to) ; : to-comp ( compilation: "name" -- ) ( run-time: v -- ) parse-name find-name dup 0= -13 and throw ]] literal (to) [[ ; immediate : to-name>comp ( nt -- xt1 xt2 ) drop [’] to-comp [’] execute ; : to to-int ; ’ to-name>comp set->comp

slide-13
SLIDE 13

Example: Interpret/compile:

: i/c>comp ( nt -- xt1 xt2 ) >body cell+ @ [’] execute ; : interpret/compile: ( int-xt comp-xt "name" --) defer , latestxt defer! [: >body @ ;] set->int [’] i/c>comp set->comp [’] no-to set-to [’] no-defer@ set-defer@ ; ’ to-int ’ to-comp interpret/compile: to

body to header int-xt comp-xt

slide-14
SLIDE 14

Example: Synonym

: s-to ( val nt -- ) >body @ (to) ;

  • pt: ( xt -- )

?fold-to >body @ ]] literal (to) [[ ; : s-defer@ ( xt1 -- xt2 ) >body @ defer@ ;

  • pt: ( xt -- )

?fold-to >body @ ]] literal defer@ [[ ; : synonym ( "name" "oldname" -- ) defer parse-name find-name dup 0= -13 and throw dup lastxt defer! compile-only? if compile-only then [: >body @ compile, ;] set-optimizer [: >body @ name>interpret ;] set->int [: >body @ name>compile ;] set->comp [’] s-to set-to [’] s-defer@ set-defer@ ;

slide-15
SLIDE 15

Example: data structures

5e fvalue x synonym y x : foo to y ; ⇓ : foo [ ’ x >body ] literal f! ;

x ... vt dodoes 5e ... (to) ... does ... f@ fvalue-to ... vt docol >body f! ;s compile, ... vt docol drop ]] >body f! [[ ; y ... vt dodoes x ... (to) ... does ... perform s-to ... vt docol >body @ (to) ;s compile, ... vt docol ?fold-to >body @ ]] literal (to) [[ ; to-comp ... vt docol ... ]] literal (to) [[ ; to ... vt dodoes to-int ... name>compile ... to-name>comp ... vt docol drop [’] to-comp [’] execute ;

slide-16
SLIDE 16

Deduplication

five 4 link vt dodoes 5 constant, no-to no-defer@ @ noop default-name>comp named>string named>link 5 constant five 6 constant six six 3 link vt dodoes 6

117 vts in Gforth (4000 words)

slide-17
SLIDE 17

Create from a prototype

create constant-prototype [’] @ set-does> [: >body @ ]] literal [[ ;] set-optimizer : constant ( x "name" -- ) [’] constant-prototype create-from , reveal ;

slide-18
SLIDE 18

NT=XT?

  • For most words: nt = xt
  • Exceptions:

synonym alias interpret/compile:

  • Plausible results for the exceptions
slide-19
SLIDE 19

Out-of-band data

  • Hash table
  • locate data
slide-20
SLIDE 20

Why name>comp and compile,?

  • compilation semantics: name>compile
  • code generation, optimization: compile,

equivalent to : compile, ]] literal execute [[ ; Equivalence is widely used

slide-21
SLIDE 21

Conclusion

  • New requirements ⇒ header redesign
  • Prototype-based object-oriented approach
  • Method dispatch

replaces if-cascades better extensibility

  • Supports
  • ptimization, dual-semantics, synonym, to, defer variations
  • Deduplication and create-from
  • nt=xt, with exceptions