Mercurial > hg > xemacs-beta
comparison man/lispref/compile.texi @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | abe6d1db359e |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
1 @c -*-texinfo-*- | |
2 @c This is part of the XEmacs Lisp Reference Manual. | |
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. | |
4 @c See the file lispref.texi for copying conditions. | |
5 @setfilename ../../info/compile.info | |
6 @node Byte Compilation, Debugging, Loading, Top | |
7 @chapter Byte Compilation | |
8 @cindex byte-code | |
9 @cindex compilation | |
10 | |
11 XEmacs Lisp has a @dfn{compiler} that translates functions written | |
12 in Lisp into a special representation called @dfn{byte-code} that can be | |
13 executed more efficiently. The compiler replaces Lisp function | |
14 definitions with byte-code. When a byte-coded function is called, its | |
15 definition is evaluated by the @dfn{byte-code interpreter}. | |
16 | |
17 Because the byte-compiled code is evaluated by the byte-code | |
18 interpreter, instead of being executed directly by the machine's | |
19 hardware (as true compiled code is), byte-code is completely | |
20 transportable from machine to machine without recompilation. It is not, | |
21 however, as fast as true compiled code. | |
22 | |
23 In general, any version of Emacs can run byte-compiled code produced | |
24 by recent earlier versions of Emacs, but the reverse is not true. In | |
25 particular, if you compile a program with XEmacs 20, the compiled code | |
26 may not run in earlier versions. | |
27 | |
28 The first time a compiled-function object is executed, the byte-code | |
29 instructions are validated and the byte-code is further optimized. An | |
30 @code{invalid-byte-code} error is signaled if the byte-code is invalid, | |
31 for example if it contains invalid opcodes. This usually means a bug in | |
32 the byte compiler. | |
33 | |
34 @iftex | |
35 @xref{Docs and Compilation}. | |
36 @end iftex | |
37 | |
38 @xref{Compilation Errors}, for how to investigate errors occurring in | |
39 byte compilation. | |
40 | |
41 @menu | |
42 * Speed of Byte-Code:: An example of speedup from byte compilation. | |
43 * Compilation Functions:: Byte compilation functions. | |
44 * Docs and Compilation:: Dynamic loading of documentation strings. | |
45 * Dynamic Loading:: Dynamic loading of individual functions. | |
46 * Eval During Compile:: Code to be evaluated when you compile. | |
47 * Compiled-Function Objects:: The data type used for byte-compiled functions. | |
48 * Disassembly:: Disassembling byte-code; how to read byte-code. | |
49 @end menu | |
50 | |
51 @node Speed of Byte-Code | |
52 @section Performance of Byte-Compiled Code | |
53 | |
54 A byte-compiled function is not as efficient as a primitive function | |
55 written in C, but runs much faster than the version written in Lisp. | |
56 Here is an example: | |
57 | |
58 @example | |
59 @group | |
60 (defun silly-loop (n) | |
61 "Return time before and after N iterations of a loop." | |
62 (let ((t1 (current-time-string))) | |
63 (while (> (setq n (1- n)) | |
64 0)) | |
65 (list t1 (current-time-string)))) | |
66 @result{} silly-loop | |
67 @end group | |
68 | |
69 @group | |
70 (silly-loop 5000000) | |
71 @result{} ("Mon Sep 14 15:51:49 1998" | |
72 "Mon Sep 14 15:52:07 1998") ; @r{18 seconds} | |
73 @end group | |
74 | |
75 @group | |
76 (byte-compile 'silly-loop) | |
77 @result{} #<compiled-function | |
78 (n) | |
79 "...(23)" | |
80 [current-time-string t1 n 0] | |
81 2 | |
82 "Return time before and after N iterations of a loop."> | |
83 @end group | |
84 | |
85 @group | |
86 (silly-loop 5000000) | |
87 @result{} ("Mon Sep 14 15:53:43 1998" | |
88 "Mon Sep 14 15:53:49 1998") ; @r{6 seconds} | |
89 @end group | |
90 @end example | |
91 | |
92 In this example, the interpreted code required 18 seconds to run, | |
93 whereas the byte-compiled code required 6 seconds. These results are | |
94 representative, but actual results will vary greatly. | |
95 | |
96 @node Compilation Functions | |
97 @comment node-name, next, previous, up | |
98 @section The Compilation Functions | |
99 @cindex compilation functions | |
100 | |
101 You can byte-compile an individual function or macro definition with | |
102 the @code{byte-compile} function. You can compile a whole file with | |
103 @code{byte-compile-file}, or several files with | |
104 @code{byte-recompile-directory} or @code{batch-byte-compile}. | |
105 | |
106 When you run the byte compiler, you may get warnings in a buffer | |
107 called @samp{*Compile-Log*}. These report things in your program that | |
108 suggest a problem but are not necessarily erroneous. | |
109 | |
110 @cindex macro compilation | |
111 Be careful when byte-compiling code that uses macros. Macro calls are | |
112 expanded when they are compiled, so the macros must already be defined | |
113 for proper compilation. For more details, see @ref{Compiling Macros}. | |
114 | |
115 Normally, compiling a file does not evaluate the file's contents or | |
116 load the file. But it does execute any @code{require} calls at top | |
117 level in the file. One way to ensure that necessary macro definitions | |
118 are available during compilation is to @code{require} the file that defines | |
119 them (@pxref{Named Features}). To avoid loading the macro definition files | |
120 when someone @emph{runs} the compiled program, write | |
121 @code{eval-when-compile} around the @code{require} calls (@pxref{Eval | |
122 During Compile}). | |
123 | |
124 @defun byte-compile symbol | |
125 This function byte-compiles the function definition of @var{symbol}, | |
126 replacing the previous definition with the compiled one. The function | |
127 definition of @var{symbol} must be the actual code for the function; | |
128 i.e., the compiler does not follow indirection to another symbol. | |
129 @code{byte-compile} returns the new, compiled definition of | |
130 @var{symbol}. | |
131 | |
132 If @var{symbol}'s definition is a compiled-function object, | |
133 @code{byte-compile} does nothing and returns @code{nil}. Lisp records | |
134 only one function definition for any symbol, and if that is already | |
135 compiled, non-compiled code is not available anywhere. So there is no | |
136 way to ``compile the same definition again.'' | |
137 | |
138 @example | |
139 @group | |
140 (defun factorial (integer) | |
141 "Compute factorial of INTEGER." | |
142 (if (= 1 integer) 1 | |
143 (* integer (factorial (1- integer))))) | |
144 @result{} factorial | |
145 @end group | |
146 | |
147 @group | |
148 (byte-compile 'factorial) | |
149 @result{} #<compiled-function | |
150 (integer) | |
151 "...(21)" | |
152 [integer 1 factorial] | |
153 3 | |
154 "Compute factorial of INTEGER."> | |
155 @end group | |
156 @end example | |
157 | |
158 @noindent | |
159 The result is a compiled-function object. The string it contains is | |
160 the actual byte-code; each character in it is an instruction or an | |
161 operand of an instruction. The vector contains all the constants, | |
162 variable names and function names used by the function, except for | |
163 certain primitives that are coded as special instructions. | |
164 @end defun | |
165 | |
166 @deffn Command compile-defun &optional arg | |
167 This command reads the defun containing point, compiles it, and | |
168 evaluates the result. If you use this on a defun that is actually a | |
169 function definition, the effect is to install a compiled version of that | |
170 function. | |
171 | |
172 @c XEmacs feature | |
173 If @var{arg} is non-@code{nil}, the result is inserted in the current | |
174 buffer after the form; otherwise, it is printed in the minibuffer. | |
175 @end deffn | |
176 | |
177 @deffn Command byte-compile-file filename &optional load | |
178 This function compiles a file of Lisp code named @var{filename} into | |
179 a file of byte-code. The output file's name is made by appending | |
180 @samp{c} to the end of @var{filename}. | |
181 | |
182 @c XEmacs feature | |
183 If @code{load} is non-@code{nil}, the file is loaded after having been | |
184 compiled. | |
185 | |
186 Compilation works by reading the input file one form at a time. If it | |
187 is a definition of a function or macro, the compiled function or macro | |
188 definition is written out. Other forms are batched together, then each | |
189 batch is compiled, and written so that its compiled code will be | |
190 executed when the file is read. All comments are discarded when the | |
191 input file is read. | |
192 | |
193 This command returns @code{t}. When called interactively, it prompts | |
194 for the file name. | |
195 | |
196 @example | |
197 @group | |
198 % ls -l push* | |
199 -rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el | |
200 @end group | |
201 | |
202 @group | |
203 (byte-compile-file "~/emacs/push.el") | |
204 @result{} t | |
205 @end group | |
206 | |
207 @group | |
208 % ls -l push* | |
209 -rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el | |
210 -rw-r--r-- 1 lewis 638 Oct 8 20:25 push.elc | |
211 @end group | |
212 @end example | |
213 @end deffn | |
214 | |
215 @c flag is not optional in FSF Emacs | |
216 @deffn Command byte-recompile-directory directory &optional flag | |
217 @cindex library compilation | |
218 This function recompiles every @samp{.el} file in @var{directory} that | |
219 needs recompilation. A file needs recompilation if a @samp{.elc} file | |
220 exists but is older than the @samp{.el} file. | |
221 | |
222 When a @samp{.el} file has no corresponding @samp{.elc} file, then | |
223 @var{flag} says what to do. If it is @code{nil}, these files are | |
224 ignored. If it is non-@code{nil}, the user is asked whether to compile | |
225 each such file. | |
226 | |
227 The return value of this command is unpredictable. | |
228 @end deffn | |
229 | |
230 @defun batch-byte-compile | |
231 This function runs @code{byte-compile-file} on files specified on the | |
232 command line. This function must be used only in a batch execution of | |
233 Emacs, as it kills Emacs on completion. An error in one file does not | |
234 prevent processing of subsequent files. (The file that gets the error | |
235 will not, of course, produce any compiled code.) | |
236 | |
237 @example | |
238 % emacs -batch -f batch-byte-compile *.el | |
239 @end example | |
240 @end defun | |
241 | |
242 @c XEmacs feature | |
243 @defun batch-byte-recompile-directory | |
244 This function is similar to @code{batch-byte-compile} but runs the | |
245 command @code{byte-recompile-directory} on the files remaining on the | |
246 command line. | |
247 @end defun | |
248 | |
249 @c XEmacs feature | |
250 @defvar byte-recompile-directory-ignore-errors-p | |
251 If non-@code{nil}, this specifies that @code{byte-recompile-directory} | |
252 will continue compiling even when an error occurs in a file. This is | |
253 normally @code{nil}, but is bound to @code{t} by | |
254 @code{batch-byte-recompile-directory}. | |
255 @end defvar | |
256 | |
257 @defun byte-code instructions constants stack-size | |
258 @cindex byte-code interpreter | |
259 This function actually interprets byte-code. | |
260 Don't call this function yourself. Only the byte compiler knows how to | |
261 generate valid calls to this function. | |
262 | |
263 In newer Emacs versions (19 and up), byte code is usually executed as | |
264 part of a compiled-function object, and only rarely due to an explicit | |
265 call to @code{byte-code}. A byte-compiled function was once actually | |
266 defined with a body that calls @code{byte-code}, but in recent versions | |
267 of Emacs @code{byte-code} is only used to run isolated fragments of lisp | |
268 code without an associated argument list. | |
269 @end defun | |
270 | |
271 @node Docs and Compilation | |
272 @section Documentation Strings and Compilation | |
273 @cindex dynamic loading of documentation | |
274 | |
275 Functions and variables loaded from a byte-compiled file access their | |
276 documentation strings dynamically from the file whenever needed. This | |
277 saves space within Emacs, and makes loading faster because the | |
278 documentation strings themselves need not be processed while loading the | |
279 file. Actual access to the documentation strings becomes slower as a | |
280 result, but normally not enough to bother users. | |
281 | |
282 Dynamic access to documentation strings does have drawbacks: | |
283 | |
284 @itemize @bullet | |
285 @item | |
286 If you delete or move the compiled file after loading it, Emacs can no | |
287 longer access the documentation strings for the functions and variables | |
288 in the file. | |
289 | |
290 @item | |
291 If you alter the compiled file (such as by compiling a new version), | |
292 then further access to documentation strings in this file will give | |
293 nonsense results. | |
294 @end itemize | |
295 | |
296 If your site installs Emacs following the usual procedures, these | |
297 problems will never normally occur. Installing a new version uses a new | |
298 directory with a different name; as long as the old version remains | |
299 installed, its files will remain unmodified in the places where they are | |
300 expected to be. | |
301 | |
302 However, if you have built Emacs yourself and use it from the | |
303 directory where you built it, you will experience this problem | |
304 occasionally if you edit and recompile Lisp files. When it happens, you | |
305 can cure the problem by reloading the file after recompiling it. | |
306 | |
307 Versions of Emacs up to and including XEmacs 19.14 and FSF Emacs 19.28 | |
308 do not support the dynamic docstrings feature, and so will not be able | |
309 to load bytecode created by more recent Emacs versions. You can turn | |
310 off the dynamic docstring feature by setting | |
311 @code{byte-compile-dynamic-docstrings} to @code{nil}. Once this is | |
312 done, you can compile files that will load into older Emacs versions. | |
313 You can do this globally, or for one source file by specifying a | |
314 file-local binding for the variable. Here's one way to do that: | |
315 | |
316 @example | |
317 -*-byte-compile-dynamic-docstrings: nil;-*- | |
318 @end example | |
319 | |
320 @defvar byte-compile-dynamic-docstrings | |
321 If this is non-@code{nil}, the byte compiler generates compiled files | |
322 that are set up for dynamic loading of documentation strings. | |
323 @end defvar | |
324 | |
325 @cindex @samp{#@@@var{count}} | |
326 @cindex @samp{#$} | |
327 The dynamic documentation string feature writes compiled files that | |
328 use a special Lisp reader construct, @samp{#@@@var{count}}. This | |
329 construct skips the next @var{count} characters. It also uses the | |
330 @samp{#$} construct, which stands for ``the name of this file, as a | |
331 string.'' It is best not to use these constructs in Lisp source files. | |
332 | |
333 @node Dynamic Loading | |
334 @section Dynamic Loading of Individual Functions | |
335 | |
336 @cindex dynamic loading of functions | |
337 @cindex lazy loading | |
338 When you compile a file, you can optionally enable the @dfn{dynamic | |
339 function loading} feature (also known as @dfn{lazy loading}). With | |
340 dynamic function loading, loading the file doesn't fully read the | |
341 function definitions in the file. Instead, each function definition | |
342 contains a place-holder which refers to the file. The first time each | |
343 function is called, it reads the full definition from the file, to | |
344 replace the place-holder. | |
345 | |
346 The advantage of dynamic function loading is that loading the file | |
347 becomes much faster. This is a good thing for a file which contains | |
348 many separate commands, provided that using one of them does not imply | |
349 you will soon (or ever) use the rest. A specialized mode which provides | |
350 many keyboard commands often has that usage pattern: a user may invoke | |
351 the mode, but use only a few of the commands it provides. | |
352 | |
353 The dynamic loading feature has certain disadvantages: | |
354 | |
355 @itemize @bullet | |
356 @item | |
357 If you delete or move the compiled file after loading it, Emacs can no | |
358 longer load the remaining function definitions not already loaded. | |
359 | |
360 @item | |
361 If you alter the compiled file (such as by compiling a new version), | |
362 then trying to load any function not already loaded will get nonsense | |
363 results. | |
364 @end itemize | |
365 | |
366 If you compile a new version of the file, the best thing to do is | |
367 immediately load the new compiled file. That will prevent any future | |
368 problems. | |
369 | |
370 The byte compiler uses the dynamic function loading feature if the | |
371 variable @code{byte-compile-dynamic} is non-@code{nil} at compilation | |
372 time. Do not set this variable globally, since dynamic loading is | |
373 desirable only for certain files. Instead, enable the feature for | |
374 specific source files with file-local variable bindings, like this: | |
375 | |
376 @example | |
377 -*-byte-compile-dynamic: t;-*- | |
378 @end example | |
379 | |
380 @defvar byte-compile-dynamic | |
381 If this is non-@code{nil}, the byte compiler generates compiled files | |
382 that are set up for dynamic function loading. | |
383 @end defvar | |
384 | |
385 @defun fetch-bytecode function | |
386 This immediately finishes loading the definition of @var{function} from | |
387 its byte-compiled file, if it is not fully loaded already. The argument | |
388 @var{function} may be a compiled-function object or a function name. | |
389 @end defun | |
390 | |
391 @node Eval During Compile | |
392 @section Evaluation During Compilation | |
393 | |
394 These features permit you to write code to be evaluated during | |
395 compilation of a program. | |
396 | |
397 @defspec eval-and-compile body | |
398 This form marks @var{body} to be evaluated both when you compile the | |
399 containing code and when you run it (whether compiled or not). | |
400 | |
401 You can get a similar result by putting @var{body} in a separate file | |
402 and referring to that file with @code{require}. Using @code{require} is | |
403 preferable if there is a substantial amount of code to be executed in | |
404 this way. | |
405 @end defspec | |
406 | |
407 @defspec eval-when-compile body | |
408 This form marks @var{body} to be evaluated at compile time and not when | |
409 the compiled program is loaded. The result of evaluation by the | |
410 compiler becomes a constant which appears in the compiled program. When | |
411 the program is interpreted, not compiled at all, @var{body} is evaluated | |
412 normally. | |
413 | |
414 At top level, this is analogous to the Common Lisp idiom | |
415 @code{(eval-when (compile eval) @dots{})}. Elsewhere, the Common Lisp | |
416 @samp{#.} reader macro (but not when interpreting) is closer to what | |
417 @code{eval-when-compile} does. | |
418 @end defspec | |
419 | |
420 @node Compiled-Function Objects | |
421 @section Compiled-Function Objects | |
422 @cindex compiled function | |
423 @cindex byte-code function | |
424 | |
425 Byte-compiled functions have a special data type: they are | |
426 @dfn{compiled-function objects}. The evaluator handles this data type | |
427 specially when it appears as a function to be called. | |
428 | |
429 The printed representation for a compiled-function object normally | |
430 begins with @samp{#<compiled-function} and ends with @samp{>}. However, | |
431 if the variable @code{print-readably} is non-@code{nil}, the object is | |
432 printed beginning with @samp{#[} and ending with @samp{]}. This | |
433 representation can be read directly by the Lisp reader, and is used in | |
434 byte-compiled files (those ending in @samp{.elc}). | |
435 | |
436 In Emacs version 18, there was no compiled-function object data type; | |
437 compiled functions used the function @code{byte-code} to run the byte | |
438 code. | |
439 | |
440 A compiled-function object has a number of different attributes. | |
441 They are: | |
442 | |
443 @table @var | |
444 @item arglist | |
445 The list of argument symbols. | |
446 | |
447 @item instructions | |
448 The string containing the byte-code instructions. | |
449 | |
450 @item constants | |
451 The vector of Lisp objects referenced by the byte code. These include | |
452 symbols used as function names and variable names. | |
453 | |
454 @item stack-size | |
455 The maximum stack size this function needs. | |
456 | |
457 @item doc-string | |
458 The documentation string (if any); otherwise, @code{nil}. The value may | |
459 be a number or a list, in case the documentation string is stored in a | |
460 file. Use the function @code{documentation} to get the real | |
461 documentation string (@pxref{Accessing Documentation}). | |
462 | |
463 @item interactive | |
464 The interactive spec (if any). This can be a string or a Lisp | |
465 expression. It is @code{nil} for a function that isn't interactive. | |
466 | |
467 @item domain | |
468 The domain (if any). This is only meaningful if I18N3 (message-translation) | |
469 support was compiled into XEmacs. This is a string defining which | |
470 domain to find the translation for the documentation string and | |
471 interactive prompt. @xref{Domain Specification}. | |
472 @end table | |
473 | |
474 Here's an example of a compiled-function object, in printed | |
475 representation. It is the definition of the command | |
476 @code{backward-sexp}. | |
477 | |
478 @example | |
479 (symbol-function 'backward-sexp) | |
480 @result{} #<compiled-function | |
481 (&optional arg) | |
482 "...(15)" [arg 1 forward-sexp] 2 854740 "_p"> | |
483 @end example | |
484 | |
485 The primitive way to create a compiled-function object is with | |
486 @code{make-byte-code}: | |
487 | |
488 @defun make-byte-code arglist instructions constants stack-size &optional doc-string interactive | |
489 This function constructs and returns a compiled-function object | |
490 with the specified attributes. | |
491 | |
492 @emph{Please note:} Unlike all other Emacs-lisp functions, calling this with | |
493 five arguments is @emph{not} the same as calling it with six arguments, | |
494 the last of which is @code{nil}. If the @var{interactive} arg is | |
495 specified as @code{nil}, then that means that this function was defined | |
496 with @code{(interactive)}. If the arg is not specified, then that means | |
497 the function is not interactive. This is terrible behavior which is | |
498 retained for compatibility with old @samp{.elc} files which expected | |
499 these semantics. | |
500 @end defun | |
501 | |
502 You should not try to come up with the elements for a compiled-function | |
503 object yourself, because if they are inconsistent, XEmacs may crash | |
504 when you call the function. Always leave it to the byte compiler to | |
505 create these objects; it makes the elements consistent (we hope). | |
506 | |
507 The following primitives are provided for accessing the elements of | |
508 a compiled-function object. | |
509 | |
510 @defun compiled-function-arglist function | |
511 This function returns the argument list of compiled-function object | |
512 @var{function}. | |
513 @end defun | |
514 | |
515 @defun compiled-function-instructions function | |
516 This function returns a string describing the byte-code instructions | |
517 of compiled-function object @var{function}. | |
518 @end defun | |
519 | |
520 @defun compiled-function-constants function | |
521 This function returns the vector of Lisp objects referenced by | |
522 compiled-function object @var{function}. | |
523 @end defun | |
524 | |
525 @defun compiled-function-stack-size function | |
526 This function returns the maximum stack size needed by compiled-function | |
527 object @var{function}. | |
528 @end defun | |
529 | |
530 @defun compiled-function-doc-string function | |
531 This function returns the doc string of compiled-function object | |
532 @var{function}, if available. | |
533 @end defun | |
534 | |
535 @defun compiled-function-interactive function | |
536 This function returns the interactive spec of compiled-function object | |
537 @var{function}, if any. The return value is @code{nil} or a two-element | |
538 list, the first element of which is the symbol @code{interactive} and | |
539 the second element is the interactive spec (a string or Lisp form). | |
540 @end defun | |
541 | |
542 @defun compiled-function-domain function | |
543 This function returns the domain of compiled-function object | |
544 @var{function}, if any. The result will be a string or @code{nil}. | |
545 @xref{Domain Specification}. | |
546 @end defun | |
547 | |
548 @node Disassembly | |
549 @section Disassembled Byte-Code | |
550 @cindex disassembled byte-code | |
551 | |
552 People do not write byte-code; that job is left to the byte compiler. | |
553 But we provide a disassembler to satisfy a cat-like curiosity. The | |
554 disassembler converts the byte-compiled code into humanly readable | |
555 form. | |
556 | |
557 The byte-code interpreter is implemented as a simple stack machine. | |
558 It pushes values onto a stack of its own, then pops them off to use them | |
559 in calculations whose results are themselves pushed back on the stack. | |
560 When a byte-code function returns, it pops a value off the stack and | |
561 returns it as the value of the function. | |
562 | |
563 In addition to the stack, byte-code functions can use, bind, and set | |
564 ordinary Lisp variables, by transferring values between variables and | |
565 the stack. | |
566 | |
567 @deffn Command disassemble object &optional stream | |
568 This function prints the disassembled code for @var{object}. If | |
569 @var{stream} is supplied, then output goes there. Otherwise, the | |
570 disassembled code is printed to the stream @code{standard-output}. The | |
571 argument @var{object} can be a function name or a lambda expression. | |
572 | |
573 As a special exception, if this function is used interactively, | |
574 it outputs to a buffer named @samp{*Disassemble*}. | |
575 @end deffn | |
576 | |
577 Here are two examples of using the @code{disassemble} function. We | |
578 have added explanatory comments to help you relate the byte-code to the | |
579 Lisp source; these do not appear in the output of @code{disassemble}. | |
580 | |
581 @example | |
582 @group | |
583 (defun factorial (integer) | |
584 "Compute factorial of an integer." | |
585 (if (= 1 integer) 1 | |
586 (* integer (factorial (1- integer))))) | |
587 @result{} factorial | |
588 @end group | |
589 | |
590 @group | |
591 (factorial 4) | |
592 @result{} 24 | |
593 @end group | |
594 | |
595 @group | |
596 (disassemble 'factorial) | |
597 @print{} byte-code for factorial: | |
598 doc: Compute factorial of an integer. | |
599 args: (integer) | |
600 @end group | |
601 | |
602 @group | |
603 0 varref integer ; @r{Get value of @code{integer}} | |
604 ; @r{from the environment} | |
605 ; @r{and push the value} | |
606 ; @r{onto the stack.} | |
607 | |
608 1 constant 1 ; @r{Push 1 onto stack.} | |
609 @end group | |
610 | |
611 @group | |
612 2 eqlsign ; @r{Pop top two values off stack,} | |
613 ; @r{compare them,} | |
614 ; @r{and push result onto stack.} | |
615 @end group | |
616 | |
617 @group | |
618 3 goto-if-nil 1 ; @r{Pop and test top of stack;} | |
619 ; @r{if @code{nil},} | |
620 ; @r{go to label 1 (which is also byte 7),} | |
621 ; @r{else continue.} | |
622 @end group | |
623 | |
624 @group | |
625 5 constant 1 ; @r{Push 1 onto top of stack.} | |
626 | |
627 6 return ; @r{Return the top element} | |
628 ; @r{of the stack.} | |
629 @end group | |
630 | |
631 7:1 varref integer ; @r{Push value of @code{integer} onto stack.} | |
632 | |
633 @group | |
634 8 constant factorial ; @r{Push @code{factorial} onto stack.} | |
635 | |
636 9 varref integer ; @r{Push value of @code{integer} onto stack.} | |
637 | |
638 10 sub1 ; @r{Pop @code{integer}, decrement value,} | |
639 ; @r{push new value onto stack.} | |
640 @end group | |
641 | |
642 @group | |
643 ; @r{Stack now contains:} | |
644 ; @minus{} @r{decremented value of @code{integer}} | |
645 ; @minus{} @r{@code{factorial}} | |
646 ; @minus{} @r{value of @code{integer}} | |
647 @end group | |
648 | |
649 @group | |
650 15 call 1 ; @r{Call function @code{factorial} using} | |
651 ; @r{the first (i.e., the top) element} | |
652 ; @r{of the stack as the argument;} | |
653 ; @r{push returned value onto stack.} | |
654 @end group | |
655 | |
656 @group | |
657 ; @r{Stack now contains:} | |
658 ; @minus{} @r{result of recursive} | |
659 ; @r{call to @code{factorial}} | |
660 ; @minus{} @r{value of @code{integer}} | |
661 @end group | |
662 | |
663 @group | |
664 12 mult ; @r{Pop top two values off the stack,} | |
665 ; @r{multiply them,} | |
666 ; @r{pushing the result onto the stack.} | |
667 @end group | |
668 | |
669 @group | |
670 13 return ; @r{Return the top element} | |
671 ; @r{of the stack.} | |
672 @result{} nil | |
673 @end group | |
674 @end example | |
675 | |
676 The @code{silly-loop} function is somewhat more complex: | |
677 | |
678 @example | |
679 @group | |
680 (defun silly-loop (n) | |
681 "Return time before and after N iterations of a loop." | |
682 (let ((t1 (current-time-string))) | |
683 (while (> (setq n (1- n)) | |
684 0)) | |
685 (list t1 (current-time-string)))) | |
686 @result{} silly-loop | |
687 @end group | |
688 | |
689 @group | |
690 (disassemble 'silly-loop) | |
691 @print{} byte-code for silly-loop: | |
692 doc: Return time before and after N iterations of a loop. | |
693 args: (n) | |
694 | |
695 0 constant current-time-string ; @r{Push} | |
696 ; @r{@code{current-time-string}} | |
697 ; @r{onto top of stack.} | |
698 @end group | |
699 | |
700 @group | |
701 1 call 0 ; @r{Call @code{current-time-string}} | |
702 ; @r{ with no argument,} | |
703 ; @r{ pushing result onto stack.} | |
704 @end group | |
705 | |
706 @group | |
707 2 varbind t1 ; @r{Pop stack and bind @code{t1}} | |
708 ; @r{to popped value.} | |
709 @end group | |
710 | |
711 @group | |
712 3:1 varref n ; @r{Get value of @code{n} from} | |
713 ; @r{the environment and push} | |
714 ; @r{the value onto the stack.} | |
715 @end group | |
716 | |
717 @group | |
718 4 sub1 ; @r{Subtract 1 from top of stack.} | |
719 @end group | |
720 | |
721 @group | |
722 5 dup ; @r{Duplicate the top of the stack;} | |
723 ; @r{i.e., copy the top of} | |
724 ; @r{the stack and push the} | |
725 ; @r{copy onto the stack.} | |
726 | |
727 6 varset n ; @r{Pop the top of the stack,} | |
728 ; @r{and set @code{n} to the value.} | |
729 | |
730 ; @r{In effect, the sequence @code{dup varset}} | |
731 ; @r{copies the top of the stack} | |
732 ; @r{into the value of @code{n}} | |
733 ; @r{without popping it.} | |
734 @end group | |
735 | |
736 @group | |
737 7 constant 0 ; @r{Push 0 onto stack.} | |
738 | |
739 8 gtr ; @r{Pop top two values off stack,} | |
740 ; @r{test if @var{n} is greater than 0} | |
741 ; @r{and push result onto stack.} | |
742 @end group | |
743 | |
744 @group | |
745 9 goto-if-not-nil 1 ; @r{Goto label 1 (byte 3) if @code{n} <= 0} | |
746 ; @r{(this exits the while loop).} | |
747 ; @r{else pop top of stack} | |
748 ; @r{and continue} | |
749 @end group | |
750 | |
751 @group | |
752 11 varref t1 ; @r{Push value of @code{t1} onto stack.} | |
753 @end group | |
754 | |
755 @group | |
756 12 constant current-time-string ; @r{Push} | |
757 ; @r{@code{current-time-string}} | |
758 ; @r{onto top of stack.} | |
759 @end group | |
760 | |
761 @group | |
762 13 call 0 ; @r{Call @code{current-time-string} again.} | |
763 | |
764 14 unbind 1 ; @r{Unbind @code{t1} in local environment.} | |
765 @end group | |
766 | |
767 @group | |
768 15 list2 ; @r{Pop top two elements off stack,} | |
769 ; @r{create a list of them,} | |
770 ; @r{and push list onto stack.} | |
771 @end group | |
772 | |
773 @group | |
774 16 return ; @r{Return the top element of the stack.} | |
775 | |
776 @result{} nil | |
777 @end group | |
778 @end example | |
779 | |
780 |