Diff for /gforth/Attic/gforth.ds between versions 1.29 and 1.36

version 1.29, 1996/01/07 17:22:09 version 1.36, 1996/09/23 08:52:47
Line 7 Line 7
 @comment %**end of header (This is for running Texinfo on a region.)  @comment %**end of header (This is for running Texinfo on a region.)
   
 @ifinfo  @ifinfo
 This file documents Gforth 0.1  This file documents Gforth 0.2
   
 Copyright @copyright{} 1995 Free Software Foundation, Inc.  Copyright @copyright{} 1995,1996 Free Software Foundation, Inc.
   
      Permission is granted to make and distribute verbatim copies of       Permission is granted to make and distribute verbatim copies of
      this manual provided the copyright notice and this permission notice       this manual provided the copyright notice and this permission notice
Line 41  Copyright @copyright{} 1995 Free Softwar Line 41  Copyright @copyright{} 1995 Free Softwar
 @sp 10  @sp 10
 @center @titlefont{Gforth Manual}  @center @titlefont{Gforth Manual}
 @sp 2  @sp 2
 @center for version 0.1  @center for version 0.2
 @sp 2  @sp 2
 @center Anton Ertl  @center Anton Ertl
 @center Bernd Paysan  @center Bernd Paysan
Line 51  Copyright @copyright{} 1995 Free Softwar Line 51  Copyright @copyright{} 1995 Free Softwar
 @comment  The following two commands start the copyright page.  @comment  The following two commands start the copyright page.
 @page  @page
 @vskip 0pt plus 1filll  @vskip 0pt plus 1filll
 Copyright @copyright{} 1995 Free Software Foundation, Inc.  Copyright @copyright{} 1995,1996 Free Software Foundation, Inc.
   
 @comment !! Published by ... or You can get a copy of this manual ...  @comment !! Published by ... or You can get a copy of this manual ...
   
Line 77  Copyright @copyright{} 1995 Free Softwar Line 77  Copyright @copyright{} 1995 Free Softwar
 @node Top, License, (dir), (dir)  @node Top, License, (dir), (dir)
 @ifinfo  @ifinfo
 Gforth is a free implementation of ANS Forth available on many  Gforth is a free implementation of ANS Forth available on many
 personal machines. This manual corresponds to version 0.1.  personal machines. This manual corresponds to version 0.2.
 @end ifinfo  @end ifinfo
   
 @menu  @menu
Line 88  personal machines. This manual correspon Line 88  personal machines. This manual correspon
 * Words::                       Forth words available in Gforth  * Words::                       Forth words available in Gforth
 * ANS conformance::             Implementation-defined options etc.  * ANS conformance::             Implementation-defined options etc.
 * Model::                       The abstract machine of Gforth  * Model::                       The abstract machine of Gforth
   * Integrating Gforth::          Forth as scripting language for applications.
 * Emacs and Gforth::            The Gforth Mode  * Emacs and Gforth::            The Gforth Mode
 * Internals::                   Implementation details  * Internals::                   Implementation details
 * Bugs::                        How to report them  * Bugs::                        How to report them
Line 754  double sized signed integer Line 755  double sized signed integer
 @item ud  @item ud
 double sized unsigned integer  double sized unsigned integer
 @item r  @item r
 Float  Float (on the FP stack)
 @item a_  @item a_
 Cell-aligned address  Cell-aligned address
 @item c_  @item c_
 Char-aligned address (note that a Char is two bytes in Windows NT)  Char-aligned address (note that a Char may have two bytes in Windows NT)
 @item f_  @item f_
 Float-aligned address  Float-aligned address
 @item df_  @item df_
Line 771  Execution token, same size as Cell Line 772  Execution token, same size as Cell
 Wordlist ID, same size as Cell  Wordlist ID, same size as Cell
 @item f83name  @item f83name
 Pointer to a name structure  Pointer to a name structure
   @item "
   string in the input stream (not the stack). The terminating character is
   a blank by default. If it is not a blank, it is shown in @code{<>}
   quotes.
   
 @end table  @end table
   
 @node Arithmetic, Stack Manipulation, Notation, Words  @node Arithmetic, Stack Manipulation, Notation, Words
Line 848  The format of floating point numbers rec Line 854  The format of floating point numbers rec
 interpreter is: a signed decimal number, possibly containing a decimal  interpreter is: a signed decimal number, possibly containing a decimal
 point (@code{.}), followed by @code{E} or @code{e}, optionally followed  point (@code{.}), followed by @code{E} or @code{e}, optionally followed
 by a signed integer (the exponent). E.g., @code{1e} ist the same as  by a signed integer (the exponent). E.g., @code{1e} ist the same as
 @code{+1.0e+1}. Note that a number without @code{e}  @code{+1.0e+0}. Note that a number without @code{e}
 is not interpreted as floating-point number, but as double (if the  is not interpreted as floating-point number, but as double (if the
 number contains a @code{.}) or single precision integer. Also,  number contains a @code{.}) or single precision integer. Also,
 conversions between string and floating point numbers always use base  conversions between string and floating point numbers always use base
Line 1141  system that only supplies @code{THEN} is Line 1147  system that only supplies @code{THEN} is
 Forth's @code{THEN} has the meaning 2b, whereas @code{THEN} in Pascal  Forth's @code{THEN} has the meaning 2b, whereas @code{THEN} in Pascal
 and many other programming languages has the meaning 3d.]  and many other programming languages has the meaning 3d.]
   
 We also provide the words @code{?dup-if} and @code{?dup-0=-if}, so you  Gforth also provides the words @code{?dup-if} and @code{?dup-0=-if}, so
 can avoid using @code{?dup}.  you can avoid using @code{?dup}. Using these alternatives is also more
   efficient than using @code{?dup}. Definitions in plain standard Forth
   for @code{ENDIF}, @code{?DUP-IF} and @code{?DUP-0=-IF} are provided in
   @file{compat/control.fs}.
   
 @example  @example
 @var{n}  @var{n}
Line 1234  arithmetic). This behaviour is usually n Line 1243  arithmetic). This behaviour is usually n
 Gforth offers @code{+DO} and @code{U+DO} (as replacements for  Gforth offers @code{+DO} and @code{U+DO} (as replacements for
 @code{?DO}), which do not enter the loop if @var{start} is greater than  @code{?DO}), which do not enter the loop if @var{start} is greater than
 @var{limit}; @code{+DO} is for signed loop parameters, @code{U+DO} for  @var{limit}; @code{+DO} is for signed loop parameters, @code{U+DO} for
 unsigned loop parameters. These words can be implemented easily on  unsigned loop parameters.
 standard systems, so using them does not make your programs hard to  
 port; e.g.:  
 @example  
 : +DO ( compile-time: -- do-sys; run-time: n1 n2 -- )  
     POSTPONE over POSTPONE min POSTPONE ?DO ; immediate  
 @end example  
   
 @code{LOOP} can be replaced with @code{@var{n} +LOOP}; this updates the  @code{LOOP} can be replaced with @code{@var{n} +LOOP}; this updates the
 index by @var{n} instead of by 1. The loop is terminated when the border  index by @var{n} instead of by 1. The loop is terminated when the border
Line 1268  between @var{limit+1} and @var{limit} is Line 1271  between @var{limit+1} and @var{limit} is
   
 @code{ 0 0 -DO  i .  1 -LOOP}  prints nothing  @code{ 0 0 -DO  i .  1 -LOOP}  prints nothing
   
 Another alternative is @code{@var{n} S+LOOP}, where the negative  Unfortunately, @code{+DO}, @code{U+DO}, @code{-DO}, @code{U-DO} and
 case behaves symmetrical to the positive case:  @code{-LOOP} are not in the ANS Forth standard. However, an
   implementation for these words that uses only standard words is provided
 @code{-2 0 -DO  i .  -1 S+LOOP}  prints @code{0 -1}  in @file{compat/loops.fs}.
   
 The loop is terminated when the border between @var{limit@minus{}sgn(n)}  
 and @var{limit} is crossed. Unfortunately, neither @code{-LOOP} nor  
 @code{S+LOOP} are part of the ANS Forth standard, and they are not easy  
 to implement using standard words. If you want to write standard  
 programs, just avoid counting down.  
   
 @code{?DO} can also be replaced by @code{DO}. @code{DO} always enters  @code{?DO} can also be replaced by @code{DO}. @code{DO} always enters
 the loop, independent of the loop parameters. Do not use @code{DO}, even  the loop, independent of the loop parameters. Do not use @code{DO}, even
Line 1300  This is the preferred loop of native cod Line 1297  This is the preferred loop of native cod
 lazy to optimize @code{?DO} loops properly. In Gforth, this loop  lazy to optimize @code{?DO} loops properly. In Gforth, this loop
 iterates @var{n+1} times; @code{i} produces values starting with @var{n}  iterates @var{n+1} times; @code{i} produces values starting with @var{n}
 and ending with 0. Other Forth systems may behave differently, even if  and ending with 0. Other Forth systems may behave differently, even if
 they support @code{FOR} loops.  they support @code{FOR} loops. To avoid problems, don't use @code{FOR}
   loops.
   
 @node Arbitrary control structures, Calls and returns, Counted Loops, Control Structures  @node Arbitrary control structures, Calls and returns, Counted Loops, Control Structures
 @subsection Arbitrary control structures  @subsection Arbitrary control structures
Line 1336  doc-else Line 1334  doc-else
 doc-while  doc-while
 doc-repeat  doc-repeat
   
   Gforth adds some more control-structure words:
   
   doc-endif
   doc-?dup-if
   doc-?dup-0=-if
   
 Counted loop words constitute a separate group of words:  Counted loop words constitute a separate group of words:
   
 doc-?do  doc-?do
Line 1346  doc-u-do Line 1350  doc-u-do
 doc-do  doc-do
 doc-for  doc-for
 doc-loop  doc-loop
 doc-s+loop  
 doc-+loop  doc-+loop
 doc--loop  doc--loop
 doc-next  doc-next
Line 1411  while Line 1414  while
 repeat  repeat
 @end example  @end example
   
 That's much easier to read, isn't it? Of course, @code{BEGIN} and  That's much easier to read, isn't it? Of course, @code{REPEAT} and
 @code{WHILE} are predefined, so in this example it would not be  @code{WHILE} are predefined, so in this example it would not be
 necessary to define them.  necessary to define them.
   
Line 1736  E.g., a definition using @code{TO} might Line 1739  E.g., a definition using @code{TO} might
 : strcmp @{ addr1 u1 addr2 u2 -- n @}  : strcmp @{ addr1 u1 addr2 u2 -- n @}
  u1 u2 min 0   u1 u2 min 0
  ?do   ?do
    addr1 c@ addr2 c@ - ?dup     addr1 c@@ addr2 c@@ -
    if     ?dup-if
      unloop exit       unloop exit
    then     then
    addr1 char+ TO addr1     addr1 char+ TO addr1
Line 1759  are initialized with the right value for Line 1762  are initialized with the right value for
  addr1 addr2   addr1 addr2
  u1 u2 min 0    u1 u2 min 0 
  ?do @{ s1 s2 @}   ?do @{ s1 s2 @}
    s1 c@ s2 c@ - ?dup      s1 c@@ s2 c@@ -
    if     ?dup-if
      unloop exit       unloop exit
    then     then
    s1 char+ s2 char+     s1 char+ s2 char+
Line 1933  stack easier. Line 1936  stack easier.
 The whole definition must be in one line.  The whole definition must be in one line.
 @end itemize  @end itemize
   
 Locals defined in this way behave like @code{VALUE}s  Locals defined in this way behave like @code{VALUE}s (@xref{Simple
 (@xref{Values}). I.e., they are initialized from the stack. Using their  Defining Words}). I.e., they are initialized from the stack. Using their
 name produces their value. Their value can be changed using @code{TO}.  name produces their value. Their value can be changed using @code{TO}.
   
 Since this syntax is supported by Gforth directly, you need not do  Since this syntax is supported by Gforth directly, you need not do
 anything to use it. If you want to port a program using this syntax to  anything to use it. If you want to port a program using this syntax to
 another ANS Forth system, use @file{anslocal.fs} to implement the syntax  another ANS Forth system, use @file{compat/anslocal.fs} to implement the
 on the other system.  syntax on the other system.
   
 Note that a syntax shown in the standard, section A.13 looks  Note that a syntax shown in the standard, section A.13 looks
 similar, but is quite different in having the order of locals  similar, but is quite different in having the order of locals
Line 1963  locals wordset. Line 1966  locals wordset.
 @section Defining Words  @section Defining Words
   
 @menu  @menu
 * Values::                        * Simple Defining Words::       
   * Colon Definitions::           
   * User-defined Defining Words::  
   * Supplying names::             
   * Interpretation and Compilation Semantics::  
 @end menu  @end menu
   
 @node Values,  , Defining Words, Defining Words  @node Simple Defining Words, Colon Definitions, Defining Words, Defining Words
 @subsection Values  @subsection Simple Defining Words
   
   doc-constant
   doc-2constant
   doc-fconstant
   doc-variable
   doc-2variable
   doc-fvariable
   doc-create
   doc-user
   doc-value
   doc-to
   doc-defer
   doc-is
   
   @node Colon Definitions, User-defined Defining Words, Simple Defining Words, Defining Words
   @subsection Colon Definitions
   
   @example
   : name ( ... -- ... )
       word1 word2 word3 ;
   @end example
   
   creates a word called @code{name}, that, upon execution, executes
   @code{word1 word2 word3}. @code{name} is a @dfn{(colon) definition}.
   
   The explanation above is somewhat superficial. @xref{Interpretation and
   Compilation Semantics} for an in-depth discussion of some of the issues
   involved.
   
   doc-:
   doc-;
   
   @node User-defined Defining Words, Supplying names, Colon Definitions, Defining Words
   @subsection User-defined Defining Words
   
   You can create new defining words simply by wrapping defining-time code
   around existing defining words and putting the sequence in a colon
   definition.
   
   If you want the words defined with your defining words to behave
   differently from words defined with standard defining words, you can
   write your defining word like this:
   
   @example
   : def-word ( "name" -- )
       Create @var{code1}
   DOES> ( ... -- ... )
       @var{code2} ;
   
   def-word name
   @end example
   
   Technically, this fragment defines a defining word @code{def-word}, and
   a word @code{name}; when you execute @code{name}, the address of the
   body of @code{name} is put on the data stack and @var{code2} is executed
   (the address of the body of @code{name} is the address @code{HERE}
   returns immediately after the @code{CREATE}).
   
   In other words, if you make the following definitions:
   
   @example
   : def-word1 ( "name" -- )
       Create @var{code1} ;
   
   : action1 ( ... -- ... )
       @var{code2} ;
   
   def-word name1
   @end example
   
   Using @code{name1 action1} is equivalent to using @code{name}.
   
   E.g., you can implement @code{Constant} in this way:
   
   @example
   : constant ( w "name" -- )
       create ,
   DOES> ( -- w )
       @@ ;
   @end example
   
   When you create a constant with @code{5 constant five}, first a new word
   @code{five} is created, then the value 5 is laid down in the body of
   @code{five} with @code{,}. When @code{five} is invoked, the address of
   the body is put on the stack, and @code{@@} retrieves the value 5.
   
   In the example above the stack comment after the @code{DOES>} specifies
   the stack effect of the defined words, not the stack effect of the
   following code (the following code expects the address of the body on
   the top of stack, which is not reflected in the stack comment). This is
   the convention that I use and recommend (it clashes a bit with using
   locals declarations for stack effect specification, though).
   
   @subsubsection Applications of @code{CREATE..DOES>}
   
   You may wonder how to use this feature. Here are some usage patterns:
   
   When you see a sequence of code occurring several times, and you can
   identify a meaning, you will factor it out as a colon definition. When
   you see similar colon definitions, you can factor them using
   @code{CREATE..DOES>}. E.g., an assembler usually defines several words
   that look very similar:
   @example
   : ori, ( reg-taget reg-source n -- )
       0 asm-reg-reg-imm ;
   : andi, ( reg-taget reg-source n -- )
       1 asm-reg-reg-imm ;
   @end example
   
   This could be factored with:
   @example
   : reg-reg-imm ( op-code -- )
       create ,
   DOES> ( reg-taget reg-source n -- )
       @@ asm-reg-reg-imm ;
   
   0 reg-reg-imm ori,
   1 reg-reg-imm andi,
   @end example
   
   Another view of @code{CREATE..DOES>} is to consider it as a crude way to
   supply a part of the parameters for a word (known as @dfn{currying} in
   the functional language community). E.g., @code{+} needs two
   parameters. Creating versions of @code{+} with one parameter fixed can
   be done like this:
   @example
   : curry+ ( n1 -- )
       create ,
   DOES> ( n2 -- n1+n2 )
       @@ + ;
   
    3 curry+ 3+
   -2 curry+ 2-
   @end example
   
   @subsubsection The gory details of @code{CREATE..DOES>}
   
   doc-does>
   
   This means that you need not use @code{CREATE} and @code{DOES>} in the
   same definition; E.g., you can put the @code{DOES>}-part in a separate
   definition. This allows us to, e.g., select among different DOES>-parts:
   @example
   : does1 
   DOES> ( ... -- ... )
       ... ;
   
   : does2
   DOES> ( ... -- ... )
       ... ;
   
   : def-word ( ... -- ... )
       create ...
       IF
          does1
       ELSE
          does2
       ENDIF ;
   @end example
   
   In a standard program you can apply a @code{DOES>}-part only if the last
   word was defined with @code{CREATE}. In Gforth, the @code{DOES>}-part
   will override the behaviour of the last word defined in any case. In a
   standard program, you can use @code{DOES>} only in a colon
   definition. In Gforth, you can also use it in interpretation state, in a
   kind of one-shot mode:
   @example
   CREATE name ( ... -- ... )
     @var{initialization}
   DOES>
     @var{code} ;
   @end example
   This is equivalwent to the standard
   @example
   :noname
   DOES>
       @var{code} ;
   CREATE name EXECUTE ( ... -- ... )
       @var{initialization}
   @end example
   
   You can get the address of the body of a word with
   
   doc->body
   
   @node Supplying names, Interpretation and Compilation Semantics, User-defined Defining Words, Defining Words
   @subsection Supplying names for the defined words
   
   By default, defining words take the names for the defined words from the
   input stream. Sometimes you want to supply the name from a string. You
   can do this with
   
   doc-nextname
   
   E.g.,
   
   @example
   s" foo" nextname create
   @end example
   is equivalent to
   @example
   create foo
   @end example
   
   Sometimes you want to define a word without a name. You can do this with
   
   doc-noname
   
   To make any use of the newly defined word, you need its execution
   token. You can get it with
   
   doc-lastxt
   
   E.g., you can initialize a deferred word with an anonymous colon
   definition:
   @example
   Defer deferred
   noname : ( ... -- ... )
     ... ;
   lastxt IS deferred
   @end example
   
   @code{lastxt} also works when the last word was not defined as
   @code{noname}. 
   
   The standard has also recognized the need for anonymous words and
   provides
   
   doc-:noname
   
   This leaves the execution token for the word on the stack after the
   closing @code{;}. You can rewrite the last example with @code{:noname}:
   @example
   Defer deferred
   :noname ( ... -- ... )
     ... ;
   IS deferred
   @end example
   
   @node Interpretation and Compilation Semantics,  , Supplying names, Defining Words
   @subsection Interpretation and Compilation Semantics
   
   The @dfn{interpretation semantics} of a word are what the text
   interpreter does when it encounters the word in interpret state. It also
   appears in some other contexts, e.g., the execution token returned by
   @code{' @var{word}} identifies the interpretation semantics of
   @var{word} (in other words, @code{' @var{word} execute} is equivalent to
   interpret-state text interpretation of @code{@var{word}}).
   
   The @dfn{compilation semantics} of a word are what the text interpreter
   does when it encounters the word in compile state. It also appears in
   other contexts, e.g, @code{POSTPONE @var{word}} compiles@footnote{In
   standard terminology, ``appends to the current definition''.} the
   compilation semantics of @var{word}.
   
   The standard also talks about @dfn{execution semantics}. They are used
   only for defining the interpretation and compilation semantics of many
   words. By default, the interpretation semantics of a word are to
   @code{execute} its execution semantics, and the compilation semantics of
   a word are to @code{compile,} its execution semantics.@footnote{In
   standard terminology: The default interpretation semantics are its
   execution semantics; the default compilation semantics are to append its
   execution semantics to the execution semantics of the current
   definition.}
   
   You can change the compilation semantics into @code{execute}ing the
   execution semantics with
   
   doc-immediate
   
   You can remove the interpretation semantics of a word with
   
   doc-compile-only
   doc-restrict
   
   Note that ticking (@code{'}) compile-only words gives an error
   (``Interpreting a compile-only word'').
   
   Gforth also allows you to define words with arbitrary combinations of
   interpretation and compilation semantics.
   
   doc-interpret/compile:
   
   This feature was introduced for implementing @code{TO} and @code{S"}. I
   recommend that you do not define such words, as cute as they may be:
   they make it hard to get at both parts of the word in some contexts.
   E.g., assume you want to get an execution token for the compilation
   part. Instead, define two words, one that embodies the interpretation
   part, and one that embodies the compilation part.
   
   There is, however, a potentially useful application of this feature:
   Providing differing implementations for the default semantics. While
   this introduces redundancy and is therefore usually a bad idea, a
   performance improvement may be worth the trouble. E.g., consider the
   word @code{foobar}:
   
   @example
   : foobar
       foo bar ;
   @end example
   
   Let us assume that @code{foobar} is called so frequently that the
   calling overhead would take a significant amount of the run-time. We can
   optimize it with @code{interpret/compile:}:
   
   @example
   :noname
      foo bar ;
   :noname
      POSTPONE foo POSTPONE bar ;
   interpret/compile: foobar
   @end example
   
   This definition has the same interpretation semantics and essentially
   the same compilation semantics as the simple definition of
   @code{foobar}, but the implementation of the compilation semantics is
   more efficient with respect to run-time.
   
   Some people try to use state-smart words to emulate the feature provided
   by @code{interpret/compile:} (words are state-smart if they check
   @code{STATE} during execution). E.g., they would try to code
   @code{foobar} like this:
   
   @example
   : foobar
     STATE @@
     IF ( compilation state )
       POSTPONE foo POSTPONE bar
     ELSE
       foo bar
     ENDIF ; immediate
   @end example
   
   While this works if @code{foobar} is processed only by the text
   interpreter, it does not work in other contexts (like @code{'} or
   @code{POSTPONE}). E.g., @code{' foobar} will produce an execution token
   for a state-smart word, not for the interpretation semantics of the
   original @code{foobar}; when you execute this execution token (directly
   with @code{EXECUTE} or indirectly through @code{COMPILE,}) in compile
   state, the result will not be what you expected (i.e., it will not
   perform @code{foo bar}). State-smart words are a bad idea. Simply don't
   write them!
   
   It is also possible to write defining words that define words with
   arbitrary combinations of interpretation and compilation semantics (or,
   preferably, arbitrary combinations of implementations of the default
   semantics). In general, this looks like:
   
   @example
   : def-word
       create-interpret/compile
       @var{code1}
   interpretation>
       @var{code2}
   <interpretation
   compilation>
       @var{code3}
   <compilation ;
   @end example
   
   For a @var{word} defined with @code{def-word}, the interpretation
   semantics are to push the address of the body of @var{word} and perform
   @var{code2}, and the compilation semantics are to push the address of
   the body of @var{word} and perform @var{code3}. E.g., @code{constant}
   can also be defined like this:
   
   @example
   : constant ( n "name" -- )
       create-interpret/compile
       ,
   interpretation> ( -- n )
       @@
   <interpretation
   compilation> ( compilation. -- ; run-time. -- n )
       @@ postpone literal
   <compilation ;
   @end example
   
   doc-create-interpret/compile
   doc-interpretation>
   doc-<interpretation
   doc-compilation>
   doc-<compilation
   
   Note that words defined with @code{interpret/compile:} and
   @code{create-interpret/compile} have an extended header structure that
   differs from other words; however, unless you try to access them with
   plain address arithmetic, you should not notice this. Words for
   accessing the header structure usually know how to deal with this; e.g.,
   @code{' word >body} also gives you the body of a word created with
   @code{create-interpret/compile}.
   
 @node Wordlists, Files, Defining Words, Words  @node Wordlists, Files, Defining Words, Words
 @section Wordlists  @section Wordlists
Line 2143  and use that in your assembly code. Line 2541  and use that in your assembly code.
   
 Another option for implementing normal and defining words efficiently  Another option for implementing normal and defining words efficiently
 is: adding the wanted functionality to the source of Gforth. For normal  is: adding the wanted functionality to the source of Gforth. For normal
 words you just have to edit @file{primitives}, defining words (for fast  words you just have to edit @file{primitives} (@pxref{Automatic
 defined words) may require changes in @file{engine.c},  Generation}), defining words (equivalent to @code{;CODE} words, for fast
 @file{kernal.fs}, @file{prims2x.fs}, and possibly @file{cross.fs}.  defined words) may require changes in @file{engine.c}, @file{kernal.fs},
   @file{prims2x.fs}, and possibly @file{cross.fs}.
   
   
 @node Threading Words,  , Assembler and Code words, Words  @node Threading Words,  , Assembler and Code words, Words
Line 2176  doc-douser: Line 2575  doc-douser:
 doc-dodefer:  doc-dodefer:
 doc-dofield:  doc-dofield:
   
 Currently there is no installation-independent way for recogizing words  You can recognize words defined by a @code{CREATE}...@code{DOES>} word
 defined by a @code{CREATE}...@code{DOES>} word; however, once you know  with @code{>DOES-CODE}. If the word was defined in that way, the value
 that a word is defined by a @code{CREATE}...@code{DOES>} word, you can  returned is different from 0 and identifies the @code{DOES>} used by the
 use @code{>DOES-CODE}.  defining word.
   
 @node ANS conformance, Model, Words, Top  @node ANS conformance, Model, Words, Top
 @chapter ANS conformance  @chapter ANS conformance
Line 2187  use @code{>DOES-CODE}. Line 2586  use @code{>DOES-CODE}.
 To the best of our knowledge, Gforth is an  To the best of our knowledge, Gforth is an
   
 ANS Forth System  ANS Forth System
 @itemize  @itemize @bullet
 @item providing the Core Extensions word set  @item providing the Core Extensions word set
 @item providing the Block word set  @item providing the Block word set
 @item providing the Block Extensions word set  @item providing the Block Extensions word set
Line 2206  ANS Forth System Line 2605  ANS Forth System
 @item providing the Memory-Allocation word set  @item providing the Memory-Allocation word set
 @item providing the Memory-Allocation Extensions word set (that one's easy)  @item providing the Memory-Allocation Extensions word set (that one's easy)
 @item providing the Programming-Tools word set  @item providing the Programming-Tools word set
 @item providing @code{;code}, @code{AHEAD}, @code{ASSEMBLER}, @code{BYE}, @code{CODE}, @code{CS-PICK}, @code{CS-ROLL}, @code{STATE}, @code{[ELSE]}, @code{[IF]}, @code{[THEN]} from the Programming-Tools Extensions word set  @item providing @code{;CODE}, @code{AHEAD}, @code{ASSEMBLER}, @code{BYE}, @code{CODE}, @code{CS-PICK}, @code{CS-ROLL}, @code{STATE}, @code{[ELSE]}, @code{[IF]}, @code{[THEN]} from the Programming-Tools Extensions word set
 @item providing the Search-Order word set  @item providing the Search-Order word set
 @item providing the Search-Order Extensions word set  @item providing the Search-Order Extensions word set
 @item providing the String word set  @item providing the String word set
Line 2264  processor-dependent. Gforth's alignment Line 2663  processor-dependent. Gforth's alignment
   
 @item @code{EMIT} and non-graphic characters:  @item @code{EMIT} and non-graphic characters:
 The character is output using the C library function (actually, macro)  The character is output using the C library function (actually, macro)
 @code{putchar}.  @code{putc}.
   
 @item character editing of @code{ACCEPT} and @code{EXPECT}:  @item character editing of @code{ACCEPT} and @code{EXPECT}:
 This is modeled on the GNU readline library (@pxref{Readline  This is modeled on the GNU readline library (@pxref{Readline
Line 2284  installation-dependent. Currently a char Line 2683  installation-dependent. Currently a char
   
 @item character-set extensions and matching of names:  @item character-set extensions and matching of names:
 Any character except the ASCII NUL charcter can be used in a  Any character except the ASCII NUL charcter can be used in a
 name. Matching is case-insensitive. The matching is performed using the  name. Matching is case-insensitive (except in @code{TABLE}s. The
 C function @code{strncasecmp}, whose function is probably influenced by  matching is performed using the C function @code{strncasecmp}, whose
 the locale. E.g., the @code{C} locale does not know about accents and  function is probably influenced by the locale. E.g., the @code{C} locale
 umlauts, so they are matched case-sensitively in that locale. For  does not know about accents and umlauts, so they are matched
 portability reasons it is best to write programs such that they work in  case-sensitively in that locale. For portability reasons it is best to
 the @code{C} locale. Then one can use libraries written by a Polish  write programs such that they work in the @code{C} locale. Then one can
 programmer (who might use words containing ISO Latin-2 encoded  use libraries written by a Polish programmer (who might use words
 characters) and by a French programmer (ISO Latin-1) in the same program  containing ISO Latin-2 encoded characters) and by a French programmer
 (of course, @code{WORDS} will produce funny results for some of the  (ISO Latin-1) in the same program (of course, @code{WORDS} will produce
 words (which ones, depends on the font you are using)). Also, the locale  funny results for some of the words (which ones, depends on the font you
 you prefer may not be available in other operating systems. Hopefully,  are using)). Also, the locale you prefer may not be available in other
 Unicode will solve these problems one day.  operating systems. Hopefully, Unicode will solve these problems one day.
   
 @item conditions under which control characters match a space delimiter:  @item conditions under which control characters match a space delimiter:
 If @code{WORD} is called with the space character as a delimiter, all  If @code{WORD} is called with the space character as a delimiter, all
Line 2328  The error string is stored into the vari Line 2727  The error string is stored into the vari
 @code{-2 throw} is performed.  @code{-2 throw} is performed.
   
 @item input line terminator:  @item input line terminator:
 For interactive input, @kbd{C-m} and @kbd{C-j} terminate lines. One of  For interactive input, @kbd{C-m} (CR) and @kbd{C-j} (LF) terminate
 these characters is typically produced when you type the @kbd{Enter} or  lines. One of these characters is typically produced when you type the
 @kbd{Return} key.  @kbd{Enter} or @kbd{Return} key.
   
 @item maximum size of a counted string:  @item maximum size of a counted string:
 @code{s" /counted-string" environment? drop .}. Currently 255 characters  @code{s" /counted-string" environment? drop .}. Currently 255 characters
Line 2351  change it from within Gforth. However, t Line 2750  change it from within Gforth. However, t
 redirected in the command line that starts Gforth.  redirected in the command line that starts Gforth.
   
 @item method of selecting the user output device:  @item method of selecting the user output device:
 The user output device is the standard output. It cannot be redirected  @code{EMIT} and @code{TYPE} output to the file-id stored in the value
 from within Gforth, but typically from the command line that starts  @code{outfile-id} (@code{stdout} by default). Gforth uses buffered
 Gforth. Gforth uses buffered output, so output on a terminal does not  output, so output on a terminal does not become visible before the next
 become visible before the next newline or buffer overflow. Output on  newline or buffer overflow. Output on non-terminals is invisible until
 non-terminals is invisible until the buffer overflows.  the buffer overflows.
   
 @item methods of dictionary compilation:  @item methods of dictionary compilation:
 What are we expected to document here?  What are we expected to document here?
Line 2391  string. Line 2790  string.
 @code{1 chars .}. 1 on all current ports.  @code{1 chars .}. 1 on all current ports.
   
 @item size of the keyboard terminal buffer:  @item size of the keyboard terminal buffer:
 Varies. You can determine the size at a specific time using @code{lp@  Varies. You can determine the size at a specific time using @code{lp@@
 tib - .}. It is shared with the locals stack and TIBs of files that  tib - .}. It is shared with the locals stack and TIBs of files that
 include the current file. You can change the amount of space for TIBs  include the current file. You can change the amount of space for TIBs
 and locals stack at Gforth startup with the command line option  and locals stack at Gforth startup with the command line option
Line 2403  shared with @code{WORD}. Line 2802  shared with @code{WORD}.
   
 @item size of the scratch area returned by @code{PAD}:  @item size of the scratch area returned by @code{PAD}:
 The remainder of dictionary space. You can even use the unused part of  The remainder of dictionary space. You can even use the unused part of
 the data stack space. The current size can be computed with @code{sp@  the data stack space. The current size can be computed with @code{sp@@
 pad - .}.  pad - .}.
   
 @item system case-sensitivity characteristics:  @item system case-sensitivity characteristics:
 Dictionary searches are case insensitive. However, as explained above  Dictionary searches are case insensitive (except in
 under @i{character-set extensions}, the matching for non-ASCII  @code{TABLE}s). However, as explained above under @i{character-set
 characters is determined by the locale you are using. In the default  extensions}, the matching for non-ASCII characters is determined by the
 @code{C} locale all non-ASCII characters are matched case-sensitively.  locale you are using. In the default @code{C} locale all non-ASCII
   characters are matched case-sensitively.
   
 @item system prompt:  @item system prompt:
 @code{ ok} in interpret state, @code{ compiled} in compile state.  @code{ ok} in interpret state, @code{ compiled} in compile state.
Line 2427  the choice to @code{gcc} (what to use fo Line 2827  the choice to @code{gcc} (what to use fo
 On two's complement machines, arithmetic is performed modulo  On two's complement machines, arithmetic is performed modulo
 2**bits-per-cell for single arithmetic and 4**bits-per-cell for double  2**bits-per-cell for single arithmetic and 4**bits-per-cell for double
 arithmetic (with appropriate mapping for signed types). Division by zero  arithmetic (with appropriate mapping for signed types). Division by zero
 typically results in a @code{-55 throw} (floatingpoint unidentified  typically results in a @code{-55 throw} (Floating-point unidentified
 fault), although a @code{-10 throw} (divide by zero) would be more  fault), although a @code{-10 throw} (divide by zero) would be more
 appropriate.  appropriate.
   
Line 2444  No. Line 2844  No.
 @table @i  @table @i
   
 @item a name is neither a word nor a number:  @item a name is neither a word nor a number:
 @code{-13 throw} (Undefined word)  @code{-13 throw} (Undefined word). Actually, @code{-13 bounce}, which
   preserves the data and FP stack, so you don't lose more work than
   necessary.
   
 @item a definition name exceeds the maximum length allowed:  @item a definition name exceeds the maximum length allowed:
 @code{-19 throw} (Word name too long)  @code{-19 throw} (Word name too long)
Line 2461  flow words, and issue a @code{ABORT"} or Line 2863  flow words, and issue a @code{ABORT"} or
 mismatch).  mismatch).
   
 @item attempting to obtain the execution token of a word with undefined execution semantics:  @item attempting to obtain the execution token of a word with undefined execution semantics:
 You get an execution token representing the compilation semantics  @code{-14 throw} (Interpreting a compile-only word). In some cases, you
 instead.  get an execution token for @code{compile-only-error} (which performs a
   @code{-14 throw} when executed).
   
 @item dividing by zero:  @item dividing by zero:
 typically results in a @code{-55 throw} (floating point unidentified  typically results in a @code{-55 throw} (floating point unidentified
Line 2483  error appears at a different place when Line 2886  error appears at a different place when
   
 @item interpreting a word with undefined interpretation semantics:  @item interpreting a word with undefined interpretation semantics:
 For some words, we defined interpretation semantics. For the others:  For some words, we defined interpretation semantics. For the others:
 @code{-14 throw} (Interpreting a compile-only word). Note that this is  @code{-14 throw} (Interpreting a compile-only word).
 checked only by the outer (aka text) interpreter; if the word is  
 @code{execute}d in some other way, it will typically perform it's  
 compilation semantics even in interpret state. (We could change @code{'}  
 and relatives not to give the xt of such words, but we think that would  
 be too restrictive).  
   
 @item modifying the contents of the input buffer or a string literal:  @item modifying the contents of the input buffer or a string literal:
 These are located in writable memory and can be modified.  These are located in writable memory and can be modified.
Line 2515  underflow) is performed. Apart from that Line 2913  underflow) is performed. Apart from that
 underflows can result in similar behaviour as overflows (of adjacent  underflows can result in similar behaviour as overflows (of adjacent
 stacks).  stacks).
   
 @item unexepected end of the input buffer, resulting in an attempt to use a zero-length string as a name:  @item unexpected end of the input buffer, resulting in an attempt to use a zero-length string as a name:
 @code{Create} and its descendants perform a @code{-16 throw} (Attempt to  @code{Create} and its descendants perform a @code{-16 throw} (Attempt to
 use zero-length string as a name). Words like @code{'} probably will not  use zero-length string as a name). Words like @code{'} probably will not
 find what they search. Note that it is possible to create zero-length  find what they search. Note that it is possible to create zero-length
Line 2525  names with @code{nextname} (should it no Line 2923  names with @code{nextname} (should it no
 The next invocation of a parsing word returns a string wih length 0.  The next invocation of a parsing word returns a string wih length 0.
   
 @item @code{RECURSE} appears after @code{DOES>}:  @item @code{RECURSE} appears after @code{DOES>}:
 Compiles a recursive call to the defining word not to the defined word.  Compiles a recursive call to the defining word, not to the defined word.
   
 @item argument input source different than current input source for @code{RESTORE-INPUT}:  @item argument input source different than current input source for @code{RESTORE-INPUT}:
 @code{-12 THROW}. Note that, once an input file is closed (e.g., because  @code{-12 THROW}. Note that, once an input file is closed (e.g., because
Line 2534  reused. Therefore, restoring an input so Line 2932  reused. Therefore, restoring an input so
 closed file may lead to unpredictable results instead of a @code{-12  closed file may lead to unpredictable results instead of a @code{-12
 THROW}.  THROW}.
   
 In the future, Gforth may be able to retore input source specifications  In the future, Gforth may be able to restore input source specifications
 from other than the current input soruce.  from other than the current input soruce.
   
 @item data space containing definitions gets de-allocated:  @item data space containing definitions gets de-allocated:
Line 2562  stack items are loop control parameters Line 2960  stack items are loop control parameters
 @code{abort" last word was headerless"}.  @code{abort" last word was headerless"}.
   
 @item name not defined by @code{VALUE} used by @code{TO}:  @item name not defined by @code{VALUE} used by @code{TO}:
 @code{-32 throw} (Invalid name argument)  @code{-32 throw} (Invalid name argument) (unless name was defined by
   @code{CONSTANT}; then it just changes the constant).
   
 @item name not found (@code{'}, @code{POSTPONE}, @code{[']}, @code{[COMPILE]}):  @item name not found (@code{'}, @code{POSTPONE}, @code{[']}, @code{[COMPILE]}):
 @code{-13 throw} (Undefined word)  @code{-13 throw} (Undefined word)
Line 2572  Gforth behaves as if they were of the sa Line 2971  Gforth behaves as if they were of the sa
 the behaviour by interpreting all parameters as, e.g., signed.  the behaviour by interpreting all parameters as, e.g., signed.
   
 @item @code{POSTPONE} or @code{[COMPILE]} applied to @code{TO}:  @item @code{POSTPONE} or @code{[COMPILE]} applied to @code{TO}:
 Assume @code{: X POSTPONE TO ; IMMEDIATE}. @code{X} is equivalent to  Assume @code{: X POSTPONE TO ; IMMEDIATE}. @code{X} performs the
 @code{TO}.  compilation semantics of @code{TO}.
   
 @item String longer than a counted string returned by @code{WORD}:  @item String longer than a counted string returned by @code{WORD}:
 Not checked. The string will be ok, but the count will, of course,  Not checked. The string will be ok, but the count will, of course,
Line 2612  and you can give commands to Gforth inte Line 3011  and you can give commands to Gforth inte
 available depend on how you invoke Gforth.  available depend on how you invoke Gforth.
   
 @item program data space available:  @item program data space available:
 @code{sp@ here - .} gives the space remaining for dictionary and data  @code{sp@@ here - .} gives the space remaining for dictionary and data
 stack together.  stack together.
   
 @item return stack space available:  @item return stack space available:
Line 2620  By default 16 KBytes. The default can be Line 3019  By default 16 KBytes. The default can be
 switch (@pxref{Invocation}) when Gforth starts up.  switch (@pxref{Invocation}) when Gforth starts up.
   
 @item stack space available:  @item stack space available:
 @code{sp@ here - .} gives the space remaining for dictionary and data  @code{sp@@ here - .} gives the space remaining for dictionary and data
 stack together.  stack together.
   
 @item system dictionary space required, in address units:  @item system dictionary space required, in address units:
Line 3201  Not implemented (yet). Line 3600  Not implemented (yet).
 @table @i  @table @i
   
 @item changing the compilation wordlist (during compilation):  @item changing the compilation wordlist (during compilation):
 The definition is put into the wordlist that is the compilation wordlist  The word is entered into the wordlist that was the compilation wordlist
 when @code{REVEAL} is executed (by @code{;}, @code{DOES>},  at the start of the definition. Any changes to the name field (e.g.,
 @code{RECURSIVE}, etc.).  @code{immediate}) or the code field (e.g., when executing @code{DOES>})
   are applied to the latest defined word (as reported by @code{last} or
   @code{lastxt}), if possible, irrespective of the compilation wordlist.
   
 @item search order empty (@code{previous}):  @item search order empty (@code{previous}):
 @code{abort" Vocstack empty"}.  @code{abort" Vocstack empty"}.
Line 3213  when @code{REVEAL} is executed (by @code Line 3614  when @code{REVEAL} is executed (by @code
   
 @end table  @end table
   
   @node Model, Integrating Gforth, ANS conformance, Top
 @node Model, Emacs and Gforth, ANS conformance, Top  
 @chapter Model  @chapter Model
   
 @node Emacs and Gforth, Internals, Model, Top  This chapter has yet to be written. It will contain information, on
   which internal structures you can rely.
   
   @node Integrating Gforth, Emacs and Gforth, Model, Top
   @chapter Integrating Gforth into C programs
   
   This is not yet implemented.
   
   Several people like to use Forth as scripting language for applications
   that are otherwise written in C, C++, or some other language.
   
   The Forth system ATLAST provides facilities for embedding it into
   applications; unfortunately it has several disadvantages: most
   importantly, it is not based on ANS Forth, and it is apparently dead
   (i.e., not developed further and not supported). The facilities
   provided by Gforth in this area are inspired by ATLASTs facilities, so
   making the switch should not be hard.
   
   We also tried to design the interface such that it can easily be
   implemented by other Forth systems, so that we may one day arrive at a
   standardized interface. Such a standard interface would allow you to
   replace the Forth system without having to rewrite C code.
   
   You embed the Gforth interpreter by linking with the library
   @code{libgforth.a} (give the compiler the option @code{-lgforth}).  All
   global symbols in this library that belong to the interface, have the
   prefix @code{forth_}. (Global symbols that are used internally have the
   prefix @code{gforth_}).
   
   You can include the declarations of Forth types and the functions and
   variables of the interface with @code{#include <forth.h>}.
   
   Types.
   
   Variables.
   
   Data and FP Stack pointer. Area sizes.
   
   functions.
   
   forth_init(imagefile)
   forth_evaluate(string) exceptions?
   forth_goto(address) (or forth_execute(xt)?)
   forth_continue() (a corountining mechanism)
   
   Adding primitives.
   
   No checking.
   
   Signals?
   
   Accessing the Stacks
   
   @node Emacs and Gforth, Internals, Integrating Gforth, Top
 @chapter Emacs and Gforth  @chapter Emacs and Gforth
   
 Gforth comes with @file{gforth.el}, an improved version of  Gforth comes with @file{gforth.el}, an improved version of
 @file{forth.el} by Goran Rydqvist (icluded in the TILE package). The  @file{forth.el} by Goran Rydqvist (included in the TILE package). The
 improvements are a better (but still not perfect) handling of  improvements are a better (but still not perfect) handling of
 indentation. I have also added comment paragraph filling (@kbd{M-q}),  indentation. I have also added comment paragraph filling (@kbd{M-q}),
 commenting (@kbd{C-x \}) and uncommenting (@kbd{C-u C-x \}) regions and  commenting (@kbd{C-x \}) and uncommenting (@kbd{C-u C-x \}) regions and
Line 3246  several tags files at the same time (e.g Line 3699  several tags files at the same time (e.g
 and one for your program, @pxref{Select Tags Table,,Selecting a Tags  and one for your program, @pxref{Select Tags Table,,Selecting a Tags
 Table,emacs, Emacs Manual}). The TAGS file for the preloaded words is  Table,emacs, Emacs Manual}). The TAGS file for the preloaded words is
 @file{$(datadir)/gforth/$(VERSION)/TAGS} (e.g.,  @file{$(datadir)/gforth/$(VERSION)/TAGS} (e.g.,
 @file{/usr/local/share/gforth/0.2/TAGS}).  @file{/usr/local/share/gforth/0.2.0/TAGS}).
   
 To get all these benefits, add the following lines to your @file{.emacs}  To get all these benefits, add the following lines to your @file{.emacs}
 file:  file:
Line 3301  limitations: GNU C, the version of C pro Line 3754  limitations: GNU C, the version of C pro
 GNU C Manual}). Its labels as values feature (@pxref{Labels as Values, ,  GNU C Manual}). Its labels as values feature (@pxref{Labels as Values, ,
 Labels as Values, gcc.info, GNU C Manual}) makes direct and indirect  Labels as Values, gcc.info, GNU C Manual}) makes direct and indirect
 threading possible, its @code{long long} type (@pxref{Long Long, ,  threading possible, its @code{long long} type (@pxref{Long Long, ,
 Double-Word Integers, gcc.info, GNU C Manual}) corresponds to Forths  Double-Word Integers, gcc.info, GNU C Manual}) corresponds to Forth's
 double numbers. GNU C is available for free on all important (and many  double numbers@footnote{Unfortunately, long longs are not implemented
 unimportant) UNIX machines, VMS, 80386s running MS-DOS, the Amiga, and  properly on all machines (e.g., on alpha-osf1, long longs are only 64
 the Atari ST, so a Forth written in GNU C can run on all these  bits, the same size as longs (and pointers), but they should be twice as
 machines.  long according to @ref{Long Long, , Double-Word Integers, gcc.info, GNU
   C Manual}). So, we had to implement doubles in C after all. Still, on
   most machines we can use long longs and achieve better performance than
   with the emulation package.}. GNU C is available for free on all
   important (and many unimportant) UNIX machines, VMS, 80386s running
   MS-DOS, the Amiga, and the Atari ST, so a Forth written in GNU C can run
   on all these machines.
   
 Writing in a portable language has the reputation of producing code that  Writing in a portable language has the reputation of producing code that
 is slower than assembly. For our Forth engine we repeatedly looked at  is slower than assembly. For our Forth engine we repeatedly looked at
Line 3544  An important optimization for stack mach Line 4003  An important optimization for stack mach
 engines, is keeping  one or more of the top stack items in  engines, is keeping  one or more of the top stack items in
 registers.  If a word has the stack effect @var{in1}...@var{inx} @code{--}  registers.  If a word has the stack effect @var{in1}...@var{inx} @code{--}
 @var{out1}...@var{outy}, keeping the top @var{n} items in registers  @var{out1}...@var{outy}, keeping the top @var{n} items in registers
 @itemize  @itemize @bullet
 @item  @item
 is better than keeping @var{n-1} items, if @var{x>=n} and @var{y>=n},  is better than keeping @var{n-1} items, if @var{x>=n} and @var{y>=n},
 due to fewer loads from and stores to the stack.  due to fewer loads from and stores to the stack.
Line 3578  The TOS optimization makes the automatic Line 4037  The TOS optimization makes the automatic
 bit more complicated. Just replacing all occurrences of @code{sp[0]} by  bit more complicated. Just replacing all occurrences of @code{sp[0]} by
 @code{TOS} is not sufficient. There are some special cases to  @code{TOS} is not sufficient. There are some special cases to
 consider:  consider:
 @itemize  @itemize @bullet
 @item In the case of @code{dup ( w -- w w )} the generator must not  @item In the case of @code{dup ( w -- w w )} the generator must not
 eliminate the store to the original location of the item on the stack,  eliminate the store to the original location of the item on the stack,
 if the TOS optimization is turned on.  if the TOS optimization is turned on.
Line 3659  Gforth (direct threaded, compiled with @ Line 4118  Gforth (direct threaded, compiled with @
 @code{-DFORCE_REG}) with Win32Forth 1.2093, LMI's NT Forth (Beta, May  @code{-DFORCE_REG}) with Win32Forth 1.2093, LMI's NT Forth (Beta, May
 1994) and Eforth (with and without peephole (aka pinhole) optimization  1994) and Eforth (with and without peephole (aka pinhole) optimization
 of the threaded code); all these systems were written in assembly  of the threaded code); all these systems were written in assembly
 language. We also compared Gforth with two systems written in C:  language. We also compared Gforth with three systems written in C:
 PFE-0.9.11 (compiled with @code{gcc-2.6.3} with the default  PFE-0.9.14 (compiled with @code{gcc-2.6.3} with the default
 configuration for Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS}) and  configuration for Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS
 ThisForth Beta (compiled with gcc-2.6.3 -O3 -fomit-frame-pointer;  -DUNROLL_NEXT}), ThisForth Beta (compiled with gcc-2.6.3 -O3
 ThisForth employs peephole optimization of the threaded code). We  -fomit-frame-pointer; ThisForth employs peephole optimization of the
 benchmarked Gforth, PFE and ThisForth on a 486DX2/66 under  threaded code) and TILE (compiled with @code{make opt}). We benchmarked
 Linux. Kenneth O'Heskin kindly provided the results for Win32Forth and  Gforth, PFE, ThisForth and TILE on a 486DX2/66 under Linux. Kenneth
 NT Forth on a 486DX2/66 with similar memory performance under Windows  O'Heskin kindly provided the results for Win32Forth and NT Forth on a
 NT. Marcel Hendrix ported Eforth to Linux, then extended it to run the  486DX2/66 with similar memory performance under Windows NT. Marcel
 benchmarks, added the peephole optimizer, ran the benchmarks and  Hendrix ported Eforth to Linux, then extended it to run the benchmarks,
 reported the results.  added the peephole optimizer, ran the benchmarks and reported the
   results.
     
 We used four small benchmarks: the ubiquitous Sieve; bubble-sorting and  We used four small benchmarks: the ubiquitous Sieve; bubble-sorting and
 matrix multiplication come from the Stanford integer benchmarks and have  matrix multiplication come from the Stanford integer benchmarks and have
 been translated into Forth by Martin Fraeman; we used the versions  been translated into Forth by Martin Fraeman; we used the versions
 included in the TILE Forth package; and a recursive Fibonacci number  included in the TILE Forth package, but with bigger data set sizes; and
 computation for benchmarking calling performance. The following table shows  a recursive Fibonacci number computation for benchmarking calling
 the time taken for the benchmarks scaled by the time taken by Gforth (in  performance. The following table shows the time taken for the benchmarks
 other words, it shows the speedup factor that Gforth achieved over the  scaled by the time taken by Gforth (in other words, it shows the speedup
 other systems).  factor that Gforth achieved over the other systems).
   
 @example  @example
 relative        Win32-    NT       eforth       This-  relative      Win32-    NT       eforth       This-
 time      Gforth Forth Forth eforth  +opt   PFE Forth    time  Gforth Forth Forth eforth  +opt   PFE Forth  TILE
 sieve       1.00  1.39  1.14   1.39  0.85  1.78  3.18  sieve     1.00  1.39  1.14   1.39  0.85  1.58  3.18  8.58
 bubble      1.00  1.33  1.43   1.51  0.89  1.70  bubble    1.00  1.31  1.41   1.48  0.88  1.50        3.88
 matmul      1.00  1.43  1.31   1.42  1.12  2.28  matmul    1.00  1.47  1.35   1.46  1.16  1.58        4.09
 fib         1.00  1.55  1.36   1.24  1.15  1.97  3.04  fib       1.00  1.52  1.34   1.22  1.13  1.74  2.99  4.30
 @end example  @end example
   
 You may find the good performance of Gforth compared with the systems  You may find the good performance of Gforth compared with the systems
Line 3703  Gforth. The speedups achieved with peeph Line 4163  Gforth. The speedups achieved with peeph
 code are quite remarkable. Adding a peephole optimizer to Gforth should  code are quite remarkable. Adding a peephole optimizer to Gforth should
 cause similar speedups.  cause similar speedups.
   
 The speedup of Gforth over PFE and ThisForth can be easily explained  The speedup of Gforth over PFE, ThisForth and TILE can be easily
 with the self-imposed restriction to standard C (although the measured  explained with the self-imposed restriction to standard C, which makes
 implementation of PFE uses a GNU C extension: global register  efficient threading impossible (however, the measured implementation of
 variables), which makes efficient threading impossible.  Moreover,  PFE uses a GNU C extension: @ref{Global Reg Vars, , Defining Global
 current C compilers have a hard time optimizing other aspects of the  Register Variables, gcc.info, GNU C Manual}).  Moreover, current C
 ThisForth source.  compilers have a hard time optimizing other aspects of the ThisForth
   and the TILE source.
   
 Note that the performance of Gforth on 386 architecture processors  Note that the performance of Gforth on 386 architecture processors
 varies widely with the version of @code{gcc} used. E.g., @code{gcc-2.5.8}  varies widely with the version of @code{gcc} used. E.g., @code{gcc-2.5.8}
Line 3732  numbers for Gforth on various machines i Line 4193  numbers for Gforth on various machines i
 Known bugs are described in the file BUGS in the Gforth distribution.  Known bugs are described in the file BUGS in the Gforth distribution.
   
 If you find a bug, please send a bug report to  If you find a bug, please send a bug report to
 @code{gforth-bugs@@mips.complang.tuwien.ac.at}. A bug report should  @code{bug-gforth@@gnu.ai.mit.edu}. A bug report should
 describe the Gforth version used (it is announced at the start of an  describe the Gforth version used (it is announced at the start of an
 interactive Gforth session), the machine and operating system (on Unix  interactive Gforth session), the machine and operating system (on Unix
 systems you can use @code{uname -a} to produce this information), the  systems you can use @code{uname -a} to produce this information), the
Line 3752  to Report Bugs, gcc.info, GNU C Manual}. Line 4213  to Report Bugs, gcc.info, GNU C Manual}.
 @section Authors and Contributors  @section Authors and Contributors
   
 The Gforth project was started in mid-1992 by Bernd Paysan and Anton  The Gforth project was started in mid-1992 by Bernd Paysan and Anton
 Ertl. The third major author was Jens Wilke. Lennart Benschop (who also  Ertl. The third major author was Jens Wilke.  Lennart Benschop (who was
 was one of Gforth's first users, in mid-1993) and Stuart Ramsden  one of Gforth's first users, in mid-1993) and Stuart Ramsden inspired us
 inspired us with their continuous feedback. Lennart Benshop contributed  with their continuous feedback. Lennart Benshop contributed
 @file{glosgen.fs}, while Stuart Ramsden has been working on automatic  @file{glosgen.fs}, while Stuart Ramsden has been working on automatic
 support for calling C libraries. Helpful comments also came from Paul  support for calling C libraries. Helpful comments also came from Paul
 Kleinrubatscher, Christian Pirker, Dirk Zoller and Marcel Hendrix.  Kleinrubatscher, Christian Pirker, Dirk Zoller and Marcel Hendrix.
   
   Gforth also owes a lot to the authors of the tools we used (GCC, CVS,
   and autoconf, among others), and to the creators of the Internet: Gforth
   was developed across the Internet, and its authors have not met
   physically yet.
   
 @section Pedigree  @section Pedigree
   
 Gforth descends from BigForth (1993) and fig-Forth. Gforth and PFE (by  Gforth descends from BigForth (1993) and fig-Forth. Gforth and PFE (by
Line 3773  VolksForth descends from F83. It was wri Line 4239  VolksForth descends from F83. It was wri
 Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called  Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called
 UltraForth there) in the mid-80s and ported to the Atari ST in 1986.  UltraForth there) in the mid-80s and ported to the Atari ST in 1986.
   
 Hennry Laxen and Mike Perry wrote F83 as a model implementation of the  Henry Laxen and Mike Perry wrote F83 as a model implementation of the
 Forth-83 standard. !! Pedigree? When?  Forth-83 standard. !! Pedigree? When?
   
 A team led by Bill Ragsdale implemented fig-Forth on many processors in  A team led by Bill Ragsdale implemented fig-Forth on many processors in
Line 3786  the 1802, and subsequently implemented o Line 4252  the 1802, and subsequently implemented o
 Z80.  Z80.
   
 All earlier Forth systems were custom-made, usually by Charles Moore,  All earlier Forth systems were custom-made, usually by Charles Moore,
 who discovered (as he puts it) Forth in the late 60s.  who discovered (as he puts it) Forth during the late 60s. The first full
   Forth existed in 1971.
   
 A part of the information in this section comes from @cite{The Evolution  A part of the information in this section comes from @cite{The Evolution
 of Forth} by Elizabeth D. Rather, Donald R. Colburn and Charles  of Forth} by Elizabeth D. Rather, Donald R. Colburn and Charles

Removed from v.1.29  
changed lines
  Added in v.1.36


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>