home *** CD-ROM | disk | FTP | other *** search
- From: honp9@menudo.uh.edu (Jason L. Tibbitts III)
- Subject: REVIEW: GFA BASIC v3.5
- Followup-To: comp.sys.amiga.programmer
- Keywords: programming, BASIC, compiler
- Organization: Blob Shop Programmers
- Reply-To: clcp16@vaxa.strath.ac.uk (Stewart C. Russell)
-
- GFA BASIC 3.5 is a fast BASIC interpreter, with advanced commands which
- include matrix manipulation and direct access to the Exec, Intuition, Dos,
- and Graphics libraries. The optional compiler generates code which is
- comparable in execution speed to a good C compiler.
-
-
- *** Statement of Interest ***
- I have no commercial links with any part of the GFA organisation.
- I have written several tutorial articles on GFA BASIC in Jeff
- Walker's Just Amiga Monthly (JAM) magazine, the UK's only non-games
- Amiga magazine. I have never received any incentive, financial or
- otherwise, to write about GFA BASIC; I paid cash for my GFA system.
-
-
- *** Product Preamble ***
- Product: GFA BASIC 3.5 Interpreter
- GFA BASIC 3.5 Compiler
-
- Supplier: GFA Data Media (UK) Ltd
- Box 121
- Wokingham
- Berkshire
- RG11 1FA
- England
-
- Price: Interpreter #49.95 Sterling
- Compiler #29.95 "
-
- Those hashes are pound signs, btw; ASCII doesn't support them. I have
- tried to find the suppliers outside the UK, but have received no answers
- yet. The product is advertised in Amiga World, discounted to around $85
- (for the Interpreter, I assume) and one of the advertisements suggests that
- the US distributor is Antic.
-
-
- *** Reviewer Info ***
- Stewart C. Russell
- Paper Mail Address: 140 Capelrig Road
- Newton Mearns
- Glasgow G77 6LA
- Scotland
-
- Telephone: 041-639 5372 (in UK)
-
- E-Mail: clcp16@vaxa.strath.ac.uk
- (This account should be active until July, when I graduate.)
-
- scruss@cix.compulink.co.uk
- (This is my "professional" account. I get charged for any
- international mail I receive or send, so use only as a last resort.)
-
- [Ed. note: Mr. Russel has informed me that he can forward any queries to
- Les Player, the MD of GFA Data Media (UK) Ltd. I prefer not to give
- Mr. Player's address publicly.]
-
-
-
- AmigaBASIC isn't one of the world's marvels of high speed execution. It
- also get bored with the tedium of running your programs sometimes, and
- wanders off into oblivion.
-
- The first version of GFA BASIC I saw (v3.041) was fast, but was so bug
- ridden as to be completely useless. In a way, it was like the first release
- of the Amiga's operating system; it had something special, but the bugs
- made it less than useful. And now the bugs are (mostly) gone, people
- remember it as it used to be - unstable.
-
- GFA BASIC has been long in development, originally appearing on the Atari
- ST around 1986. There is still the lingering feeling that, although the
- authors are clearly excellent programmers, they are still not 100% sure of
- the Amiga.
-
- What you get
- ------------
-
- There are at least 300 commands in GFA BASIC, ranging from bit operations
- to a file requester. Most of the inch-thick manual is given over to command
- descriptions, with very small program fragments illustrating command usage.
- There is no tutorial in the manual, and the lack of properly commented
- examples (they are commented - but in German) is worrying. The manual
- suffers from truly appalling translation in places, which can range from
- the faintly amusing to the downright misleading.
-
- The GFA BASIC 3.5 interpreter is some 135 KB in length, allowing it to run
- comfortably on a basic A500. Only one program can be edited at a time, but
- multiple interpreters can be run. When this is done, blocks of text can be
- cut from one interpreter and pasted to another.
-
- A shorter run-only interpreter is also supplied, and this may be freely
- distributed with your programs. This program only accepts tokenised GFA
- BASIC files, and consequently could never be used for program development.
-
- The Front End
- -------------
-
- The single-bitplane editor screen has two rows of ten gadgets along the
- top, with a clock and a line number indicator on the right hand side. These
- gadgets allow various file operations (Load, Save, etc) and edit operations
- (Block, Find, etc). These gadgets correspond to function and Shift-function
- key combinations.
-
- A couple of these gadgets merit special mention. The Test gadget tests the
- integrity of your program's flow control structures, and warns you of any
- problems. The Direct gadget drops you into a command line, where BASIC
- commands are executed as you type. You should be able to work out what the
- Run gadget does.
-
- The GFA editor is rather strange. It parses the input line when you press
- Return, and won't let you continue if there is a syntax error. It also does
- not allow blank lines, insisting on an apostrophe at the least. You'll hate
- it at first, but when you realise that it allows abbreviated input (p for
- PRINT, inp for INPUT) and automatically indents loop structures, you'll
- begin to like it more. Only one command is allowed per line, and line
- numbers must not be used. In line comments are allowed though, but these
- must be prefixed with an exclamation mark.
-
- Functions & Features
- --------------------
-
- GFA BASIC knows about most of the commands in the Intuition, Dos, Exec,
- Layers, Diskfont Graphics and Icon libraries, and parses them
- appropriately; typing in "a%=allocremember(...)" for example would result
- in "a%=AllocRemember(...)" being returned. (The very pedantic would also
- note that a syntax error would be returned too; ellipsis is not a valid
- input to AllocRemember()... :-) )
-
- If your favourite routines exist in another library, you can use the FD
- file to create the basis for a stub. I've already used this to create
- interfaces for the iff.library (for IFF handling) and the medplayer.library
- (for playing MED modules). In this respect, being able to call these
- library functions from an interpreted language makes GFA BASIC a great
- prototyping tool.
-
- As with most modern BASICs, GFA supports SELECT...CASE structures, and
- ELSEIF clauses in IF structures. All structures support an EXIT IF clause,
- which works similarly to "break" in C.
-
- INC, DEC, ADD, SUB, MUL and DIV manipulate variables far more quickly than
- the more usual infix operators. Bitwise operators exist which are similar
- to (when compiled, identical to) 68000 instructions.
-
- Windows and Screens are handled well, with HAM and Halfbrite as accessible
- as in any other language. All the Window/IDCMP flags are available too.
-
- Graphics commands are slightly better than AmigaBASIC's offerings; the DRAW
- command contains a full turtle graphics package, based on HPGL. A slight
- nasty is the DISPLAY command; this is a hangover from the Atari, where it's
- quite safe to switch off Display DMA. DISPLAY on the Amiga results in
- horrific flickering and all-over nastiness; avoid.
-
- Two useful hangovers from the Atari are ALERT and FILESELECT. ALERT creates
- a small requester similar to the GEM Dialog box, and nothing like as
- frightening as an Intuition red Alert(). FILESELECT creates a usable file
- selector; it's not as good as the ARP one, but it works well. ALERT and
- FILESELECT are not Requesters, so they don't need a window to be attached
- to.
-
- Arrays are used in the way that BASIC originally intended; as matrices.
- Matrices can be added, subtracted, multiplied, inverted, transposed, copied
- (in whole or part, with optional transposition) and the determinant and
- rank obtained. Matrix housekeeping tasks for storing, recalling and
- printing matrices are supplied; a reasonable package.
-
- Arrays can also have members inserted, deleted or moved, so dynamic list
- handling is a possibility. Hardcoded quicksort and shellsort routines
- (fast) mean that the old bubble sort routine you've trusted since your PET
- days can finally be put out to grass.
-
- Sound handling is OK. I rarely use it though.
-
- Variable Types
- --------------
-
- The standard GFA integer is 32 bits long, unlike AmigaBASIC's sixteen which
- corresponds to GFA's Word type. The byte variable type is unique to GFA
- BASIC, being identical to C's unsigned char type. The Boolean type uses
- only one bit per entry if used in an array, or one byte otherwise.
-
- This would be fine if GFA hadn't chosen non-standard suffixes for its
- variables. A table shows the problem -
-
- Suffix
- Variable Type Microsoft GFA
- ============= ========= ===
- Boolean (not supported) !
- 8-bit Integer (not supported) |
- 16-bit Integer % &
- 32-bit Integer & %
- Single Precision FP ! (not supported)
- Double Precision FP # #
- String $ $
-
- GFA's mathematical routines use a proprietary double precision format as
- the default variable type. It is very fast (see the benchmarks later on)
- but unfortunately does not take advantage of a 68881/68882 coprocessor,
- since it was originally developed on the Atari ST.
-
- Pointers are handled quite well for a BASIC, but not with the flexibility
- of C. Memory access is enhanced too; the {...} operator can be used to read
- and write different types of variable. Thus
-
- rp%={WINDOW(0)+50} could return the address of a window's Rastport
- structure, and
-
- CHAR{attr%+8}="diamond.font" could put a zero terminated font name into
- a pre-prepared TextAttr structure.
-
- Although structures aren't directly supported, they can be fudged using
- Malloc() and the {..} operator. This is not C, after all.
-
- (In)Compatibility
- -----------------
-
- GFA BASIC is compatible with, well, only GFA BASIC I guess. ASCII files can
- be merged into the editor, and anything that isn't understood gets `==>'
- placed in front of it. Screen and window commands differ greatly from
- AmigaBASIC, but file handling and OBJECT (Bob) commands are almost
- identical. Sprites, however, merit a separate command.
-
- Major differences between Amiga and GFA BASIC include -
-
- - "IF...THEN...END IF" is written "IF...ENDIF" (THEN being optional).
-
- - "GOSUB name" branches to "PROCEDURE name". Subroutines can have
- parameters, and can be recursive; SUB...STATIC does not exist.
- Procedures can be folded down to one line by hitting the Help key.
-
- - "DEF FNname(a,b)" becomes "DEFFN name(a,b)". Multiline recursive
- functions can be defined using FUNCTION, and can be folded using the
- Help key. Functions can be voided using "VOID func" or "~func".
-
- - Menu and Interrupt handling is wildly different, and is unfortunately
- identical with the Atari ST's system, which busy waits on signals. It is
- possible, however, to interrogate IDCMP directly and Wait() on the
- message ports.
-
- If portability is an issue to you, GFA BASIC is available on the Atari ST
- and PC, though the latter is still slightly buggy. OS/2, Windows 3 and
- Unix (386) versions are said to be under development. GFA BASIC 4 should be
- with us before the third quarter of 1991, according to Les Player of GFA
- Data Media (UK).
-
- (I know of people who run the program on A3000 machines with no ill
- effects, and also on Fatter Agnus B2000s. Runs just fine on my A500 too.)
-
- The Compiler
- ------------
-
- The interpreter is fast, but if you want real speed you need the optional
- compiler. The compiler and linker run from the CLI, but a Workbench
- graphical shell is provided. Maybe it's just the way my machine is set up,
- but the GFA shell seldom works properly for me, and I always use the CLI.
-
- The compiler only reads tokenised files, and produces a standard Metacomco
- object file ready for linkage. The GFA linker "gl" is very minimal, and
- reads the GFA library and library index in a proprietary file format.
- External functions can be linked into GFA programs, and the compiler manual
- details how to do this. The GFA library is also supplied in Metacomco
- format if you wish to use a different linker.
-
- Compilation is quick; all of the benchmark test programs actually compiled
- in under two seconds. Most of the time is spent in the linker, since it has
- about 150 KB of library to wade through. All programs are compiled with
- code for Workbench and window opening; producing CLI programs requires the
- opening of a CON: (or "*") output file and using stream printing.
-
- A large amount of optimisation is done by the compiler, but a good part of
- the manual is given over to optimisations that the programmer can include
- for better performance. An example of this is integer multiplication; if
- you stick to 16-bit integers, you can set the compiler to use the 68000
- MULS instruction.
-
- Verdict
- -------
-
- I bought GFA BASIC 3.5 back in October, and have been using it on a daily
- basis since then. If I prototype something using it, it often interprets
- fast enough to do the job. If not, I compile it, and it's fast enough. If I
- really needed extra speed, I'd link in assembly language subroutines.
-
- GFA BASIC isn't bug free yet; but what large product is? The interpreter
- must be 99.5% solid, and the compiled code has never crashed on me. I trust
- it enough to be writing my undergraduate project with it.
-
- If you get C sick, take a long hard look at GFA BASIC.
-
-
- Benchmarks
- ----------
- (These are at the end since not everyone might want to read them - SCR)
-
- It's easy to say that GFA BASIC is fast, but exactly how fast can only be
- demonstrated by comparison with other languages. HiSoft (Professional)
- BASIC is a popular integrated compiler system, and is broadly compatible
- with AmigaBASIC. AmigaBASIC is packaged with every Amiga, and has the
- unique ability to run more slowly on a 16MHz 68020/68882 machine than a
- 7.1MHz 68000 machine. DICE is Matt Dillon's C compiler, noted for its rapid
- compilation and efficient executables.
-
- All times derived from the internal timer routines in each interpreter or
- compiler, and then rounded to the nearest quarter second. Default compiler
- options were used in all cases. The test machine was a 3MB A500/A590.
-
- (If you ask me very, very nicely, and I happen to be in a good mood at the
- time (and not too busy either), I can send you the actual benchmark
- sources. You'll have to give me a pretty good reason for wanting them
- though.)
-
- CALC
-
- The old CALC benchmark; 5000 loops of two multiplications and
- two divisions each. Tests floating point speed and accuracy. GFA
- uses its own 64-bit floating point format, while HiSoft and
- AmigaBASIC use single precision in this test.
- (An IEEE Double Precision CALC using Matt Dillon's DICE is given
- for comparison. Out of the four different math packages, IEEE was
- the only one to leave a residual error (of ~-5E-8). Most odd.)
-
- GFA GFA
- Interpreted Compiled HiSoft AmigaBASIC DICE
- ============================================================
-
- Run Time 5.0 3.0 3.25 16.75 6.5
- (seconds)
-
- Compile Time - 13.5 5.0 - 11.0
- (seconds)
-
- Code Size - 11184 19208 - 7592
- (bytes)
-
-
- I/O TEST
-
- A small (and not very stringent) test of my own devising. `Write'
- writes out the integers 1-10000 to a file in RAM:. `Read' reads
- them back again. `Print' tests text output by printing 1000 lines
- of 56 characters to the Workbench screen.
- (The RAM: used here is not Commodore's, but The Other Guys'
- Recoverable RAM Disk running FFS.)
-
- GFA GFA
- Interpreted Compiled HiSoft AmigaBASIC
- ==========================================================
-
- Run Time
- (seconds)
-
- Write 14.25 12.0 161.0 42.75
- Read 7.75 7.0 20.25 49.75
- Print 37.5 37.25 78.75 149.75
-
- Compile Time - 14.0 4.5 -
- (seconds)
-
- Code Size - 14496 23096 -
- (bytes)
-
-
- PCW
-
- A suite of benchmarks used many years ago by PCW Magazine to test
- machine performance when running BASIC.
-
- PCW1 - FOR k=1 TO 10000:NEXT k, with k floating point
- PCW2 - 10000 GOTOs and 10000 floating point additions
- PCW3 - Floating Point divide, multiply, add, subtract; all 10000 times
- PCW4 - Same as PCW3, but with explicit constants
- PCW5 - PCW4 plus 10000 GOSUBs
- PCW6 - PCW5 plus 10000 "FOR l=1 TO 5:NEXT l"
- PCW7 - PCW6 with an array access in the FOR...NEXT loop
- PCW8 - 10000 additions, exponentiations, LOG()s and SIN()s
-
- GFA GFA
- Interpreted Compiled HiSoft AmigaBASIC
- ==========================================================
-
- Run Time
- (seconds)
-
- PCW1 0.75 0.75 1.25 4.0
- PCW2 2.75 0.5 2.5 21.5
- PCW3 7.75 3.0 5.0 43.0
- PCW4 7.5 1.25 5.5 48.0
- PCW5 8.0 1.25 7.25 53.5
- PCW6 13.25 4.0 14.25 90.75
- PCW7 21.5 6.5 23.75 140.75
- PCW8 34.25 29.5 20.75 179.75
-
- Average 12.0 5.75 10.0 72.75
-
- Compile Time - 16.0 6.5 -
- (seconds)
-
- Code Size - 15272 22944 -
- (bytes)
-
-
- SIEVE
-
- The Sieve of Eratosthenes with 5 loops of 7000 short integers each.
- (The DICE benchmark is a slightly different program to the BASIC
- ones, which used GOTO liberally. The result is the same, though.)
-
- GFA GFA
- Interpreted Compiled HiSoft AmigaBASIC DICE
- ============================================================
-
- Run Time 53.5 3.5 40.75 258.75 1.75
- (seconds)
-
- Compile Time - 17.0 4.5 - 11.0
- (seconds)
-
- Code Size - 11256 19256 - 5732
- (bytes)
-
- %*%* end *%*%
-
- --
- |Stewart C. Russell | University of Strathclyde, Glasgow, Scotland, UK|
- |clcp16@vaxa.strath.ac.uk | (opinions my own, not theirs) |
- | Also known as scruss@cix.compulink.co.uk |
- | "Beauty is truth, truth beauty" - Keats |
- | "You lying get!" - The Living Carpets, Vic Reeves Big Night Out |
-
-