- Documentation
- Reference manual
- Overview
- Getting started quickly
- The user's initialisation file
- Initialisation files and goals
- Command line options
- GNU Emacs Interface
- Online Help
- Command line history
- Reuse of top-level bindings
- Overview of the Debugger
- Compilation
- Environment Control (Prolog flags)
- An overview of hook predicates
- Automatic loading of libraries
- Packs: community add-ons
- Garbage Collection
- The SWI-Prolog syntax
- Rational trees (cyclic terms)
- Just-in-time clause indexing
- Wide character support
- System limits
- SWI-Prolog and 64-bit machines
- Overview
- Packages
- Reference manual
2.10 Compilation
2.10.1 During program development
During program development, programs are normally loaded using the
list abbreviation (?- [load].
). It is common practice to
organise a project as a collection of source files and a load file,
a Prolog file containing only use_module/[1,2]
or ensure_loaded/1
directives, possibly with a definition of the entry point of
the program, the predicate that is normally used to start the program.
This file is often called load.pl
. If the entry point is
called
go, a typical session starts as:
% swipl <banner> 1 ?- [load]. <compilation messages> true. 2 ?- go. <program interaction>
When using Windows, the user may open load.pl
from the
Windows explorer, which will cause swipl-win.exe to be started in
the directory holding load.pl
. Prolog loads load.pl
before entering the top level. If Prolog is started from an interactive
shell, one may choose the type swipl -s load.pl
.
2.10.2 For running the result
There are various options if you want to make your program ready for real usage. The best choice depends on whether the program is to be used only on machines holding the SWI-Prolog development system, the size of the program, and the operating system (Unix vs. Windows).
2.10.2.1 Using PrologScript
A Prolog source file can be used directly as a Unix program using the
Unix #!
magic start. The Unix #!
magic is
allowed because if the first letter of a Prolog file is #
,
the first line is treated as a comment.13The #
-sign
can be the legal start of a normal Prolog clause. In the unlikely case
this is required, leave the first line blank or add a header comment.
To create a Prolog script, use one of the two alternatives below as
first line. The first can be used to bind a script to a specific Prolog
installation, while the latter uses the default prolog installed in $PATH
.
#!/path/to/swipl #!/usr/bin/env swipl
The interpretation of arguments to the executable in the
HashBang line differs between Unix-derived systems. For
portability, the #!
must be followed immediately with an
absolute path to the executable and should have none or one argument.
Neither the executable path, nor the argument shall use quotes or
spaces. When started this way, the Prolog flag argv
contains the command line arguments that follow the script invocation.
Starting with version 7.5.8, initialization/2
support the When options program
and main
,
allowing for the following definition of a Prolog script that evaluates
an arithmetic expression on the command line. Note that main/0
is defined lib the library
library(main)
. It calls main/1
with the command line arguments after disabling signal handling.
#!/usr/bin/env swipl :- initialization(main, main). main(Argv) :- concat_atom(Argv, ' ', SingleArg), term_to_atom(Term, SingleArg), Val is Term, format('~w~n', [Val]).
And here are two example runs:
% ./eval 1+2 3 % ./eval foo ERROR: is/2: Arithmetic: `foo/0' is not a function
Prolog script may be lauched for debugging or inspection purposes
using the -l or -t. For example,
-l merely loads the script, ignoring main
and
program
initialization.
swipl -l eval 1+1 <banner> ?- main. 2 true. ?-
We can also force the program to enter the interactive toplevel after
the application is completed using -t prolog
:
swipl -t prolog eval 1+1 2 ?-
The Windows version simply ignores the #!
line.14Older
versions extracted command line arguments from the HashBang
line. As of version 5.9 all relevant setup can be achieved using directives.
Due to the compatibility issues around HashBang line
processing, we decided to remove it completely.
2.10.2.2 Creating a shell script
With the introduction of PrologScript (see section 2.10.2.1), using shell scripts as explained in this section has become redundant for most applications.
Especially on Unix systems and not-too-large applications, writing a shell script that simply loads your application and calls the entry point is often a good choice. A skeleton for the script is given below, followed by the Prolog code to obtain the program arguments.
#!/bin/sh base=<absolute-path-to-source> PL=swipl exec $PL -q -f "$base/load" --
:- initialization go. go :- current_prolog_flag(argv, Arguments), go(Arguments). go(Args) :- ...
On Windows systems, similar behaviour can be achieved by creating a
shortcut to Prolog, passing the proper options or writing a .bat
file.
2.10.2.3 Creating a saved state
For larger programs, as well as for programs that are required to run on systems that do not have the SWI-Prolog development system installed, creating a saved state is the best solution. A saved state is created using qsave_program/[1,2] or the -c command line option. A saved state is a file containing machine-independent15The saved state does not depend on the CPU instruction set or endianness. Saved states for 32- and 64-bits are not compatible. Typically, saved states only run on the same version of Prolog on which they have been created. intermediate code in a format dedicated for fast loading. Optionally, the emulator may be integrated in the saved state, creating a single file, but machine-dependent, executable. This process is described in chapter 12.
2.10.2.4 Compilation using the -c command line option
This mechanism loads a series of Prolog source files and then creates a saved state as qsave_program/2 does. The command syntax is:
% swipl [option ...] [-o output] -c file.pl ...
The options argument are options to qsave_program/2 written in the format below. The option names and their values are described with qsave_program/2.
--
option-name=
option-value
For example, to create a stand-alone executable that starts by
executing main/0 and for which the source is loaded through
load.pl
, use the command
% swipl --goal=main --stand_alone=true -o myprog -c load.pl
This performs exactly the same as executing
% swipl <banner> ?- [load]. ?- qsave_program(myprog, [ goal(main), stand_alone(true) ]). ?- halt.