Just a comment
most of the startup time is not spent assigning variables, but loading and instantiating compiled functions through reflection, and serialization would probably not help much in this case. What could help is, as per Ville's idea, create a big "loader" class which references compiled function classes directly by name in its bytecode
Other java lisps define each Primitive execute as a single static function in a trampolines file. The Primitive itself just calls the static function in the trampolines ( they are named in such a way it is easy to reference the class that holds nothing but static functions).. In compiled code there is never any reason to reference the Primitive or even the Symbol that uses it. The compiled code is simply a series of static functions calling static functions
Here is an example:
http://larkc.svn.sourceforge.net/viewvc/larkc/trunk/platform/src/com/cyc/too...
notice on line 124 "bell_next_float" this is defined #'BELL-NEXT-FLOAT on line 505 as: declareFunction(myName, "bell_next_float", "BELL_NEXT-FLOAT", 1, 0, false); the 1-0-false means require 1 required arg.. 0 optiona args.. and donent allow &rest
Now whenever code is going to use #'BELL-NEXT-FLOAT It knows it can INVOKE-STATIC "com.cyc.tool.subl.jrtl.translatedCode.sublisp.math_utilities" "bell_next_float" consuming one stack arg.