| 1 |
Perl Compiler Kit, Version alpha4 |
| 2 |
|
| 3 |
Copyright (c) 1996, 1997, Malcolm Beattie |
| 4 |
|
| 5 |
This program is free software; you can redistribute it and/or modify |
| 6 |
it under the terms of either: |
| 7 |
|
| 8 |
a) the GNU General Public License as published by the Free |
| 9 |
Software Foundation; either version 1, or (at your option) any |
| 10 |
later version, or |
| 11 |
|
| 12 |
b) the "Artistic License" which comes with this kit. |
| 13 |
|
| 14 |
This program is distributed in the hope that it will be useful, |
| 15 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either |
| 17 |
the GNU General Public License or the Artistic License for more details. |
| 18 |
|
| 19 |
You should have received a copy of the Artistic License with this kit, |
| 20 |
in the file named "Artistic". If not, you can get one from the Perl |
| 21 |
distribution. You should also have received a copy of the GNU General |
| 22 |
Public License, in the file named "Copying". If not, you can get one |
| 23 |
from the Perl distribution or else write to the Free Software Foundation, |
| 24 |
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. |
| 25 |
|
| 26 |
CHANGES |
| 27 |
|
| 28 |
New since alpha3 |
| 29 |
Anonymous subs work properly with C and CC. |
| 30 |
Heuristics for forcing compilation of apparently unused subs/methods. |
| 31 |
Subs which use the AutoLoader module are forcibly loaded at compile-time. |
| 32 |
Slightly faster compilation. |
| 33 |
Handles slightly more complex code within a BEGIN { }. |
| 34 |
Minor bug fixes. |
| 35 |
|
| 36 |
New since alpha2 |
| 37 |
CC backend now supports ".." and s//e. |
| 38 |
Xref backend generates cross-reference reports |
| 39 |
Cleanups to fix benign but irritating "-w" warnings |
| 40 |
Minor cxstack fix |
| 41 |
New since alpha1 |
| 42 |
Working CC backend |
| 43 |
Shared globs and pre-initialised hash support |
| 44 |
Some XSUB support |
| 45 |
Assorted bug fixes |
| 46 |
|
| 47 |
INSTALLATION |
| 48 |
|
| 49 |
(1) You need perl5.002 or later. |
| 50 |
|
| 51 |
(2) If you want to compile and run programs with the C or CC backends |
| 52 |
which undefine (or redefine) subroutines, then you need to apply a |
| 53 |
one-line patch to perl itself. One or two of the programs in perl's |
| 54 |
own test suite do this. The patch is in file op.patch. It prevents |
| 55 |
perl from calling free() on OPs with the magic sequence number (U16)-1. |
| 56 |
The compiler declares all OPs as static structures and uses that magic |
| 57 |
sequence number. |
| 58 |
|
| 59 |
(3) Type |
| 60 |
perl Makefile.PL |
| 61 |
to write a personalised Makefile for your system. If you want the |
| 62 |
bytecode modules to support reading bytecode from strings (instead of |
| 63 |
just from files) then add the option |
| 64 |
-DINDIRECT_BGET_MACROS |
| 65 |
into the middle of the definition of the CCCMD macro in the Makefile. |
| 66 |
Your C compiler may need to be able to cope with Standard C for this. |
| 67 |
I haven't tested this option yet with an old pre-Standard compiler. |
| 68 |
|
| 69 |
(4) If your platform supports dynamic loading then just type |
| 70 |
make |
| 71 |
and you can then use |
| 72 |
perl -Iblib/arch -MO=foo bar |
| 73 |
to use the compiler modules (see later for details). |
| 74 |
If you need/want instead to make a statically linked perl which |
| 75 |
contains the appropriate modules, then type |
| 76 |
make perl |
| 77 |
make byteperl |
| 78 |
and you can then use |
| 79 |
./perl -MO=foo bar |
| 80 |
to use the compiler modules. |
| 81 |
In both cases, the byteperl executable is required for running standalone |
| 82 |
bytecode programs. It is *not* a standard perl+XSUB perl executable. |
| 83 |
|
| 84 |
USAGE |
| 85 |
|
| 86 |
As of the alpha3 release, the Bytecode, C and CC backends are now all |
| 87 |
functional enough to compile almost the whole of the main perl test |
| 88 |
suite. In the case of the CC backend, any failures are all due to |
| 89 |
differences and/or known bugs documented below. See the file TESTS. |
| 90 |
In the following examples, you'll need to replace "perl" by |
| 91 |
perl -Iblib/arch |
| 92 |
if you have built the extensions for a dynamic loading platform but |
| 93 |
haven't installed the extensions completely. You'll need to replace |
| 94 |
"perl" by |
| 95 |
./perl |
| 96 |
if you have built the extensions into a statically linked perl binary. |
| 97 |
|
| 98 |
(1) To compile perl program foo.pl with the C backend, do |
| 99 |
perl -MO=C,-ofoo.c foo.pl |
| 100 |
Then use the cc_harness perl program to compile the resulting C source: |
| 101 |
perl cc_harness -O2 -o foo foo.c |
| 102 |
|
| 103 |
If you are using a non-ANSI pre-Standard C compiler that can't handle |
| 104 |
pre-declaring static arrays, then add -DBROKEN_STATIC_REDECL to the |
| 105 |
options you use: |
| 106 |
perl cc_harness -O2 -o foo -DBROKEN_STATIC_REDECL foo.c |
| 107 |
If you are using a non-ANSI pre-Standard C compiler that can't handle |
| 108 |
static initialisation of structures with union members then add |
| 109 |
-DBROKEN_UNION_INIT to the options you use. If you want command line |
| 110 |
arguments passed to your executable to be interpreted by perl (e.g. -Dx) |
| 111 |
then compile foo.c with -DALLOW_PERL_OPTIONS. Otherwise, all command line |
| 112 |
arguments passed to foo will appear directly in @ARGV. The resulting |
| 113 |
executable foo is the compiled version of foo.pl. See the file NOTES for |
| 114 |
extra options you can pass to -MO=C. |
| 115 |
|
| 116 |
There are some constraints on the contents on foo.pl if you want to be |
| 117 |
able to compile it successfully. Some problems can be fixed fairly easily |
| 118 |
by altering foo.pl; some problems with the compiler are known to be |
| 119 |
straightforward to solve and I'll do so soon. The file Todo lists a |
| 120 |
number of known problems. See the XSUB section lower down for information |
| 121 |
about compiling programs which use XSUBs. |
| 122 |
|
| 123 |
(2) To compile foo.pl with the CC backend (which generates actual |
| 124 |
optimised C code for the execution path of your perl program), use |
| 125 |
perl -MO=CC,-ofoo.c foo.pl |
| 126 |
|
| 127 |
and proceed just as with the C backend. You should almost certainly |
| 128 |
use an option such as -O2 with the subsequent cc_harness invocation |
| 129 |
so that your C compiler uses optimisation. The C code generated by |
| 130 |
the Perl compiler's CC backend looks ugly to humans but is easily |
| 131 |
optimised by C compilers. |
| 132 |
|
| 133 |
To make the most of this compiler backend, you need to tell the |
| 134 |
compiler when you're using int or double variables so that it can |
| 135 |
optimise appropriately (although this part of the compiler is the most |
| 136 |
buggy). You currently do that by naming lexical variables ending in |
| 137 |
"_i" for ints, "_d" for doubles, "_ir" for int "register" variables or |
| 138 |
"_dr" for double "register" variables. Here "register" is a promise |
| 139 |
that you won't pass a reference to the variable into a sub which then |
| 140 |
modifies the variable. The compiler ought to catch attempts to use |
| 141 |
"\$i" just as C compilers catch attempts to do "&i" for a register int |
| 142 |
i but it doesn't at the moment. Bugs in the CC backend may make your |
| 143 |
program fail in mysterious ways and give wrong answers rather than just |
| 144 |
crash in boring ways. But, hey, this is an alpha release so you knew |
| 145 |
that anyway. See the XSUB section lower down for information about |
| 146 |
compiling programs which use XSUBs. |
| 147 |
|
| 148 |
If your program uses classes which define methods (or other subs which |
| 149 |
are not exported and not apparently used until runtime) then you'll |
| 150 |
need to use -u compile-time options (see the NOTES file) to force the |
| 151 |
subs to be compiled. Future releases will probably default the other |
| 152 |
way, do more auto-detection and provide more fine-grained control. |
| 153 |
|
| 154 |
Since compiled executables need linking with libperl, you may want |
| 155 |
to turn libperl.a into a shared library if your platform supports |
| 156 |
it. For example, with Digital UNIX, do something like |
| 157 |
ld -shared -o libperl.so -all libperl.a -none -lc |
| 158 |
and with Linux/ELF, rebuild the perl .c files with -fPIC (and I |
| 159 |
also suggest -fomit-frame-pointer for Linux on Intel architetcures), |
| 160 |
do "make libperl.a" and then do |
| 161 |
gcc -shared -Wl,-soname,libperl.so.5 -o libperl.so.5.3 `ar t libperl.a` |
| 162 |
and then |
| 163 |
# cp libperl.so.5.3 /usr/lib |
| 164 |
# cd /usr/lib |
| 165 |
# ln -s libperl.so.5.3 libperl.so.5 |
| 166 |
# ln -s libperl.so.5 libperl.so |
| 167 |
# ldconfig |
| 168 |
When you compile perl executables with cc_harness, append -L/usr/lib |
| 169 |
otherwise the -L for the perl source directory will override it. For |
| 170 |
example, |
| 171 |
perl -Iblib/arch -MO=CC,-O2,-ofoo3.c foo3.bench |
| 172 |
perl cc_harness -o foo3 -O2 foo3.c -L/usr/lib |
| 173 |
ls -l foo3 |
| 174 |
-rwxr-xr-x 1 mbeattie xzdg 11218 Jul 1 15:28 foo3 |
| 175 |
You'll probably also want to link your main perl executable against |
| 176 |
libperl.so; it's nice having an 11K perl executable. |
| 177 |
|
| 178 |
(3) To compile foo.pl into bytecode do |
| 179 |
perl -MO=Bytecode,-ofoo foo.pl |
| 180 |
To run the resulting bytecode file foo as a standalone program, you |
| 181 |
use the program byteperl which should have been built along with the |
| 182 |
extensions. |
| 183 |
./byteperl foo |
| 184 |
Any extra arguments are passed in as @ARGV; they are not interpreted |
| 185 |
as perl options. If you want to load chunks of bytecode into an already |
| 186 |
running perl program then use the -m option and investigate the |
| 187 |
byteload_fh and byteload_string functions exported by the B module. |
| 188 |
See the NOTES file for details of these and other options (including |
| 189 |
optimisation options and ways of getting at the intermediate "assembler" |
| 190 |
code that the Bytecode backend uses). |
| 191 |
|
| 192 |
(3) There are little Bourne shell scripts and perl programs to aid with |
| 193 |
some common operations: assemble, disassemble, run_bytecode_test, |
| 194 |
run_test, cc_harness, test_harness, test_harness_bytecode. |
| 195 |
|
| 196 |
(4) Walk the op tree in execution order printing terse info about each op |
| 197 |
perl -MO=Terse,exec foo.pl |
| 198 |
|
| 199 |
(5) Walk the op tree in syntax order printing lengthier debug info about |
| 200 |
each op. You can also append ",exec" to walk in execution order, but the |
| 201 |
formatting is designed to look nice with Terse rather than Debug. |
| 202 |
perl -MO=Debug foo.pl |
| 203 |
|
| 204 |
(6) Produce a cross-reference report of the line numbers at which all |
| 205 |
variables, subs and formats are defined and used. |
| 206 |
perl -MO=Xref foo.pl |
| 207 |
|
| 208 |
XSUBS |
| 209 |
|
| 210 |
The C and CC backends can successfully compile some perl programs which |
| 211 |
make use of XSUB extensions. [I'll add more detail to this section in a |
| 212 |
later release.] As a prerequisite, such extensions must not need to do |
| 213 |
anything in their BOOT: section which needs to be done at runtime rather |
| 214 |
than compile time. Normally, the only code in the boot_Foo() function is |
| 215 |
a list of newXS() calls which xsubpp puts there and the compiler handles |
| 216 |
saving those XS subs itself. For each XSUB used, the C and CC compiler |
| 217 |
will generate an initialiser in their C output which refers to the name |
| 218 |
of the relevant C function (XS_Foo_somesub). What is not yet automated |
| 219 |
is the necessary commands and cc command-line options (e.g. via |
| 220 |
"perl cc_harness") which link against the extension libraries. For now, |
| 221 |
you need the XSUB extension to have installed files in the right format |
| 222 |
for using as C libraries (e.g. Foo.a or Foo.so). As the Foo.so files (or |
| 223 |
your platform's version) aren't suitable for linking against, you will |
| 224 |
have to reget the extension source and rebuild it as a static extension |
| 225 |
to force the generation of a suitable Foo.a file. Then you need to make |
| 226 |
a symlink (or copy or rename) of that file into a libFoo.a suitable for |
| 227 |
cc linking. Then add the appropriate -L and -l options to your |
| 228 |
"perl cc_harness" command line to find and link against those libraries. |
| 229 |
You may also need to fix up some platform-dependent environment variable |
| 230 |
to ensure that linked-against .so files are found at runtime too. |
| 231 |
|
| 232 |
DIFFERENCES |
| 233 |
|
| 234 |
The result of running a compiled Perl program can sometimes be different |
| 235 |
from running the same program with standard perl. Think of the compiler |
| 236 |
as having a slightly different implementation of the language Perl. |
| 237 |
Unfortunately, since Perl has had a single implementation until now, |
| 238 |
there are no formal standards or documents defining what behaviour is |
| 239 |
guaranteed of Perl the language and what just "happens to work". |
| 240 |
Some of the differences below are almost impossible to change because of |
| 241 |
the way the compiler works. Others can be changed to produce "standard" |
| 242 |
perl behaviour if it's deemed proper and the resulting performance hit |
| 243 |
is accepted. I'll use "standard perl" to mean the result of running a |
| 244 |
Perl program using the perl executable from the perl distribution. |
| 245 |
I'll use "compiled Perl program" to mean running an executable produced |
| 246 |
by this compiler kit ("the compiler") with the CC backend. |
| 247 |
|
| 248 |
Loops |
| 249 |
Standard perl calculates the target of "next", "last", and "redo" |
| 250 |
at run-time. The compiler calculates the targets at compile-time. |
| 251 |
For example, the program |
| 252 |
|
| 253 |
sub skip_on_odd { next NUMBER if $_[0] % 2 } |
| 254 |
NUMBER: for ($i = 0; $i < 5; $i++) { |
| 255 |
skip_on_odd($i); |
| 256 |
print $i; |
| 257 |
} |
| 258 |
|
| 259 |
produces the output |
| 260 |
024 |
| 261 |
with standard perl but gives a compile-time error with the compiler. |
| 262 |
|
| 263 |
Context of ".." |
| 264 |
The context (scalar or array) of the ".." operator determines whether |
| 265 |
it behaves as a range or a flip/flop. Standard perl delays until |
| 266 |
runtime the decision of which context it is in but the compiler needs |
| 267 |
to know the context at compile-time. For example, |
| 268 |
@a = (4,6,1,0,0,1); |
| 269 |
sub range { (shift @a)..(shift @a) } |
| 270 |
print range(); |
| 271 |
while (@a) { print scalar(range()) } |
| 272 |
generates the output |
| 273 |
456123E0 |
| 274 |
with standard Perl but gives a compile-time error with compiled Perl. |
| 275 |
|
| 276 |
Arithmetic |
| 277 |
Compiled Perl programs use native C arithemtic much more frequently |
| 278 |
than standard perl. Operations on large numbers or on boundary |
| 279 |
cases may produce different behaviour. |
| 280 |
|
| 281 |
Deprecated features |
| 282 |
Features of standard perl such as $[ which have been deprecated |
| 283 |
in standard perl since version 5 was released have not been |
| 284 |
implemented in the compiler. |
| 285 |
|
| 286 |
Others |
| 287 |
I'll add to this list as I remember what they are. |
| 288 |
|
| 289 |
BUGS |
| 290 |
|
| 291 |
Here are some things which may cause the compiler problems. |
| 292 |
|
| 293 |
The following render the compiler useless (without serious hacking): |
| 294 |
* Use of the DATA filehandle (via __END__ or __DATA__ tokens) |
| 295 |
* Operator overloading with %OVERLOAD |
| 296 |
* The (deprecated) magic array-offset variable $[ does not work |
| 297 |
* The following operators are not yet implemented for CC |
| 298 |
goto |
| 299 |
sort with a non-default comparison (i.e. a named sub or inline block) |
| 300 |
* You can't use "last" to exit from a non-loop block. |
| 301 |
|
| 302 |
The following may give significant problems: |
| 303 |
* BEGIN blocks containing complex initialisation code |
| 304 |
* Code which is only ever referred to at runtime (e.g. via eval "..." or |
| 305 |
via method calls): see the -u option for the C and CC backends. |
| 306 |
* Run-time lookups of lexical variables in "outside" closures |
| 307 |
|
| 308 |
The following may cause problems (not thoroughly tested): |
| 309 |
* Dependencies on whether values of some "magic" Perl variables are |
| 310 |
determined at compile-time or runtime. |
| 311 |
* For the C and CC backends: compile-time strings which are longer than |
| 312 |
your C compiler can cope with in a single line or definition. |
| 313 |
* Reliance on intimate details of global destruction |
| 314 |
* For the Bytecode backend: high -On optimisation numbers with code |
| 315 |
that has complex flow of control. |
| 316 |
* Any "-w" option in the first line of your perl program is seen and |
| 317 |
acted on by perl itself before the compiler starts. The compiler |
| 318 |
itself then runs with warnings turned on. This may cause perl to |
| 319 |
print out warnings about the compiler itself since I haven't tested |
| 320 |
it thoroughly with warnings turned on. |
| 321 |
|
| 322 |
There is a terser but more complete list in the Todo file. |
| 323 |
|
| 324 |
Malcolm Beattie |
| 325 |
2 September 1996 |