[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
How to implement partly-system-dependent mostly-portable code?
- To: COMMON-LISP%SU-AI@SCORE
- Subject: How to implement partly-system-dependent mostly-portable code?
- From: Rem@IMSSS
- Date: Tue, 20 Nov 1984 16:41:00 -0000
When writing code that will run on many systems, with most of the code
portable but a small part different on various systems, there comes
the problem of how to organise the various files that contain the
various parts of the code and how to link the portable code with the
system-dependent code. I'm wrestling with this currently in PSL, and
would be interested in hearing how Common LISP implementors did it, as
well as ideas from others. My ideas are below ("existing code" refers to
my IMSSS softare that is presently being ported to CMS and will soon
also be ported to other machines).
(1) The way my existing code does it, namely have all versions in the
source an all versions compiled, but at runtime a global
variable chooses each time which piece of code to execute
[advanges: simple;
disadvantages: confuses FCHECK; requires global variable at
runtime; takes a lot more memory at runtime; takes some more
time to execute each time; compilation takes much longer since
it has to compile everything for every machine every time]
(2) The same except using macros to select which body of code to compile
[advantages: minimum runtime memory; minimum runtime CPU time;
disadvantages: still requires versions of source for all systems
around when compiling for any system, thus taking longer to
read it in and slightly longer to select correct version to
compile; requires the macro to know what the target machine
will be, something I'm not sure the cross-compiler maks
available to user macros]
(3) Keep system-dependent stuff in separate files, using funny names
such as SYSDEP-foo as the way the system-dependent stuff is
called from the portable files, keep user-callable function in
portable source files with link to SYSDEP-foo function, and with
comments indicating where the SYSDEP-foo function might be found
[advantages: minimum runtime memory; minimum runtime CPU time;
disadvantages: (a) if functions used as linkage, slightly more
CPU time (b) if macros used as linkage, you won't be able to
TRace system functions by their usual name at runtime unless the
TRace package is smart enough to map (TRace OPEN) into (TRace
SYSDEP-OPEN) for example.]
(4) Same except have user call the system-dependent functions
directly, i.e. they have advertised names rather than funny
names via vector from advertised names
[advantages: minimum runtime memory; minimum runtime CPU time;
disadvantages: confusing to maintainers since they have no idea
whether a function is in portable files or in some random
system dependent file]
-------