version 1.21, 1995/11/07 18:06:41
|
version 1.25, 1995/11/28 18:45:28
|
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} |
Line 43 Copyright @copyright{} 1995 Free Softwar
|
Line 44 Copyright @copyright{} 1995 Free Softwar
|
@center for version 0.1 |
@center for version 0.1 |
@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 |
|
|
Line 487 library. If this is what you want to do
|
Line 489 library. If this is what you want to do
|
Public License instead of this License. |
Public License instead of this License. |
|
|
@iftex |
@iftex |
|
@node Preface |
|
@comment node-name, next, previous, up |
@unnumbered Preface |
@unnumbered Preface |
|
@cindex Preface |
This manual documents Gforth. The reader is expected to know |
This manual documents Gforth. The reader is expected to know |
Forth. This manual is primarily a reference manual. @xref{Other Books} |
Forth. This manual is primarily a reference manual. @xref{Other Books} |
for introductory material. |
for introductory material. |
Line 555 can also get it from Global Engineering
|
Line 560 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 642 Forth words, you have to quote them or u
|
Line 647 Forth words, you have to quote them or u
|
after processing the command line (instead of entering interactive mode) |
after processing the command line (instead of entering interactive mode) |
append @code{-e bye} to the command line. |
append @code{-e bye} to the command line. |
|
|
|
If you have several versions of Gforth installed, @code{gforth} will |
|
invoke the version that was installed last. @code{gforth-@var{version}} |
|
invokes a specific version. You may want to use the option |
|
@code{--path}, if your environment contains the variable |
|
@code{GFORTHPATH}. |
|
|
Not yet implemented: |
Not yet implemented: |
On startup the system first executes the system initialization file |
On startup the system first executes the system initialization file |
(unless the option @code{--no-init-file} is given; note that the system |
(unless the option @code{--no-init-file} is given; note that the system |
Line 1434 laden with restrictions. Therefore, we p
|
Line 1445 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 2073 machine code), and for defining the the
|
Line 2089 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 2093 These words are rarely used. Therefore t
|
Line 2109 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 2369 characters is determined by the locale y
|
Line 2417 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 3200 file:
|
Line 3248 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 3601 We used four small benchmarks: the ubiqu
|
Line 3655 We used four small benchmarks: the ubiqu
|
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; and a recursive Fibonacci number |
computation for benchmark calling performance. The following table shows |
computation for benchmarking calling performance. The following table shows |
the time taken for the benchmarks scaled by the time taken by Gforth (in |
the time taken for the benchmarks scaled by the time taken by Gforth (in |
other words, it shows the speedup factor that Gforth achieved over the |
other words, it shows the speedup factor that Gforth achieved over the |
other systems). |
other systems). |
Line 3638 machine registers by itself and would no
|
Line 3692 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. |
|
|
|
The numbers in this section have also been published in the paper |
|
@cite{Translating Forth to Efficient C} by M. Anton Ertl and Martin |
|
Maierhofer, presented at EuroForth '95. It is 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, Pedigree, Internals, Top |
@node Bugs, Pedigree, 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{gforth-bugs@@mips.complang.tuwien.ac.at}. 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}. |
Line 3661 to Report Bugs, gcc.info, GNU C Manual}.
|
Line 3723 to Report Bugs, gcc.info, GNU C Manual}.
|
@chapter Pedigree |
@chapter 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 child of VolksForth. |
Bernd Paysan wrote BigForth, a descendent from TurboForth, an unreleased |
|
32 bit native code version of VolksForth for the Atari ST, written |
|
mostly by Dietrich Weineck. |
|
|
|
VolksForth descends from F83. It was written by Klaus Schleisiek, Bernd |
|
Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called |
|
UltraForth there) in the mid-80s and ported to the Atari ST in 1986. |
|
|
VolksForth descends from F83. !! Authors? When? |
Hennry Laxen and Mike Perry wrote F83 as a model implementation of the |
|
|
Laxen and 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. |
|
|
|
The principal architect of microForth was Dean Sanderson. microForth was |
|
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. |
|
|
!! microForth pedigree |
All earlier Forth systems were custom-made, usually by Charles Moore, |
|
who discovered (as he puts it) Forth in the late 60s. |
|
|
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 |