Diff for /gforth/Attic/gforth.ds between versions 1.23 and 1.34

version 1.23, 1995/11/14 22:12:50 version 1.34, 1996/08/21 14:58:40
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 36  Copyright @copyright{} 1995 Free Softwar Line 36  Copyright @copyright{} 1995 Free Softwar
      of in the original English.       of in the original English.
 @end ifinfo  @end ifinfo
   
   @finalout
 @titlepage  @titlepage
 @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
 @sp 3  @sp 3
 @center This manual is under construction  @center This manual is under construction
   
 @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 75  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 86  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
 * Pedigree::                    Ancestors of Gforth  * Origin::                      Authors and ancestors of Gforth
 * Word Index::                  An item for each Forth word  * Word Index::                  An item for each Forth word
 * Node Index::                  An item for each node  * Node Index::                  An item for each node
 @end menu  @end menu
Line 558  can also get it from Global Engineering Line 561  can also get it from Global Engineering
 for publication is available electronically and for free in some MS Word  for publication is available electronically and for free in some MS Word
 format, and it has been converted to HTML. Some pointers to these  format, and it has been converted to HTML. Some pointers to these
 versions can be found through  versions can be found through
 http://www.complang.tuwien.ac.at/projects/forth.html.  @*@file{http://www.complang.tuwien.ac.at/projects/forth.html}.
   
 @cite{Forth: The new model} by Jack Woehr (Prentice-Hall, 1993) is an  @cite{Forth: The new model} by Jack Woehr (Prentice-Hall, 1993) is an
 introductory book based on a draft version of the standard. It does not  introductory book based on a draft version of the standard. It does not
Line 1139  system that only supplies @code{THEN} is Line 1142  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 1232  arithmetic). This behaviour is usually n Line 1238  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 1266  between @var{limit+1} and @var{limit} is Line 1266  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 1298  This is the preferred loop of native cod Line 1292  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 1334  doc-else Line 1329  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 1344  doc-u-do Line 1345  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 1409  while Line 1409  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 1443  laden with restrictions. Therefore, we p Line 1443  laden with restrictions. Therefore, we p
 locals wordset, but also our own, more powerful locals wordset (we  locals wordset, but also our own, more powerful locals wordset (we
 implemented the ANS Forth locals wordset through our locals wordset).  implemented the ANS Forth locals wordset through our locals wordset).
   
   The ideas in this section have also been published in the paper
   @cite{Automatic Scoping of Local Variables} by M. Anton Ertl, presented
   at EuroForth '94; it is available at
   @*@file{http://www.complang.tuwien.ac.at/papers/ertl94l.ps.gz}.
   
 @menu  @menu
 * Gforth locals::                 * Gforth locals::               
 * ANS Forth locals::              * ANS Forth locals::            
Line 1729  E.g., a definition using @code{TO} might Line 1734  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 1752  are initialized with the right value for Line 1757  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 1932  name produces their value. Their value c Line 1937  name produces their value. Their value c
   
 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 2082  machine code), and for defining the the Line 2087  machine code), and for defining the the
 nature of Gforth poses a few problems: First of all. Gforth runs on  nature of Gforth poses a few problems: First of all. Gforth runs on
 several architectures, so it can provide no standard assembler. What's  several architectures, so it can provide no standard assembler. What's
 worse is that the register allocation not only depends on the processor,  worse is that the register allocation not only depends on the processor,
 but also on the gcc version and options used.  but also on the @code{gcc} version and options used.
   
 The words Gforth offers encapsulate some system dependences (e.g., the  The words that Gforth offers encapsulate some system dependences (e.g., the
 header structure), so a system-independent assembler may be used in  header structure), so a system-independent assembler may be used in
 Gforth. If you do not have an assembler, you can compile machine code  Gforth. If you do not have an assembler, you can compile machine code
 directly with @code{,} and @code{c,}.  directly with @code{,} and @code{c,}.
Line 2102  These words are rarely used. Therefore t Line 2107  These words are rarely used. Therefore t
 which is usually not loaded (except @code{flush-icache}, which is always  which is usually not loaded (except @code{flush-icache}, which is always
 present). You can load them with @code{require code.fs}.  present). You can load them with @code{require code.fs}.
   
   In the assembly code you will want to refer to the inner interpreter's
   registers (e.g., the data stack pointer) and you may want to use other
   registers for temporary storage. Unfortunately, the register allocation
   is installation-dependent.
   
   The easiest solution is to use explicit register declarations
   (@pxref{Explicit Reg Vars, , Variables in Specified Registers, gcc.info,
   GNU C Manual}) for all of the inner interpreter's registers: You have to
   compile Gforth with @code{-DFORCE_REG} (configure option
   @code{--enable-force-reg}) and the appropriate declarations must be
   present in the @code{machine.h} file (see @code{mips.h} for an example;
   you can find a full list of all declarable register symbols with
   @code{grep register engine.c}). If you give explicit registers to all
   variables that are declared at the beginning of @code{engine()}, you
   should be able to use the other caller-saved registers for temporary
   storage. Alternatively, you can use the @code{gcc} option
   @code{-ffixed-REG} (@pxref{Code Gen Options, , Options for Code
   Generation Conventions, gcc.info, GNU C Manual}) to reserve a register
   (however, this restriction on register allocation may slow Gforth
   significantly).
   
   If this solution is not viable (e.g., because @code{gcc} does not allow
   you to explicitly declare all the registers you need), you have to find
   out by looking at the code where the inner interpreter's registers
   reside and which registers can be used for temporary storage. You can
   get an assembly listing of the engine's code with @code{make engine.s}.
   
   In any case, it is good practice to abstract your assembly code from the
   actual register allocation. E.g., if the data stack pointer resides in
   register @code{$17}, create an alias for this register called @code{sp},
   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}, defining words (for fast
 defined words) probably require changes in @file{engine.c},  defined words) may require changes in @file{engine.c},
 @file{kernal.fs}, @file{prims2x.fs}, and possibly @file{cross.fs}.  @file{kernal.fs}, @file{prims2x.fs}, and possibly @file{cross.fs}.
   
   
Line 2148  use @code{>DOES-CODE}. Line 2185  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 2167  ANS Forth System Line 2204  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 2378  characters is determined by the locale y Line 2415  characters is determined by the locale y
   
 @item division rounding:  @item division rounding:
 installation dependent. @code{s" floored" environment? drop .}. We leave  installation dependent. @code{s" floored" environment? drop .}. We leave
 the choice to gcc (what to use for @code{/}) and to you (whether to use  the choice to @code{gcc} (what to use for @code{/}) and to you (whether to use
 @code{fm/mod}, @code{sm/rem} or simply @code{/}).  @code{fm/mod}, @code{sm/rem} or simply @code{/}).
   
 @item values of @code{STATE} when true:  @item values of @code{STATE} when true:
Line 2489  The next invocation of a parsing word re Line 2526  The next invocation of a parsing word re
 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}:
 !!???If the argument input source is a valid input source then it gets  @code{-12 THROW}. Note that, once an input file is closed (e.g., because
 restored. Otherwise causes @code{-12 THROW}, which, unless caught, issues  the end of the file was reached), its source-id may be
 the message "argument type mismatch" and aborts.  reused. Therefore, restoring an input source specification referencing a
   closed file may lead to unpredictable results instead of a @code{-12
   THROW}.
   
   In the future, Gforth may be able to retore input source specifications
   from other than the current input soruce.
   
 @item data space containing definitions gets de-allocated:  @item data space containing definitions gets de-allocated:
 Deallocation with @code{allot} is not checked. This typically resuls in  Deallocation with @code{allot} is not checked. This typically resuls in
Line 2563  Not checked. As usual, you can expect me Line 2605  Not checked. As usual, you can expect me
 None.  None.
   
 @item operator's terminal facilities available:  @item operator's terminal facilities available:
 !!??  After processing the command line, Gforth goes into interactive mode,
   and you can give commands to Gforth interactively. The actual facilities
   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:
 !!??  By default 16 KBytes. The default can be overridden with the @code{-r}
   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
Line 2891  System dependent; @code{REPRESENT} is im Line 2936  System dependent; @code{REPRESENT} is im
 function @code{ecvt()} and inherits its behaviour in this respect.  function @code{ecvt()} and inherits its behaviour in this respect.
   
 @item rounding or truncation of floating-point numbers:  @item rounding or truncation of floating-point numbers:
 What's the question?!!  System dependent; the rounding behaviour is inherited from the hosting C
   compiler. IEEE-FP-based (i.e., most) systems by default round to
   nearest, and break ties by rounding to even (i.e., such that the last
   bit of the mantissa is 0).
   
 @item size of floating-point stack:  @item size of floating-point stack:
 @code{s" FLOATING-STACK" environment? drop .}. Can be changed at startup  @code{s" FLOATING-STACK" environment? drop .}. Can be changed at startup
Line 3151  Not implemented (yet). Line 3199  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 3163  when @code{REVEAL} is executed (by @code Line 3213  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
   implorantly, 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 3193  Also, if you @code{include} @file{etags. Line 3295  Also, if you @code{include} @file{etags.
 contains the definitions of all words defined afterwards. You can then  contains the definitions of all words defined afterwards. You can then
 find the source for a word using @kbd{M-.}. Note that emacs can use  find the source for a word using @kbd{M-.}. Note that emacs can use
 several tags files at the same time (e.g., one for the Gforth sources  several tags files at the same time (e.g., one for the Gforth sources
 and one for your program).  and one for your program, @pxref{Select Tags Table,,Selecting a Tags
   Table,emacs, Emacs Manual}). The TAGS file for the preloaded words is
   @file{$(datadir)/gforth/$(VERSION)/TAGS} (e.g.,
   @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 3209  file: Line 3314  file:
 Reading this section is not necessary for programming with Gforth. It  Reading this section is not necessary for programming with Gforth. It
 should be helpful for finding your way in the Gforth sources.  should be helpful for finding your way in the Gforth sources.
   
   The ideas in this section have also been published in the papers
   @cite{ANS fig/GNU/??? Forth} (in German) by Bernd Paysan, presented at
   the Forth-Tagung '93 and @cite{A Portable Forth Engine} by M. Anton
   Ertl, presented at EuroForth '93; the latter is available at
   @*@file{http://www.complang.tuwien.ac.at/papers/ertl93.ps.Z}.
   
 @menu  @menu
 * Portability::                   * Portability::                 
 * Threading::                     * Threading::                   
Line 3242  limitations: GNU C, the version of C pro Line 3353  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 3485  An important optimization for stack mach Line 3602  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 3519  The TOS optimization makes the automatic Line 3636  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 3596  Sieve benchmark on a 486DX2/66 than Gfor Line 3713  Sieve benchmark on a 486DX2/66 than Gfor
   
 However, this potential advantage of assembly language implementations  However, this potential advantage of assembly language implementations
 is not necessarily realized in complete Forth systems: We compared  is not necessarily realized in complete Forth systems: We compared
 Gforth (compiled with @code{gcc-2.6.3} and @code{-DFORCE_REG}) with  Gforth (direct threaded, compiled with @code{gcc-2.6.3} and
 Win32Forth 1.2093 and LMI's NT Forth (Beta, May 1994), two systems  @code{-DFORCE_REG}) with Win32Forth 1.2093, LMI's NT Forth (Beta, May
 written in assembly, and with two systems written in C: PFE-0.9.11  1994) and Eforth (with and without peephole (aka pinhole) optimization
 (compiled with @code{gcc-2.6.3} with the default configuration for  of the threaded code); all these systems were written in assembly
 Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS}) and ThisForth Beta  language. We also compared Gforth with three systems written in C:
 (compiled with gcc-2.6.3 -O3 -fomit-frame-pointer). We benchmarked  PFE-0.9.14 (compiled with @code{gcc-2.6.3} with the default
 Gforth, PFE and ThisForth on a 486DX2/66 under Linux. Kenneth O'Heskin  configuration for Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS
 kindly provided the results for Win32Forth and NT Forth on a 486DX2/66  -DUNROLL_NEXT}), ThisForth Beta (compiled with gcc-2.6.3 -O3
 with similar memory performance under Windows NT.  -fomit-frame-pointer; ThisForth employs peephole optimization of the
   threaded code) and TILE (compiled with @code{make opt}). We benchmarked
   Gforth, PFE, ThisForth and TILE on a 486DX2/66 under Linux. Kenneth
   O'Heskin kindly provided the results for Win32Forth and NT Forth on a
   486DX2/66 with similar memory performance under Windows NT. Marcel
   Hendrix ported Eforth to Linux, then extended it to run the benchmarks,
   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 benchmark 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               This-  relative      Win32-    NT       eforth       This-
   time     Gforth     Forth     Forth       PFE     Forth    time  Gforth Forth Forth eforth  +opt   PFE Forth  TILE
 sieve        1.00      1.30      1.07      1.67      2.98  sieve     1.00  1.39  1.14   1.39  0.85  1.58  3.18  8.58
 bubble       1.00      1.30      1.40      1.66  bubble    1.00  1.31  1.41   1.48  0.88  1.50        3.88
 matmul       1.00      1.40      1.29      2.24  matmul    1.00  1.47  1.35   1.46  1.16  1.58        4.09
 fib          1.00      1.44      1.26      1.82      2.82  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 3633  method for relocating the Forth image: l Line 3757  method for relocating the Forth image: l
 the actual addresses at run time, resulting in two address computations  the actual addresses at run time, resulting in two address computations
 per NEXT (@pxref{System Architecture}).  per NEXT (@pxref{System Architecture}).
   
 The speedup of Gforth over PFE and ThisForth can be easily explained  Only Eforth with the peephole optimizer performs comparable to
 with the self-imposed restriction to standard C (although the measured  Gforth. The speedups achieved with peephole optimization of threaded
 implementation of PFE uses a GNU C extension: global register  code are quite remarkable. Adding a peephole optimizer to Gforth should
 variables), which makes efficient threading impossible.  Moreover,  cause similar speedups.
 current C compilers have a hard time optimizing other aspects of the  
 ThisForth source.  The speedup of Gforth over PFE, ThisForth and TILE can be easily
   explained with the self-imposed restriction to standard C, which makes
   efficient threading impossible (however, the measured implementation of
   PFE uses a GNU C extension: @ref{Global Reg Vars, , Defining Global
   Register Variables, gcc.info, GNU C Manual}).  Moreover, current C
   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 3647  machine registers by itself and would no Line 3777  machine registers by itself and would no
 register declarations, giving a 1.3 times slower engine (on a 486DX2/66  register declarations, giving a 1.3 times slower engine (on a 486DX2/66
 running the Sieve) than the one measured above.  running the Sieve) than the one measured above.
   
 @node Bugs, Pedigree, Internals, Top  In @cite{Translating Forth to Efficient C} by M. Anton Ertl and Martin
   Maierhofer (presented at EuroForth '95), an indirect threaded version of
   Gforth is compared with Win32Forth, NT Forth, PFE, and ThisForth; that
   version of Gforth is 2\%@minus{}8\% slower on a 486 than the version
   used here. The paper available at
   @*@file{http://www.complang.tuwien.ac.at/papers/ertl&maierhofer95.ps.gz};
   it also contains numbers for some native code systems. You can find
   numbers for Gforth on various machines in @file{Benchres}.
   
   @node Bugs, Origin, Internals, Top
 @chapter Bugs  @chapter Bugs
   
 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 !!. A bug report should  If you find a bug, please send a bug report to
   @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
 installation options (!! a way to find them out), and a complete list of  installation options (send the @code{config.status} file), and a
 changes you (or your installer) have made to the Gforth sources (if  complete list of changes you (or your installer) have made to the Gforth
 any); it should contain a program (or a sequence of keyboard commands)  sources (if any); it should contain a program (or a sequence of keyboard
 that reproduces the bug and a description of what you think constitutes  commands) that reproduces the bug and a description of what you think
 the buggy behaviour.  constitutes the buggy behaviour.
   
 For a thorough guide on reporting bugs read @ref{Bug Reporting, , How  For a thorough guide on reporting bugs read @ref{Bug Reporting, , How
 to Report Bugs, gcc.info, GNU C Manual}.  to Report Bugs, gcc.info, GNU C Manual}.
   
   
 @node Pedigree, Word Index, Bugs, Top  @node Origin, Word Index, Bugs, Top
 @chapter Pedigree  @chapter Authors and Ancestors of Gforth
   
   @section Authors and Contributors
   
   The Gforth project was started in mid-1992 by Bernd Paysan and Anton
   Ertl. The third major author was Jens Wilke.  Lennart Benschop (who was
   one of Gforth's first users, in mid-1993) and Stuart Ramsden inspired us
   with their continuous feedback. Lennart Benshop contributed
   @file{glosgen.fs}, while Stuart Ramsden has been working on automatic
   support for calling C libraries. Helpful comments also came from Paul
   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
   
 Gforth descends from BigForth (1993) and fig-Forth. Gforth and PFE (by  Gforth descends from BigForth (1993) and fig-Forth. Gforth and PFE (by
 Dirk Zoller) will cross-fertilize each other. Of course, a significant part of the design of Gforth was prescribed by ANS Forth.  Dirk Zoller) will cross-fertilize each other. Of course, a significant
   part of the design of Gforth was prescribed by ANS Forth.
   
 Bernd Paysan wrote BigForth, a descendent from TurboForth, an unreleased  Bernd Paysan wrote BigForth, a descendent from TurboForth, an unreleased
 32 bit native code version of VolksForth for the Atari ST, written  32 bit native code version of VolksForth for the Atari ST, written
Line 3678  mostly by Dietrich Weineck. Line 3836  mostly by Dietrich Weineck.
   
 VolksForth descends from F83. It was written by Klaus Schleisiek, Bernd  VolksForth descends from F83. It was written by Klaus Schleisiek, Bernd
 Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called  Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called
 UltraForth there) in the midth of the 80th and ported to Atari ST in  UltraForth there) in the mid-80s and ported to the Atari ST in 1986.
 1986.  
   
 Laxen and 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
 1979. Dean Sanderson and Bill Ragsdale developed the original  1979. Robert Selzer and Bill Ragsdale developed the original
 implementation of fig-Forth based on microForth.  implementation of fig-Forth for the 6502 based on microForth.
   
 microForth appears to be a downsized version of polyForth from Forth  The principal architect of microForth was Dean Sanderson. microForth was
 Inc. for the 8080 written in the midth of the 70th.  FORTH, Inc.'s first off-the-shelf product. It was developped in 1976 for
   the 1802, and subsequently implemented on the 8080, the 6800 and the
   Z80.
   
   All earlier Forth systems were custom-made, usually by Charles Moore,
   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
Line 3697  H. Moore, presented at the HOPL-II confe Line 3860  H. Moore, presented at the HOPL-II confe
 Notices 28(3), 1993.  You can find more historical and genealogical  Notices 28(3), 1993.  You can find more historical and genealogical
 information about Forth there.  information about Forth there.
   
 @node Word Index, Node Index, Pedigree, Top  @node Word Index, Node Index, Origin, Top
 @chapter Word Index  @chapter Word Index
   
 This index is as incomplete as the manual. Each word is listed with  This index is as incomplete as the manual. Each word is listed with

Removed from v.1.23  
changed lines
  Added in v.1.34


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