An interpreter-only implementation that performs better than compiled implementations?... Oh, but wait, it says it's better than "some" compiled implementations, so I guess if it beats "some" shitty compiled implementations that's true... How does it compare to, say, SBCL?
As for the "As a consequence [of being interpreter-only], Pico Lisp is the most dynamic Lisp in existence today." part, I don't really see what notable advantages an interpreter-only implementation would have over a proper compiler-implementation in flexibility, given that it's Lisp we're talking about. Unless you wanted to muck with the deep internals or something... Also, I'm in the process of making my homebrewed web framework more flexible by making use of more compilation, thus making it less of an interpreter.
This could make sense. In a sufficiently complex language, a single "VM" instruction translates to many native instructions. If you compile a program in such a language into native code, the size of the code explodes, resulting in really poor cache utilization. A tight interpreter on a modern processor (heavy cache fault penalties + branch prediction) can very well perform better than a natively compiled program. Performance is a very tough problem, unfortunately it's very difficult to find a "superior" solution - it just depends on far too many variables.
If memory serves me, there are also cases where information available at run-time can allow better optimizations than could normally be done at compile-time--I think the JVM has some tricks along those lines for JITing bytecode into native instructions, but I suppose the same principle could apply elsewhere.
Nothing stopping you doing these kinds of optimizations on Lisp code again at runtime when you have the extra info. Just automatically recompile if you know it will save you enough time to be worth it (which is a more difficult problem, of course...)
Regarding the quote below... I don't get it. Cells are a linked list spread randomly throughout your address space. Processors don't love that at all.
"A cell is a cell in the same way it was with the original Lisp, consisting on a head and the rest, that is, a CAR part (which may be either a number, a symbol, or a pointer to another cell), and a CDR part (also a number, symbol or cell).
As a consequence, it is incredibly memory efficient, and there is little to none memory fragmentation. Processors cache "loves" our interpreter."
Let's just say I wouldn't use the spread of allocations across address space as a PRNG. Depends on your allocator of course, but you should normally see some fairly linear patterns. The allocator can be very simple if all (or almost all) allocations are the same size, so you can easily optimise for cache efficiency.
I suspect the cache angle they're playing up refers to memory footprint of each cell. I don't know how big their cells are, they could be anything from 2 machine words up. Integers are supposedly directly represented, and if they've embedded their GC liveness info into spare bits (or stored it elsewhere entirely) then that makes it extremely compact and thus cache friendly.
You missed his statement about it being embedded into other programs. You see when you embedded a gpl scripting language into a larger program the entire program becomes gpl. This makes it a very bad embeddable program.
Picolisp was a major inspiration for me to start writing my own lisp --- I love the idea of removing lambda in favor of quote. I was constantly frustrated by the dynamic binding, though, and the lack of idiomatic macros --- I guess you can't have everything you want unless you do it yourself.
While PicoLisp is certainly interesting, the bulk of Lisp and Scheme (and Dylan) implementations since the early 1980's have gone into a different direction.
For me, true Lisps are languages like T, EuLisp, Dylan, Goo and CL of course (their kernels are mostly equivalent, and can be compiled to run well on existing (virtual) machines.)
I call it "true" mainly because it faithfully represents the code/data unification in lisp. In picolisp, there is no lambda, because the representation of a function is a list, and can be quoted directly.
I have a copy of an great-but-ancient book called "Functional Programming: Application and Implementation" (Peter Henderson, edited by CAR Hoare).
If you're interested in this implementation, you'll find that book very interesting, and quite similar I think (based on reading the link).
(The book has a now-amusing appendix too where it lists the "object" code for the compiler in sexp-syntax, presuming that you'd have no other way to bootstrap other than typing that in :)
An interpreter-only implementation that performs better than compiled implementations?... Oh, but wait, it says it's better than "some" compiled implementations, so I guess if it beats "some" shitty compiled implementations that's true... How does it compare to, say, SBCL?
As for the "As a consequence [of being interpreter-only], Pico Lisp is the most dynamic Lisp in existence today." part, I don't really see what notable advantages an interpreter-only implementation would have over a proper compiler-implementation in flexibility, given that it's Lisp we're talking about. Unless you wanted to muck with the deep internals or something... Also, I'm in the process of making my homebrewed web framework more flexible by making use of more compilation, thus making it less of an interpreter.