From ... From: Erik Naggum Subject: Re: [historical] Invoking a Lisp compiler Date: 1999/01/23 Message-ID: <3126088259895935@naggum.no>#1/1 X-Deja-AN: 435985214 References: <3125967092999949@naggum.no> mail-copies-to: never Organization: Naggum Software; +47 8800 8879; http://www.naggum.no Newsgroups: comp.lang.lisp * "Matthew X. Economou" | Would it be sensible to have a Lisp compiler that could be invoked | similarly to e.g. CC under UNIX? no, because the results aren't "linked" and "executed" from the command-line, except, of course, in a similar "batch" mode. note, however, that the command-line is really an interpreter and calls out to functions that are loaded from disk every time. usually, this interpreter has some strange syntax for sub-evaluation and has only a few simple control structures, cannot use the value from the functions it has called except through arcane syntax, and usually you have to deal with their "output" through I/O, not actually any values per se. re-using the output of a function may also need a lot of work because it has been optimized for people, not for re-use. I prefer the REPL in Lisp... | EMACS uses the term "Lisp image" when describing the last stage in its | build process. The build process, in this final step, starts up the | EMACS Lisp engine (src/temacs) and loads all of the various editing | functions into memory. It then forces a core dump of this running | system, and the core file is then "undumped" (their terminology) into a | runnable executable (src/emacs). that last past is wrong. the executable is not built from a core dump. by that time, too much is actually lost to be useful in building an executable on most operating systems. instead, the information in memory is written out in a way and an order that causes it to be loaded into memory the same way. basically, the process is that of preparing to make the operating system re-create the conditions that exist in the image at dump time. | Is this (effectively) what "build a new Allegro CL image" means, or does | Allegro (and, I'm assuming, other modern Lisp implementations) do | something more like the typical C or FORTRAN compiler? no, they do basically the same thing: load it into memory, then write memory to disk in a way that causes it to be loaded in the same way. note that a C program doesn't necessarily know what it will look like in memory until actually loaded. there are lots of "loose ends" that the operating system and the dynamic object loader take care of. | The related question is, can one generate DLLs and whatnot with Allegro | (and/or other modern Lisp implementations)? yes. however, "DLL" is a Windows thing. it is as yet not possible for end users to build shared objects or shared libraries, the Unix way. | Can one call DLLs from within Allegro, and does spec say anything about | this? which spec? the documentation for Allegro CL details a foreign interface that I believe is fully capable of using any DLL the system provides. | I'm curious, because every use I've put Lisp to (...) invokes this "self- | containedness" property (...), whereas languages like ADA, Perl, C, | FORTRAN, and Pascal seem to be very good at mixing code (...). Common Lisp implementations are better at this than most other languages -- they have to by virtue of being in a minority. however, Lisp has a much different concept of what constitutes "interface" than C does, and the C calling conventions are sorely lacking in the needs that Lisp has. also, of course, statically typed languages discard type information by execution time, and Lisp keeps it around in the pointers and such. calling out to foreign functions is no big deal, you only need to declare them properly, but that is no news to people from the languages you need to talk to. if the language is any good (and most aren't :), you should be able to generate the interface code in Lisp automatically. however, there is often insufficient information on how the run-time system calls its own functions that it is possible to do this without actually compiling some interface functions and go through an expensive interface that has known properties. | I seem to be having a difficult time picturing such a Lisp compiler | though; all my experience with Lisp has been with interpreted | environments like EMACS, GCL, or Chez Scheme. Emacs and GCL have compilers and you really need them. don't know about Chez Scheme, but from what I have read, it does indeed compile files and all that stuff. how do you picture a C compiler? would it be harder if you could type in C code to an interactive environment and see results immediately? BTW, I think you confuse "interpreted" with "interactive". you really don't know what happens when ypu have typed in an expression. for all you know or care, the system doesn't do (loop (print (eval (read)))), but (loop (print (funcall (compile nil `(lambda () ,(read)))))) #:Erik -- SIGTHTBABW: a signal sent from Unix to its programmers at random intervals to make them remember that There Has To Be A Better Way.