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.
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.