NAME¶
sick - Compiler for CLC-INTERCAL
SYNOPSIS¶
sick [options]
files...
DESCRIPTION¶
sick is the main development environment for CLC-INTERCAL. If files are
specified, these will be compiled using the options in effect at the point
where they appear on the command line, and they are compiled to objects (if
they are not already object). After all the options have been processed, the
program enters interactive mode, unless otherwise specified.
The program will be compiled using a compiler selected using command line
options; if nothing is selected, the compiler depends on the file suffix:
- CLC-INTERCAL program source
- These files must have suffix .i or .clci.
These will be prefixed, by default, with the compiler object
sick.io.
- CLC-INTERCAL compiler source
- These files must have suffix .iacc. These will be
prefixed, by default, with the compiler object iacc.io and produce
a compiler object (which can be executed as a program, but will do nothing
- it's only useful as a preload before compiling from source).
- C-INTERCAL program source
- These have suffix .ci and will be prefixed with the
compiler object ick.io.
- CLC-INTERCAL assembler source
- These have suffix .iasm and will be prefixed with
the compiler object asm.io.
- Traditional INTERCAL program source
- These will have suffix .1972 and will be prefixed
with the compiler object 1972.io
- Compiler extensions
- Suffixes .i, .ci, .clci and
.iasm can contain a list of letters and numbers between the spot (
.) and the rest of the suffix; these select compiler extensions to
be added.
- Base
- Numbers between 2 and 7 change the default
base by loading compiler objects 2.io to 7.io.
- Bitwise Divide
- Letter d in the suffix adds the compiler object
bitwise-divide.io, which changes the normal unary divide operation
to use bitwise, rather than arithmetic, shifts. It can be used with
sick or iasm but not with ick.
- COME FROM gerund
- Letter g in the suffix adds the compiler object
come-from-gerund.io, which enables the COME FROM gerund statements;
since ick does not parse such statements, this letter can only be
used with sick or iasm.
- Computed labels
- Letter l in the suffix adds the compiler object
computed-labels.io, which adds grammar rules to parse computed
statement labels; this can be used only with sick.
- NEXT
- Letter n in the suffix adds the compiler object
next.io, which enables the NEXT statement in sick; since
ick enables this by default, this letter can only be used with
sick.
- INTERcal NETworking
- Letter r in the suffix adds the compiler object
internet.io, which adds syntax for the STEAL, SMUGGLE
and CASE statements; it can be used with ick or
sick.
- System call
- Letter s in the suffix adds the compiler object
syscall.io, which hides a "PLEASE NEXT FROM (666)" in a
dark corner of your operating system.
- Threaded program
- Letter t in the suffix selects threaded mode by
loading compiler object thick.io. This also changes the default
compiler to ick if the suffix is .i: to use sick one
would use .tclci.
- Wimp mode
- Letter w in the suffix adds the compiler object
wimp.io, which causes the program to start in wimp mode when it is
executed. An equivalent result can be obtained by passing the
--wimp option to the executable program.
The actual list of suffixes recognised can be changed by editing the file
system,sickrc or
.sickrc. See the option
--rcfile for a
discussion on how and where
sick finds these files, and sickrc for a
description of the file format.
If a preload file is specified on the command line, the defaults derived from
the suffix are not used. It is also possible to use default preloads from a
different file suffix by explicitely saying
-suffix=
S - in this
case, the compiler acts as if the file had name
name.S
In addition, compiler objects are always recognised, with whatever suffix. These
bypass the first compiler pass and jump directly to the runtime
(just-too-late) compiler. However, if the optimiser has been selected when
these objects were compiled, and there are no postprocessor statements, the
just-too-late compiler will be automatically replaced by a more traditional
"compile-time" compiler. If this is confusing, wait until you see
the rest.
If a file is specified without suffix, and there is a compiler object in the
include path with the same name and suffix
.io, the suffix is
automatically added, whether you wanted it or now.
As soon as each program is written into
sick, a pre-compiler will produce
an internal compiler object. If
sick enters interactive mode, these
objects will be available in memory for single-stepping, running, or just
ignoring completely and getting on with the real work.
If
sick loads all the required programs and objects successfully, but
does not enter interactive mode, any program source is read back out to disk
in object format, using the same file name with the suffix replaced by
.io if no output file is specified. If a backend is specified in the
command line before a program is loaded,
sick will produce an
executable via that backend instead of an object.
The compiler accepts several options, some of which are documented here. Options
and files can be mixed in any order, each file is loaded and compiled using
whatever options precedes it on the command line. For example:
sick --verbose --optimise prog1.i --quiet prog2.i --batch
will tell you everything about compiling
prog1.i but not about
prog2.i. Both programs will be optimised. On the other hand:
sick --optimise prog1.i --nooptimise prog2.i --batch
will optimise
prog1.i but not
prog2.i.
All options can be "undone" (sometimes it's even clear how) except
--include which applies to all objects loaded after it, and
--rcfile which applies to all objects, even the ones loaded before it
(just to be different).
User Interface Options
- -X / --graphic
- Enters X-based graphical user interface. Requires Perl-GTK.
This is the default if Perl-GTK is installed, the environment variable
$DISPLAY is set and the opening of the X display succeeds.
- -c / --curses
- Enters full screen, curses-based interface. This is the
default if the X based interface cannot be started, the environment
variable $TERM is set and the terminal name is known.
- --line
- Enters the line-mode user interface. This is the default if
the X based and the curses based interfaces do not work.
- --batch
- Avoids entering interactive mode. This is the default if
the standard input and output are not connected to a terminal and the X
based interface cannot be started.
- -itype / --interface=type
- Selects the user interface type. Currently, only
X, Curses, Line and None are defined, but more
can be installed as compiler plug-ins. If the interface selected is
None, sick will work in batch mode. In addition, an empty
string will reinstate the default behaviour.
Source Character Set Options
- -a / --ascii
- Assumes that program source is in ASCII.
- -b / --baudot
- Assumes that program source is in Baudot.
- -e / --ebcdic
- Assumes that program source is in EBCDIC.
- -h / --hollerith
- Assumes that program source is in Hollerith.
- -g / --guess
- Does not make assumptions about the source character set.
If the character set cannot be guessed, will produce an error. This is the
default.
- --charset=name
- Assumes that program source is in the given character sets.
Valid values are currently ASCII, Baudot, EBCDIC,
Hollerith; an empty name is equivalent to specifying option
--guess).
Code Generation Options
- -O / --optimise
- Invokes the optimiser. This is a letter o, not a zero. This
will cause the extra object optimise.io to be prefixed after the
last compiler and before the real program. The program is then executed:
when the optimiser takes control, it will force compilation of the rest of
the program (thereby executing the compiler at compile-time, instead of
runtime as it normally does), and the resulting object is checkpointed, so
the next time it will automatically skip the initialisation and
compilation stages. In addition, the "optimise" register is set,
instructing the compiler to invoke the optimiser when it runs.
If you specify -O and -poptimise (see below), you are asking
for trouble, so don't do that.
- --nooptimise
- Disables automatic preloading and execution of
optimise.io.
- -oname / --output=name
- Selects a name for the output file. Some character
sequences are recognised inside name: %p will be replaced by
the source program's basename; %s will be replaced by the
appropriate suffix for the selected backend, %o will provide the
original file name specified on the command line, without suffix (this can
differ from %s because %s can be prefixed with a directory
from the search path) and %% will produce a single %.
The default is %p.%s, which produces the object name described at the
beginning of this document. A suffix is not automatically added if the
output name does not contain %s; this might be useful in
ocnjunction with the Perl backend to produce a file without a
suffix, for example:
sick --output=%p --backend=Perl sourcefile.i
will compile sourcefile.i and produce perl script sourcefile.
If the output file is specified as an empty string, the code generation step
will never be done.
- -nname / --name=name
- Sets the program's name, if the code generator
requires it (currently, no backends use a name, but some of the planned
ones will). The default is %o. The same %-escapes as defined for
the output file name are defined.
- -lname / --backend=name
- Selects a different compiler back end. The default is
Object, which produces a compiler object (suffix .io). The
distribution also includes a Perl backend, which produces an
executable Perl program (suffix .pl). In addition, the pseudo
backend Run will run the program instead of writing any object. In
this case, the output file name is ignored. Note that the program will
only run if the compiler is in batch mode. Other back ends can be provided
as compiler plug ins. The distribution also contains a ListObject
backend, which does not produce executables but object listings. A future
version might allow to "compile" the output of the
ListObject back end, but this is currently impossible because not
all the internal state of the object is provided, only the part which is
likely to be useful to a human reader.
- --bug=number
- Selects a different probability for the compiler bug. The
compiler bug is implemented by initialising the compiler's state with the
required probability: when a statement is compiled (usually at runtime), a
"BUG" instruction is emitted with the required probability. The
default is 1%.
- --ubug=number
- Selects a probability for the unexplainable compiler bug.
This is the compiler bug which occurs when the probability of a
(explainable) compiler bug is zero. Only wimps would use this option. The
default is 0.01%.
- -pname / --preload=name
- Selects a compiler object to prefix to the program. If this
option is specified, the compiler won't automatically prefix objects as
suggested by the suffix. The program 'oo, ick' included in previous
version of CLC-INTERCAL used option -p to select a parser. Since
the main use of preloads is to select an alternative (runtime) compiler,
it is felt that it is appropriate to keep the same letter for this option.
The file name specified does not include the suffix .io, which is
always added. The file must be a compiler object, not source code.
The special object optimise should always loaded via -O. Using
-poptimise will not necessarily put the object in the correct
place, and will not instruct the precompiler to do whatever magic it needs
to do to bootstrap the optimiser.
To completely disable preloading (this is only done when compiling the
optimiser, which is used to compile itself) use an empty string.
- --nopreload
- Resets the default behaviour of selecting preloads based on
suffixes.
- --suffix=suffix
- Specifies a suffix to use when selecting preloads. If this
option is not specified, the suffix is taken from the file name to be
compiled.
- -Ipath / --include=path
- Adds a directory before the standard search path for
compiler objects and source code. If a file is accessible from the current
directory, it is never searched in any include path.
If this option is repeated, the given paths will be searched in the order
given, followed by the standard paths.
Misc Options
- -rname / --rcfile=name
- Executes commands from file name before entering
interactive mode. This option can be repeated, to execute more than one
file. If it is not specified, the standard library, the current directory,
and the current user's home directory are searched for files with name
system.sickrc or .sickrc, which are then executed. The order
for this search is: specified library ( --include), system library,
home directory, current directory. This is different from the search order
used when looking for objects or source code. If a directory contains both
.sickrc and system.sickrc, the system.sickrc is
executed first, followed by .sickrc. Also note that if the current
directory or the home directory appear in the search path and contain one
of these files, they will be executed twice.
If filenames are explicitely specified, they must be fully qualified: the
search path is not used to find them.
- --nouserrc
- Prevents loading a user rcfile (.sickrc); also limits
loading of system.sickrc to the first one found. This option is normally
only used during installation, to prevent interference from previous
versions of CLC-INTERCAL.
- -v / --verbose
- Tells everything it's doing (on Standard Error).
- --stdverb=file
- Sends verbose output to file.
- --trace
- Enables tracing; if compiling from source, the compiler is
also traced; to trace a program, compile it to an object and then run it
with --trace.
- --stdtrace=file
- Enables tracing and selects an output file for the trace
information.
- --notrace
- Disables tracing; preloading trace.io has priority
over this option.
- -q / --quiet
- Stop talking to Standard Error.
- --times
- Prints a summary of the time take for each major action.
This setting is independent of --verbose.
- --notimes
- Does not print execution times: this is the default.
- --rclist
- Prints the names of all rcfiles found. It prevents starting
interactive mode. For example, the following command (which should work
with any Unix shell) opens all the system and user sickrc files in
your favourite editor:
sh -c '"${EDITOR:-vi}" "`sick --rclist`"'
This can be useful to update the defaults.
BUGS¶
There are more options than
ls(1). This is construed to be a feature.
SEE ALSO¶
The INTERCAL on-line documentation, by entering
sick's interactive mode
and finding the "help" menu (X), key (Curses) or command
(Line).