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

version 1.29, 1996/01/07 17:22:09 version 1.32, 1996/02/19 18:57:26
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 1141  system that only supplies @code{THEN} is Line 1141  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 1237  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 1265  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 1291  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 1328  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 1344  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 1408  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 1733  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 1756  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 1939  name produces their value. Their value c Line 1936  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 3302  GNU C Manual}). Its labels as values fea Line 3299  GNU C Manual}). Its labels as values fea
 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 Forths
 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 3659  Gforth (direct threaded, compiled with @ Line 3662  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 3707  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 3737  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 3757  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 3786  the 1802, and subsequently implemented o Line 3796  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.32


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