'Game Oriented Assembly Lisp' (or 'GOAL') is a computer game programming language developed by
Andy Gavin and the
Jak and Daxter team at
Naughty Dog. It was written using
Allegro Common Lisp and used in the development of the entire
Jak and Daxter series of games.
Syntactically GOAL resembles
Scheme, though with many idiosyncratic features inspired by other languages such as classes, inheritance, and virtual functions. An example of what GOAL code looks like can be found at
[1]. GOAL encourages an
imperative programming style: programs tend to be comprised of sequence of events to be executed rather than the
functional programming style of functions to be evaluated recursively. This is a diversion from
Scheme, which allows such
side-effects but does not encourage imperative style.
Like many modern implementations of Common
Lisp, GOAL does not run in an interpreter, but instead is compiled directly into
PlayStation 2 machine code for execution. It offers limited facilities for
garbage collection, relying extensively on runtime support. It offers dynamic memory allocation primitives designed to make it well-suited to running in constant memory on a video game console. GOAL has extensive support for
inlined assembly code using a special
rlet form
[2], allowing programmers to freely mix assembly and higher-level constructs within the same function.
The GOAL compiler is implemented in
Allegro Common Lisp. It supports a long term compiling listener session which gives the compiler knowledge about the state of the compiled and therefore running program, including the symbol table. This, in addition to dynamic linking, allows a function to be edited, recompiled, uploaded, and inserted into a running game without having to restart. The process is similar to the "edit and continue" feature offered by some
C++ compilers, but allows the programmer to replace arbitrary amounts of code (even up to entire object files), and does not interrupt the running game with the debugger. This feature was used to implement code as well as level streaming in the
Jak and Daxter games.
GOAL's first use was for the original
Jak and Daxter PS2 game; the predecessor language, GOOL, was also developed by Andy Gavin for
Crash Bandicoot.
External links
★ http://www.franz.com/success/customer_apps/animation_graphics/naughtydog.lhtml — Franz Inc. success story
★ http://bc.tech.coop/blog/060118.html — Page about LISP developments by
Paul Graham and
Naughty Dog
★ http://www.gamasutra.com/features/gdcarchive/2003/White_Stephen.ppt — (Powerpoint) ''Jak & Daxter: The Precursor Legacy'', development overview, lessons learned, very interesting
★ http://www.gamasutra.com/features/gdcarchive/2003/Denman_Stu.ppt — (Powerpoint) ''Highly detailed continuous worlds'', about the streaming world loader