> And this is an excellent example of PicoLisp going the extra mile. Instead > of handling C as the lowest abstraction, going to the actual machine. I > imagine other interpreted languages could be faster if designed with this > attention to detail. >
Exactly! Thank you Alex, for the insightful explanation. > On 12 maj 2014 08:24:13 CEST, Alexander Burger <a...@software-lab.de> > wrote: >>On Mon, May 12, 2014 at 08:06:57AM +0200, Alexander Burger wrote: >>> The problem with this is that is horribly inefficient. The dynamic >>version >>> >>> myStruct bnd[length(x)]; >>> >>> simply decrements the stack pointer by "length(x) * sizeof(myStruct)" >>> (which is a single machine instruction!), while the malloc() call >>> involves the whole memory management machinery. >> >>BTW, this inability of C to properly support stack manipulations was >>the >>main reason to write the 64-bit version of PicoLisp in assembly. >> >> >>As I wrote this in http://software-lab.de/doc64/README >> >>The reasons to choose assembly language (instead of C) were, in >>decreasing order >> of importance: >> >> 1. Stack manipulations >>Alignment to cell boundaries: To be able to directly express the >>desired >> stack data structures (see "doc64/structures", e.g. "Apply frame"), a >> better control over the stack (as compared to C) was required. >> >>Indefinite pushs and pops: A Lisp interpreter operates on list >>structures >>of unknown length all the time. The C version always required two >>passes, >>the first to determine the length of the list to allocate the necessary >>stack structures, and then the second to do the actual work. An >>assembly >>version can simply push as many items as are encountered, and clean up >>the >> stack with pop's and stack pointer arithmetics. >> >> ... >> >> >> >>Pushing and popping data of unknown length is at the heart of the >>PicoLisp >>interpreter. It is done all the time. >> >> >>Note that even with arrays of variable length, as in the discussed >>case: >> >> myStruct bnd[length(x)]; >> >>it is still not optimal, because the interpreter has to call length() >>on >>the list first, before actually processing it. The list needs to be >>traversed twice. >> >>In a language with proper stack control, you can simply call 'push' in >>the loop doing the processing. >> >>âªâ« Alex >>-- >>UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe > > -- > Skickat frÃ¥n min Android-telefon med K-9 E-post. Ursäkta min > fÃ¥ordighet. > -- UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe