--- gforth/Attic/gforth.ds 1996/01/07 17:22:09 1.29 +++ gforth/Attic/gforth.ds 1997/01/14 16:30:50 1.42 @@ -7,9 +7,9 @@ @comment %**end of header (This is for running Texinfo on a region.) @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 this manual provided the copyright notice and this permission notice @@ -41,7 +41,7 @@ Copyright @copyright{} 1995 Free Softwar @sp 10 @center @titlefont{Gforth Manual} @sp 2 -@center for version 0.1 +@center for version 0.2 @sp 2 @center Anton Ertl @center Bernd Paysan @@ -51,7 +51,7 @@ Copyright @copyright{} 1995 Free Softwar @comment The following two commands start the copyright page. @page @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 ... @@ -77,7 +77,7 @@ Copyright @copyright{} 1995 Free Softwar @node Top, License, (dir), (dir) @ifinfo 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 @menu @@ -86,8 +86,10 @@ personal machines. This manual correspon * Other Books:: Things you might want to read * Invocation:: Starting Gforth * Words:: Forth words available in Gforth +* Tools:: Programming tools * ANS conformance:: Implementation-defined options etc. * Model:: The abstract machine of Gforth +* Integrating Gforth:: Forth as scripting language for applications. * Emacs and Gforth:: The Gforth Mode * Internals:: Implementation details * Bugs:: How to report them @@ -565,7 +567,7 @@ versions can be found through @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 cover the whole standard. It also contains interesting background -information (Jack Woehr was in the ANS Forth Technical Committe). It is +information (Jack Woehr was in the ANS Forth Technical Committee). It is not appropriate for complete newbies, but programmers experienced in other languages should find it ok. @@ -599,11 +601,11 @@ Loads the Forth image @var{file} instead @item --path @var{path} @item -p @var{path} -Uses @var{path} for searching the image file and Forth source code -files instead of the default in the environment variable -@code{GFORTHPATH} or the path specified at installation time (typically -@file{/usr/local/lib/gforth:.}). A path is given as a @code{:}-separated -list. +Uses @var{path} for searching the image file and Forth source code files +instead of the default in the environment variable @code{GFORTHPATH} or +the path specified at installation time (e.g., +@file{/usr/local/share/gforth/0.2.0:.}). A path is given as a list of +directories, separated by @samp{:} (on Unix) or @samp{;} (on other OSs). @item --dictionary-size @var{size} @item -m @var{size} @@ -639,7 +641,7 @@ default specified in the image (typicall As explained above, the image-specific command-line arguments for the default image @file{gforth.fi} consist of a sequence of filenames and -@code{-e @var{forth-code}} options that are interpreted in the seqence +@code{-e @var{forth-code}} options that are interpreted in the sequence in which they are given. The @code{-e @var{forth-code}} or @code{--evaluate @var{forth-code}} option evaluates the forth code. This option takes only one argument; if you want to evaluate more @@ -661,7 +663,7 @@ the user initialization file @file{.gfor option @code{--no-rc} is given; this file is first searched in @file{.}, then in @file{~}, then in the normal path (see above). -@node Words, ANS conformance, Invocation, Top +@node Words, Tools, Invocation, Top @chapter Forth Words @menu @@ -672,6 +674,7 @@ then in @file{~}, then in the normal pat * Control Structures:: * Locals:: * Defining Words:: +* Tokens for Words:: * Wordlists:: * Files:: * Blocks:: @@ -754,11 +757,11 @@ double sized signed integer @item ud double sized unsigned integer @item r -Float +Float (on the FP stack) @item a_ Cell-aligned address @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_ Float-aligned address @item df_ @@ -771,6 +774,11 @@ Execution token, same size as Cell Wordlist ID, same size as Cell @item f83name 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 @node Arithmetic, Stack Manipulation, Notation, Words @@ -847,8 +855,8 @@ doc-dmax The format of floating point numbers recognized by the outer (aka text) interpreter is: a signed decimal number, possibly containing a decimal 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 -@code{+1.0e+1}. Note that a number without @code{e} +by a signed integer (the exponent). E.g., @code{1e} is the same as +@code{+1.0e+0}. Note that a number without @code{e} is not interpreted as floating-point number, but as double (if the number contains a @code{.}) or single precision integer. Also, conversions between string and floating point numbers always use base @@ -1141,8 +1149,11 @@ system that only supplies @code{THEN} is Forth's @code{THEN} has the meaning 2b, whereas @code{THEN} in Pascal and many other programming languages has the meaning 3d.] -We also provide the words @code{?dup-if} and @code{?dup-0=-if}, so you -can avoid using @code{?dup}. +Gforth also provides the words @code{?dup-if} and @code{?dup-0=-if}, so +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 @var{n} @@ -1234,13 +1245,7 @@ arithmetic). This behaviour is usually n 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 @var{limit}; @code{+DO} is for signed loop parameters, @code{U+DO} for -unsigned loop parameters. These words can be implemented easily on -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 +unsigned loop parameters. @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 @@ -1268,16 +1273,10 @@ between @var{limit+1} and @var{limit} is @code{ 0 0 -DO i . 1 -LOOP} prints nothing -Another alternative is @code{@var{n} S+LOOP}, where the negative -case behaves symmetrical to the positive case: - -@code{-2 0 -DO i . -1 S+LOOP} prints @code{0 -1} - -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. +Unfortunately, @code{+DO}, @code{U+DO}, @code{-DO}, @code{U-DO} and +@code{-LOOP} are not in the ANS Forth standard. However, an +implementation for these words that uses only standard words is provided +in @file{compat/loops.fs}. @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 @@ -1300,7 +1299,8 @@ This is the preferred loop of native cod lazy to optimize @code{?DO} loops properly. In Gforth, this loop 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 -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 @subsection Arbitrary control structures @@ -1336,6 +1336,12 @@ doc-else doc-while 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: doc-?do @@ -1346,7 +1352,6 @@ doc-u-do doc-do doc-for doc-loop -doc-s+loop doc-+loop doc--loop doc-next @@ -1411,7 +1416,7 @@ while repeat @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 necessary to define them. @@ -1505,7 +1510,7 @@ Gforth currently supports cells (@code{W with @code{W:}, @code{D:} etc.) produces its value and can be changed with @code{TO}. A variable-flavoured local (defined with @code{W^} etc.) produces its address (which becomes invalid when the variable's scope is -left). E.g., the standard word @code{emit} can be defined in therms of +left). E.g., the standard word @code{emit} can be defined in terms of @code{type} like this: @example @@ -1564,7 +1569,7 @@ definition? Which local is meant, if the two independent control flow paths? This should be enough detail for nearly all users, so you can skip the -rest of this section. If you relly must know all the gory details and +rest of this section. If you really must know all the gory details and options, read on. In order to implement this rule, the compiler has to know which places @@ -1617,7 +1622,7 @@ are entered only through the @code{BEGIN @code{BEGIN}...@code{UNTIL} loops and it is implemented in our compiler. When the branch to the @code{BEGIN} is finally generated by @code{AGAIN} or @code{UNTIL}, the compiler checks the guess and -warns the user if it was too optimisitic: +warns the user if it was too optimistic: @example IF @{ x @} @@ -1736,8 +1741,8 @@ E.g., a definition using @code{TO} might : strcmp @{ addr1 u1 addr2 u2 -- n @} u1 u2 min 0 ?do - addr1 c@ addr2 c@ - ?dup - if + addr1 c@@ addr2 c@@ - + ?dup-if unloop exit then addr1 char+ TO addr1 @@ -1759,8 +1764,8 @@ are initialized with the right value for addr1 addr2 u1 u2 min 0 ?do @{ s1 s2 @} - s1 c@ s2 c@ - ?dup - if + s1 c@@ s2 c@@ - + ?dup-if unloop exit then s1 char+ s2 char+ @@ -1933,14 +1938,14 @@ stack easier. The whole definition must be in one line. @end itemize -Locals defined in this way behave like @code{VALUE}s -(@xref{Values}). I.e., they are initialized from the stack. Using their +Locals defined in this way behave like @code{VALUE}s (@xref{Simple +Defining Words}). I.e., they are initialized from the stack. Using their name produces their value. Their value can be changed using @code{TO}. 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 -another ANS Forth system, use @file{anslocal.fs} to implement the syntax -on the other system. +another ANS Forth system, use @file{compat/anslocal.fs} to implement the +syntax on the other system. Note that a syntax shown in the standard, section A.13 looks similar, but is quite different in having the order of locals @@ -1959,17 +1964,479 @@ programs harder to read, and easier to m merit of this syntax is that it is easy to implement using the ANS Forth locals wordset. -@node Defining Words, Wordlists, Locals, Words +@node Defining Words, Tokens for Words, Locals, Words @section Defining Words @menu -* Values:: +* Simple Defining Words:: +* Colon Definitions:: +* User-defined Defining Words:: +* Supplying names:: +* Interpretation and Compilation Semantics:: @end menu -@node Values, , Defining Words, Defining Words -@subsection Values +@node Simple Defining Words, Colon Definitions, Defining Words, Defining Words +@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-target reg-source n -- ) + 0 asm-reg-reg-imm ; +: andi, ( reg-target reg-source n -- ) + 1 asm-reg-reg-imm ; +@end example + +This could be factored with: +@example +: reg-reg-imm ( op-code -- ) + create , +DOES> ( reg-target 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 equivalent 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 -@node Wordlists, Files, Defining Words, Words +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} + + @var{code3} + ( -- n ) + @@ + ( compilation. -- ; run-time. -- n ) + @@ postpone literal + +doc- +doc-body} also gives you the body of a word created with +@code{create-interpret/compile}. + +@node Tokens for Words, Wordlists, Defining Words, Words +@section Tokens for Words + +This chapter describes the creation and use of tokens that represent +words on the stack (and in data space). + +Named words have interpretation and compilation semantics. Unnamed words +just have execution semantics. + +An @dfn{execution token} represents the execution semantics of an +unnamed word. An execution token occupies one cell. As explained in +section @ref{Supplying names}, the execution token of the last words +defined can be produced with + +short-lastxt + +You can perform the semantics represented by an execution token with +doc-execute +You can compile the word with +doc-compile, + +In Gforth, the abstract data type @emph{execution token} is implemented +as CFA (code field address). + +The interpretation semantics of a named word are also represented by an +execution token. You can get it with + +doc-['] +doc-' + +For literals, you use @code{'} in interpreted code and @code{[']} in +compiled code. Gforth's @code{'} and @code{[']} behave somewhat unusual +by complaining about compile-only words. To get an execution token for a +compiling word @var{X}, use @code{COMP' @var{X} drop} or @code{[COMP'] +@var{X} drop}. + +The compilation semantics are represented by a @dfn{compilation token} +consisting of two cells: @var{w xt}. The top cell @var{xt} is an +execution token. The compilation semantics represented by the +compilation token can be performed with @code{execute}, which consumes +the whole compilation token, with an additional stack effect determined +by the represented compilation semantics. + +doc-[comp'] +doc-comp' + +You can compile the compilation semantics with @code{postpone,}. I.e., +@code{COMP' @var{word} POSTPONE,} is equivalent to @code{POSTPONE +@var{word}}. + +doc-postpone, + +At present, the @var{w} part of a compilation token is an execution +token, and the @var{xt} part represents either @code{execute} or +@code{compile,}. However, don't rely on that knowledge, unless necessary; +we may introduce unusual compilation tokens in the future (e.g., +compilation tokens representing the compilation semantics of literals). + +Named words are also represented by the @dfn{name token}. The abstract +data type @emph{name token} is implemented as NFA (name field address). + +doc-find-name +doc-name>int +doc-name?int +doc-name>comp +doc-name>string + +@node Wordlists, Files, Tokens for Words, Words @section Wordlists @node Files, Blocks, Wordlists, Words @@ -1997,7 +2464,7 @@ are meant to support a different style o tracing/stepping debuggers used in languages with long turn-around times. -A much better (faster) way in fast-compilig languages is to add +A much better (faster) way in fast-compiling languages is to add printing code at well-selected places, let the program run, look at the output, see where things went wrong, add more printing code, etc., until the bug is found. @@ -2086,7 +2553,7 @@ probably more appropriate than an assert Gforth provides some words for defining primitives (words written in machine code), and for defining the the machine-code equivalent of @code{DOES>}-based defining words. However, the machine-independent -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 worse is that the register allocation not only depends on the processor, but also on the @code{gcc} version and options used. @@ -2143,9 +2610,10 @@ and use that in your assembly code. Another option for implementing normal and defining words efficiently is: adding the wanted functionality to the source of Gforth. For normal -words you just have to edit @file{primitives}, defining words (for fast -defined words) may require changes in @file{engine.c}, -@file{kernal.fs}, @file{prims2x.fs}, and possibly @file{cross.fs}. +words you just have to edit @file{primitives} (@pxref{Automatic +Generation}), defining words (equivalent to @code{;CODE} words, for fast +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 @@ -2176,18 +2644,69 @@ doc-douser: doc-dodefer: doc-dofield: -Currently there is no installation-independent way for recogizing words -defined by a @code{CREATE}...@code{DOES>} word; however, once you know -that a word is defined by a @code{CREATE}...@code{DOES>} word, you can -use @code{>DOES-CODE}. +You can recognize words defined by a @code{CREATE}...@code{DOES>} word +with @code{>DOES-CODE}. If the word was defined in that way, the value +returned is different from 0 and identifies the @code{DOES>} used by the +defining word. + +@node Tools, ANS conformance, Words, Top +@chapter Tools -@node ANS conformance, Model, Words, Top +@menu +* ANS Report:: Report the words used, sorted by wordset +@end menu + +See also @ref{Emacs and Gforth}. + +@node ANS Report, , Tools, Tools +@section @file{ans-report.fs}: Report the words used, sorted by wordset + +If you want to label a Forth program as ANS Forth Program, you must +document which wordsets the program uses; for extension wordsets, it is +helpful to list the words the program requires from these wordsets +(because Forth systems are allowed to provide only some words of them). + +The @file{ans-report.fs} tool makes it easy for you to determine which +words from which wordset and which non-ANS words your application +uses. You simply have to include @file{ans-report.fs} before loading the +program you want to check. After loading your program, you can get the +report with @code{print-ans-report}. A typical use is to run this as +batch job like this: +@example +gforth ans-report.fs myprog.fs -e "print-ans-report bye" +@end example + +The output looks like this (for @file{compat/control.fs}): +@example +The program uses the following words +from CORE : +: POSTPONE THEN ; immediate ?dup IF 0= +from BLOCK-EXT : +\ +from FILE : +( +@end example + +@subsection Caveats + +Note that @file{ans-report.fs} just checks which words are used, not whether +they are used in an ANS Forth conforming way! + +Some words are defined in several wordsets in the +standard. @file{ans-report.fs} reports them for only one of the +wordsets, and not necessarily the one you expect. It depends on usage +which wordset is the right one to specify. E.g., if you only use the +compilation semantics of @code{S"}, it is a Core word; if you also use +its interpretation semantics, it is a File word. + + +@node ANS conformance, Model, Tools, Top @chapter ANS conformance To the best of our knowledge, Gforth is an ANS Forth System -@itemize +@itemize @bullet @item providing the Core Extensions word set @item providing the Block word set @item providing the Block Extensions word set @@ -2206,7 +2725,7 @@ ANS Forth System @item providing the Memory-Allocation word set @item providing the Memory-Allocation Extensions word set (that one's easy) @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 Extensions word set @item providing the String word set @@ -2264,7 +2783,7 @@ processor-dependent. Gforth's alignment @item @code{EMIT} and non-graphic characters: The character is output using the C library function (actually, macro) -@code{putchar}. +@code{putc}. @item character editing of @code{ACCEPT} and @code{EXPECT}: This is modeled on the GNU readline library (@pxref{Readline @@ -2284,18 +2803,18 @@ installation-dependent. Currently a char @item character-set extensions and matching of names: Any character except the ASCII NUL charcter can be used in a -name. Matching is case-insensitive. The matching is performed using the -C function @code{strncasecmp}, whose function is probably influenced by -the locale. E.g., the @code{C} locale does not know about accents and -umlauts, so they are matched case-sensitively in that locale. For -portability reasons it is best to write programs such that they work in -the @code{C} locale. Then one can use libraries written by a Polish -programmer (who might use words containing ISO Latin-2 encoded -characters) and by a French programmer (ISO Latin-1) in the same program -(of course, @code{WORDS} will produce funny results for some of the -words (which ones, depends on the font you are using)). Also, the locale -you prefer may not be available in other operating systems. Hopefully, -Unicode will solve these problems one day. +name. Matching is case-insensitive (except in @code{TABLE}s. The +matching is performed using the C function @code{strncasecmp}, whose +function is probably influenced by the locale. E.g., the @code{C} locale +does not know about accents and umlauts, so they are matched +case-sensitively in that locale. For portability reasons it is best to +write programs such that they work in the @code{C} locale. Then one can +use libraries written by a Polish programmer (who might use words +containing ISO Latin-2 encoded characters) and by a French programmer +(ISO Latin-1) in the same program (of course, @code{WORDS} will produce +funny results for some of the words (which ones, depends on the font you +are using)). Also, the locale you prefer may not be available in other +operating systems. Hopefully, Unicode will solve these problems one day. @item conditions under which control characters match a space delimiter: If @code{WORD} is called with the space character as a delimiter, all @@ -2328,9 +2847,9 @@ The error string is stored into the vari @code{-2 throw} is performed. @item input line terminator: -For interactive input, @kbd{C-m} and @kbd{C-j} terminate lines. One of -these characters is typically produced when you type the @kbd{Enter} or -@kbd{Return} key. +For interactive input, @kbd{C-m} (CR) and @kbd{C-j} (LF) terminate +lines. One of these characters is typically produced when you type the +@kbd{Enter} or @kbd{Return} key. @item maximum size of a counted string: @code{s" /counted-string" environment? drop .}. Currently 255 characters @@ -2351,11 +2870,11 @@ change it from within Gforth. However, t redirected in the command line that starts Gforth. @item method of selecting the user output device: -The user output device is the standard output. It cannot be redirected -from within Gforth, but typically from the command line that starts -Gforth. Gforth uses buffered output, so output on a terminal does not -become visible before the next newline or buffer overflow. Output on -non-terminals is invisible until the buffer overflows. +@code{EMIT} and @code{TYPE} output to the file-id stored in the value +@code{outfile-id} (@code{stdout} by default). Gforth uses buffered +output, so output on a terminal does not become visible before the next +newline or buffer overflow. Output on non-terminals is invisible until +the buffer overflows. @item methods of dictionary compilation: What are we expected to document here? @@ -2391,7 +2910,7 @@ string. @code{1 chars .}. 1 on all current ports. @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 include the current file. You can change the amount of space for TIBs and locals stack at Gforth startup with the command line option @@ -2403,14 +2922,15 @@ shared with @code{WORD}. @item size of the scratch area returned by @code{PAD}: 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 - .}. @item system case-sensitivity characteristics: -Dictionary searches are case insensitive. However, as explained above -under @i{character-set extensions}, the matching for non-ASCII -characters is determined by the locale you are using. In the default -@code{C} locale all non-ASCII characters are matched case-sensitively. +Dictionary searches are case insensitive (except in +@code{TABLE}s). However, as explained above under @i{character-set +extensions}, the matching for non-ASCII characters is determined by the +locale you are using. In the default @code{C} locale all non-ASCII +characters are matched case-sensitively. @item system prompt: @code{ ok} in interpret state, @code{ compiled} in compile state. @@ -2427,7 +2947,7 @@ the choice to @code{gcc} (what to use fo On two's complement machines, arithmetic is performed modulo 2**bits-per-cell for single arithmetic and 4**bits-per-cell for double 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 appropriate. @@ -2444,7 +2964,9 @@ No. @table @i @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: @code{-19 throw} (Word name too long) @@ -2461,8 +2983,9 @@ flow words, and issue a @code{ABORT"} or mismatch). @item attempting to obtain the execution token of a word with undefined execution semantics: -You get an execution token representing the compilation semantics -instead. +@code{-14 throw} (Interpreting a compile-only word). In some cases, you +get an execution token for @code{compile-only-error} (which performs a +@code{-14 throw} when executed). @item dividing by zero: typically results in a @code{-55 throw} (floating point unidentified @@ -2483,12 +3006,7 @@ error appears at a different place when @item interpreting a word with undefined interpretation semantics: For some words, we defined interpretation semantics. For the others: -@code{-14 throw} (Interpreting a compile-only word). Note that this is -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). +@code{-14 throw} (Interpreting a compile-only word). @item modifying the contents of the input buffer or a string literal: These are located in writable memory and can be modified. @@ -2515,17 +3033,17 @@ underflow) is performed. Apart from that underflows can result in similar behaviour as overflows (of adjacent 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 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 names with @code{nextname} (should it not?). @item @code{>IN} greater than input buffer: -The next invocation of a parsing word returns a string wih length 0. +The next invocation of a parsing word returns a string with length 0. @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}: @code{-12 THROW}. Note that, once an input file is closed (e.g., because @@ -2534,11 +3052,11 @@ reused. Therefore, restoring an input so 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. +In the future, Gforth may be able to restore input source specifications +from other than the current input source. @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 results in memory access faults or execution of illegal instructions. @item data space read/write with incorrect alignment: @@ -2562,7 +3080,8 @@ stack items are loop control parameters @code{abort" last word was headerless"}. @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]}): @code{-13 throw} (Undefined word) @@ -2572,8 +3091,8 @@ Gforth behaves as if they were of the sa the behaviour by interpreting all parameters as, e.g., signed. @item @code{POSTPONE} or @code{[COMPILE]} applied to @code{TO}: -Assume @code{: X POSTPONE TO ; IMMEDIATE}. @code{X} is equivalent to -@code{TO}. +Assume @code{: X POSTPONE TO ; IMMEDIATE}. @code{X} performs the +compilation semantics of @code{TO}. @item String longer than a counted string returned by @code{WORD}: Not checked. The string will be ok, but the count will, of course, @@ -2612,20 +3131,23 @@ and you can give commands to Gforth inte available depend on how you invoke Gforth. @item program data space available: -@code{sp@ here - .} gives the space remaining for dictionary and data -stack together. +@code{UNUSED .} gives the remaining dictionary space. The total +dictionary space can be specified with the @code{-m} switch +(@pxref{Invocation}) when Gforth starts up. @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. +You can compute the total return stack space in cells with +@code{s" RETURN-STACK-CELLS" environment? drop .}. You can specify it at +startup time with the @code{-r} switch (@pxref{Invocation}). @item stack space available: -@code{sp@ here - .} gives the space remaining for dictionary and data -stack together. +You can compute the total data stack space in cells with +@code{s" STACK-CELLS" environment? drop .}. You can specify it at +startup time with the @code{-d} switch (@pxref{Invocation}). @item system dictionary space required, in address units: Type @code{here forthstart - .} after startup. At the time of this -writing, this gives 70108 (bytes) on a 32-bit system. +writing, this gives 80080 (bytes) on a 32-bit system. @end table @@ -2746,7 +3268,7 @@ The least significant cell of @var{d} is The codes -256@minus{}-511 are used for reporting signals (see @file{errore.fs}). The codes -512@minus{}-2047 are used for OS errors (for file and memory allocation operations). The mapping from OS error -numbers to throw code is -512@minus{}@var{errno}. One side effect of +numbers to throw code is -512@minus{}@code{errno}. One side effect of this mapping is that undefined OS errors produce a message with a strange number; e.g., @code{-1000 THROW} results in @code{Unknown error 488} on my system. @@ -2771,7 +3293,7 @@ strange number; e.g., @code{-1000 THROW} @table @i @item encoding of keyboard events (@code{EKEY}): -Not yet implemeted. +Not yet implemented. @item duration of a system clock tick System dependent. With respect to @code{MS}, the time is specified in @@ -2795,7 +3317,7 @@ other single-tasking systems, it should @table @i @item @code{AT-XY} can't be performed on user output device: -Largely terminal dependant. No range checks are done on the arguments. +Largely terminal dependent. No range checks are done on the arguments. No errors are reported. You may see some garbage appearing, you may see simply nothing happen. @@ -2844,7 +3366,7 @@ System dependent. Gforth just uses the f @code{FILE-STATUS} returns the most powerful file access mode allowed for the file: Either @code{R/O}, @code{W/O} or @code{R/W}. If the file cannot be accessed, @code{R/O BIN} is returned. @code{BIN} is applicable -along with the retured mode. +along with the returned mode. @item input file state after an exception when including source: All files that are left via the exception are closed. @@ -2863,9 +3385,8 @@ of open files available. This should not @code{/line}. Currently 255. @item methods of mapping block ranges to files: -Currently, the block words automatically access the file -@file{blocks.fb} in the currend working directory. More sophisticated -methods could be implemented if there is demand (and a volunteer). +By default, blocks are accessed in the file @file{blocks.fb} in the +current working directory. The file can be switched with @code{USE}. @item number of string buffers provided by @code{S"}: 1 @@ -2944,8 +3465,9 @@ nearest, and break ties by rounding to e bit of the mantissa is 0). @item size of floating-point stack: -@code{s" FLOATING-STACK" environment? drop .}. Can be changed at startup -with the command-line option @code{-f}. +@code{s" FLOATING-STACK" environment? drop .} gives the total size of +the floating-point stack (in floats). You can specify this on startup +with the command-line option @code{-f} (@pxref{Invocation}). @item width of floating-point stack: @code{1 floats}. @@ -2961,11 +3483,11 @@ with the command-line option @code{-f}. @table @i @item @code{df@@} or @code{df!} used with an address that is not double-float aligned: -System-dependent. Typically results in an alignment fault like other +System-dependent. Typically results in a @code{-23 THROW} like other alignment violations. @item @code{f@@} or @code{f!} used with an address that is not float aligned: -System-dependent. Typically results in an alignment fault like other +System-dependent. Typically results in a @code{-23 THROW} like other alignment violations. @item Floating-point result out of range: @@ -3113,14 +3635,15 @@ intended as throw codes. They typically @table @i @item ending sequence for input following @code{;code} and @code{code}: -Not implemented (yet). +@code{end-code} @item manner of processing input following @code{;code} and @code{code}: -Not implemented (yet). +The @code{assembler} vocabulary is pushed on the search order stack, and +the input is processed by the text interpreter, (starting) in interpret +state. @item search order capability for @code{EDITOR} and @code{ASSEMBLER}: -Not implemented (yet). If they were implemented, they would use the -search order wordset. +The ANS Forth search order word set. @item source and format of display by @code{SEE}: The source for @code{see} is the intermediate code used by the inner @@ -3149,9 +3672,9 @@ unlucky, this ambiguous condition is not Not implemented (yet). @item @var{name} not defined via @code{CREATE}: -@code{;code} is not implemented (yet). If it were, it would behave like -@code{DOES>} in this respect, i.e., change the execution semantics of -the last defined word no matter how it was defined. +@code{;code} behaves like @code{DOES>} in this respect, i.e., it changes +the execution semantics of the last defined word no matter how it was +defined. @item @code{POSTPONE} applied to @code{[IF]}: After defining @code{: X POSTPONE [IF] ; IMMEDIATE}. @code{X} is @@ -3201,9 +3724,11 @@ Not implemented (yet). @table @i @item changing the compilation wordlist (during compilation): -The definition is put into the wordlist that is the compilation wordlist -when @code{REVEAL} is executed (by @code{;}, @code{DOES>}, -@code{RECURSIVE}, etc.). +The word is entered into the wordlist that was the compilation wordlist +at the start of the definition. Any changes to the name field (e.g., +@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}): @code{abort" Vocstack empty"}. @@ -3213,15 +3738,67 @@ when @code{REVEAL} is executed (by @code @end table - -@node Model, Emacs and Gforth, ANS conformance, Top +@node Model, Integrating Gforth, ANS conformance, Top @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 }. + +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 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 indentation. I have also added comment paragraph filling (@kbd{M-q}), commenting (@kbd{C-x \}) and uncommenting (@kbd{C-u C-x \}) regions and @@ -3246,7 +3823,7 @@ several tags files at the same time (e.g 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/TAGS}). +@file{/usr/local/share/gforth/0.2.0/TAGS}). To get all these benefits, add the following lines to your @file{.emacs} file: @@ -3301,11 +3878,17 @@ limitations: GNU C, the version of C pro GNU C Manual}). Its labels as values feature (@pxref{Labels as Values, , Labels as Values, gcc.info, GNU C Manual}) makes direct and indirect threading possible, its @code{long long} type (@pxref{Long Long, , -Double-Word Integers, gcc.info, GNU C Manual}) corresponds to Forths -double numbers. 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. +Double-Word Integers, gcc.info, GNU C Manual}) corresponds to Forth's +double numbers@footnote{Unfortunately, long longs are not implemented +properly on all machines (e.g., on alpha-osf1, long longs are only 64 +bits, the same size as longs (and pointers), but they should be twice as +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 is slower than assembly. For our Forth engine we repeatedly looked at @@ -3433,7 +4016,7 @@ lies in the body (which is illegal in th making the code field larger for all words this solution becomes legal again. We use this approach for the indirect threaded version. Leaving a cell unused in most words is a bit wasteful, but on the machines we -are targetting this is hardly a problem. The other reason for having a +are targeting this is hardly a problem. The other reason for having a code field size of two cells is to avoid having different image files for direct and indirect threaded systems (@pxref{System Architecture}). @@ -3544,7 +4127,7 @@ An important optimization for stack mach 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{--} @var{out1}...@var{outy}, keeping the top @var{n} items in registers -@itemize +@itemize @bullet @item 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. @@ -3578,7 +4161,7 @@ The TOS optimization makes the automatic bit more complicated. Just replacing all occurrences of @code{sp[0]} by @code{TOS} is not sufficient. There are some special cases to consider: -@itemize +@itemize @bullet @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, if the TOS optimization is turned on. @@ -3627,7 +4210,7 @@ comply to some restrictions: addresses h special words (@code{A!}, @code{A,}, etc.) in order to make the code relocatable. Cells, floats, etc., have to be stored at the natural alignment boundaries@footnote{E.g., store floats (8 bytes) at an address -dividable by~8. This happens automatically in our system when you use +divisible by~8. This happens automatically in our system when you use the ANS Forth alignment words.}, in order to avoid alignment faults on machines with stricter alignment. The image file is produced by a metacompiler (@file{cross.fs}). @@ -3659,34 +4242,35 @@ Gforth (direct threaded, compiled with @ @code{-DFORCE_REG}) with Win32Forth 1.2093, LMI's NT Forth (Beta, May 1994) and Eforth (with and without peephole (aka pinhole) optimization of the threaded code); all these systems were written in assembly -language. We also compared Gforth with two systems written in C: -PFE-0.9.11 (compiled with @code{gcc-2.6.3} with the default -configuration for Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS}) and -ThisForth Beta (compiled with gcc-2.6.3 -O3 -fomit-frame-pointer; -ThisForth employs peephole optimization of the threaded code). We -benchmarked Gforth, PFE and ThisForth 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. +language. We also compared Gforth with three systems written in C: +PFE-0.9.14 (compiled with @code{gcc-2.6.3} with the default +configuration for Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS +-DUNROLL_NEXT}), ThisForth Beta (compiled with gcc-2.6.3 -O3 +-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 matrix multiplication come from the Stanford integer benchmarks and have been translated into Forth by Martin Fraeman; we used the versions -included in the TILE Forth package; and a recursive Fibonacci number -computation for benchmarking calling performance. The following table shows -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 systems). +included in the TILE Forth package, but with bigger data set sizes; and +a recursive Fibonacci number computation for benchmarking calling +performance. The following table shows 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 systems). @example -relative Win32- NT eforth This- -time Gforth Forth Forth eforth +opt PFE Forth -sieve 1.00 1.39 1.14 1.39 0.85 1.78 3.18 -bubble 1.00 1.33 1.43 1.51 0.89 1.70 -matmul 1.00 1.43 1.31 1.42 1.12 2.28 -fib 1.00 1.55 1.36 1.24 1.15 1.97 3.04 +relative Win32- NT eforth This- + time Gforth Forth Forth eforth +opt PFE Forth TILE +sieve 1.00 1.39 1.14 1.39 0.85 1.58 3.18 8.58 +bubble 1.00 1.31 1.41 1.48 0.88 1.50 3.88 +matmul 1.00 1.47 1.35 1.46 0.74 1.58 4.09 +fib 1.00 1.52 1.34 1.22 0.86 1.74 2.99 4.30 @end example You may find the good performance of Gforth compared with the systems @@ -3703,12 +4287,13 @@ Gforth. The speedups achieved with peeph code are quite remarkable. Adding a peephole optimizer to Gforth should cause similar speedups. -The speedup of Gforth over PFE and ThisForth can be easily explained -with the self-imposed restriction to standard C (although the measured -implementation of PFE uses a GNU C extension: global register -variables), which makes efficient threading impossible. Moreover, -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 varies widely with the version of @code{gcc} used. E.g., @code{gcc-2.5.8} @@ -3732,7 +4317,7 @@ numbers for Gforth on various machines i Known bugs are described in the file BUGS in the Gforth distribution. 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 interactive Gforth session), the machine and operating system (on Unix systems you can use @code{uname -a} to produce this information), the @@ -3752,12 +4337,18 @@ to Report Bugs, gcc.info, GNU C Manual}. @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 also -was one of Gforth's first users, in mid-1993) and Stuart Ramsden -inspired us with their continuous feedback. Lennart Benshop contributed +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. +Kleinrubatscher, Christian Pirker, Dirk Zoller, Marcel Hendrix, John +Wavrik, Barrie Stott and Marc de Groot. + +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 @@ -3773,7 +4364,7 @@ VolksForth descends from F83. It was wri Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called 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? A team led by Bill Ragsdale implemented fig-Forth on many processors in @@ -3781,12 +4372,13 @@ A team led by Bill Ragsdale implemented 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 +FORTH, Inc.'s first off-the-shelf product. It was developed 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 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 of Forth} by Elizabeth D. Rather, Donald R. Colburn and Charles