next up previous contents index
Next: Limitations of qsave_program Up: < Previous: Compatibility of the Foreign   Contents   Index


Generating Runtime Applications

This chapter describes the features of SWI-Prolog for delivering applications that can run without the development version of the system installed.

A SWI-Prolog runtime executable is a file consisting of two parts. The first part is the emulator, which is machine dependent. The second part is the resource archive, which contains the compiled program in a machine-independent format, startup options and possibly user-defined resources, see resource3 and open_resource3.

These two parts can be connected in various different ways. The most common way for distributed runtime applications is to concatenate the two parts. This can be achieved using external commands (Unix: cat, Windows: copy), or using the stand_alone option to qsave_program2. The second option is to attach a startup script in front of the resource that starts the emulator with the proper options. This is the default under Unix. Finally, an emulator can be told to use a specified resource file using the -x commandline switch.

qsave_program2+File, +ListOfOptions Saves the current state of the program to the file File. The result is a resource archive containing a saved-state that expresses all Prolog data from the running program and all user-defined resources. Depending on the stand_alone option, the resource is headed by the emulator, a Unix shell-script or nothing.

ListOfOptions is a list of $\bnfmeta{Key} = \bnfmeta{Value}$ or $\bnfmeta{Key}(\bnfmeta{Value})$ pairs. The available keys are described in qsave-options.


Table: Key = Value pairs for qsave_program2
Key Option Type Description
local -L K-bytes Size (Limit) of local stack
global -G K-bytes Size (Limit) of global stack
trail -T K-bytes Size (Limit) of trail stack
argument -A K-bytes Size (Limit) of argument stack
goal -g atom Initialisation goal
toplevel -t atom Prolog toplevel goal
init_file -f atom Personal initialisation file
class   atom If runtime, only read resources from the state (default). If kernel, lock all predicates as system predicates If development, save the predicates in their current state and keep reading resources from their source (if present). See also resource3.
autoload   bool If true, run autoload0 first
map   file File to write info on dump
op   save/standard Save operator declarations?
stand_alone   bool Include the emulator in the state
emulator   file Emulator attached to the (stand-alone) executable. Default is the running emulator.


Before writing the data to file, qsave_program2 will run autoload0 to all required autoloading the system can discover. See autoload0.

Provided the application does not require any of the Prolog libraries to be loaded at runtime, the only file from the SWI-Prolog development environment required is the emulator itself. The emulator may be built in two flavours. The default is the development emulator. The runtime emulator is similar, but lacks the tracer.

If the option stand_alone(on) is present, the emulator is the first part of the state. If the emulator is started it will test whether a boot-file (state) is attached to the emulator itself and load this state. Provided the application has all libraries loaded, the resulting executable is completely independent of the runtime environment or location where it was build.

See also cmdlinecomp.

qsave_program1+File Equivalent to qsave_program(File, []).

autoload0 Check the current Prolog program for predicates that are referred to, are undefined and have a definition in the Prolog library. Load the appropriate libraries.

This predicate is used by qsave_program[1,2] to ensure the saved state will not depend on one of the libraries. The predicate autoload0 will find all direct references to predicates. It does not find predicates referenced via meta-predicates. The predicate log/2 is defined in the library(quintus) to provide a quintus compatible means to compute the natural logarithm of a number. The following program will behave correctly if its state is executed in an environment where the library(quintus) is not available:


\begin{code}
logtable(From, To) :-
From > To, !.
logtable(From, To) :-
log(Fro...
...'~d~t~8\vert~2f~n', [From, Value]),
F is From + 1,
logtable(F, To).
\end{code}

However, the following implementation refers to log/2 through the meta-predicate maplist3. Autoload will not be able to find the reference. This problem may be fixed either by loading the module libtary(quintus) explicitly or use require1 to tell the system that the predicate log/2 is required by this module.


\begin{code}
logtable(From, To) :-
findall(X, between(From, To, X), Xlist),
ma...
...rt VT]) :-
format('~d~t~8\vert~2f~n', [I, V]),
write_table(IT, VT).
\end{code}

volatile+Name/Arity, ... Declare that the clauses of specified predicates should not be saved to the program. The volatile declaration is normally used to avoid that the clauses of dynamic predicates that represent data for the current session is saved in the state file.



Subsections
next up previous contents index
Next: Limitations of qsave_program Up: < Previous: Compatibility of the Foreign   Contents   Index
Dr. Richard Botting 2001-12-12