[M3devel] heap vs. stack? (sort of)

Tony Hosking hosking at cs.purdue.edu
Mon Jan 28 17:55:39 CET 2008


I should say CM3 here.

On Jan 28, 2008, at 11:43 AM, Tony Hosking wrote:

> Modula-3 heap allocation is just bumping a pointer.  The M3 GC is a  
> copying (ie, compacting) collector.  Fast path allocation doesn't  
> even need synchronization since every thread allocates from its own  
> private heap buffer.
>
> On Jan 28, 2008, at 9:00 AM, Jay wrote:
>
>> Both.
>> In thinking about how to write the code, there is no point in  
>> splitting the code into two functions.
>> They are each small and the one is only called once.
>> The language should in general not force me to write functions  
>> merely to work over the type system.
>> <*inline*> is not implemented by the integrated backend. I assume  
>> every function call I write will not be inlined.
>>
>> > Functions can return pointers to open arrays - isn't this enough?
>>
>> Yes that might help.
>> I had tried like
>>
>> PROCEDURE PickBuffer(VAR buf: ARRAY OF CHAR; len: INTEGER): ARRAY  
>> OF CHAR =
>> BEGIN
>>   IF len <= NUMBER(buf)
>>     RETURN buf;
>>   END;
>>   RETURN NEW ARRAY OF CHAR (len);
>> END PickBuffer;
>>
>> PROCEDURE Parse(...)
>> VAR
>>    stack: ARRAY [0..255] OF CHAR;
>>  BEGIN
>>   ...
>>   WITH buf = PickBuffer(stack, len) DO
>>      use buf
>>    END;
>>  END Parse
>>
>> but I couldn't come up with a PickBuffer that the compiler liked.
>>
>> PickBuffer is still a bit iffy.
>>
>> More generally in C++ I would implement that as a template class  
>> where one of the parameters is how much to preallocate. In C I  
>> would implement it as a struct and some functions and the  
>> initialization function would take the preallocated buffer and size.
>>
>> Surely Modula-3 can do either/both of those patterns well and it  
>> doesn't have to be reimplemented over and over.
>>
>> The Modula-3 code I see around the system is way more low level  
>> and repetitive than seems appropriate, more so than C code that I  
>> write.
>>
>> Another example is that it definitely appears that if I try to  
>> compile code with a path like
>> \a\b\c\d\e\f\g\h\a\b\c\d\e\f\g...\foo.m3
>>
>> that has more than around 32 path separators, I'll just get some  
>> random failures since the code just "gives up".
>> M3Path has an array of 32 to store the positions of path separators.
>> That whole chunk of code, to remove \.\ I'll probably rewrite to  
>> be both more efficient and have no such capacity limits.
>> For \.\ it is trivial.
>> For \..\ it takes a bit of cleverness -- rather than rely on any  
>> indefinite amount of storage, what you can do is first reverse the  
>> string, then whenever you se .., bump up a counter, whenever you  
>> see not .., bump it down, only copy from source to dest when the  
>> counter is zero. Roughly.
>>
>> Of course...maybe better here...count the slashes, if there are  
>> more than ~30, do the heap alloc, as in the previous pattern.  
>> Though it'd be nice, since it is possible, to handle arbitrarily  
>> long paths without the heap alloc.
>>
>> In a compacting garbage collection system, heap alloc can be  
>> roughly the cost of incrementing an integer.
>> I do not assume Modula-3 has that, though maybe, and I do not  
>> assume it has particularly fast heap allocation.
>> I have seen heap allocation just be very slow in general and I  
>> avoid it whenever possible/easy/correct.
>>
>> There are competing desires here of course.
>>   1 Be fast.
>>   2 Don't have fixed sized limits. (and esp. don't crash when you  
>> go past them! as I complained about recently..)
>>   3 Don't use "too much" stack, however much that is.
>>
>> The easiest way to do #2 and #3 is always heap alloc exactly how  
>> much you need, but that kills #1.
>>
>>  - Jay
>>
>>
>>
>> > Date: Mon, 28 Jan 2008 14:38:37 +0100
>> > From: lemming at henning-thielemann.de
>> > Subject: RE: [M3devel] heap vs. stack? (sort of)
>> > To: jayk123 at hotmail.com
>> > CC: m3devel at elegosoft.com
>> >
>> >
>> > On Mon, 28 Jan 2008, Jay wrote:
>> >
>> > > I totally want common code, there's just no point in moving it  
>> into a separate function.
>> >
>> > Are you concerned about efficiency or about readability? In the  
>> first case
>> > maybe <* INLINE *> helps?
>> >
>> > > I also tried WITH that got its value from "PickBuffer", also a  
>> useless
>> > > function but at least small, but functions can't return open  
>> arrays.
>> >
>> > Functions can return pointers to open arrays - isn't this enough?
>>
>>
>> Connect and share in new ways with Windows Live. Get it now!




More information about the M3devel mailing list