Rust isn't the only language to use such ideas. Basically it's region based 
memory 
management http://en.wikipedia.org/wiki/Region-based_memory_management. 
Real time Java uses this. For a recent development next to Rust, check out 
ParaSail https://forge.open-do.org/plugins/moinmoin/parasail/. There's even 
now a version based on LLVM so closer to home for Julia than Rust.

On Sunday, May 10, 2015 at 8:20:42 PM UTC+2, Stefan Karpinski wrote:
>
> No, there hasn't been any change on this. It's unclear if anything from 
> the Rust model can actually be leveraged in a dynamic language.
>
>
> On May 9, 2015, at 3:46 PM, Michael Louwrens <michael.w...@outlook.com 
> <javascript:>> wrote:
>
> Have you had any further thought on this? It seems like it could be quite 
> useful for the cases where one intentionally disables the GC for 
> performance reasons - though you guys are incredibly busy! I also read 
> about having the compiler automatically insert frees where it can in Julia 
> and was wondering if that fits at all into this?
>
> On Tuesday, 16 December 2014 23:24:08 UTC+2, Stefan Karpinski wrote:
>>
>> I would love to figure out a way to bring the kind of automatic resource 
>> and memory release that Rust has to Julia, but the cost is some fairly 
>> finicky static compiler analysis that is ok for Rust's target demographic 
>> but fairly clearly unacceptable for Julia general audience. What we'd need 
>> is a more dynamic version of something like that. One idea I've had is to 
>> indicate ownership and enforce it at run-time rather than compile time – 
>> and eliminate run-time checks when we can prove that they aren't needed. 
>> This could look something like having "owned references" to values versus 
>> "borrowed references" and check that the object still exists if the 
>> borrowed reference is used and raise an error if it doesn't. When an owned 
>> reference to the thing goes out of scope, immediately finalize it. I'm not 
>> sure how to indicate this, but it would be great to be able to write:
>>
>> function foo(...)
>>     fh = open(file)
>>     # do stuff with fh
>> end # <= fh is automatically before the function returns
>>
>> # it's a runtime error to access the fh object after this
>>
>>
>> Similarly, you could have something like this:
>>
>> function bar(...)
>>     a = @local Array(Int,10)
>>     # do stuff with a    
>> end # <= a is automatically freed before the function returns
>> # it's a runtime error to access the a object after this
>>
>>
>> Given these semantics, it would be relatively easy to alloca the actual 
>> memory of the array, and only heap allocate the object itself, which could 
>> then reference the stack allocated memory. This is tough to implement, 
>> especially efficiently, but I have a bit of a suspicion that in Julia 
>> mutable objects – and this only makes sense for mutable objects that are 
>> inherently associated with a particular place in memory – are rarely 
>> performance critical in Julia.
>>
>>
>> On Mon, Dec 15, 2014 at 11:15 PM, John Myles White <johnmyl...@gmail.com> 
>> wrote:
>>
>>> This is taking the thread off-topic, but conceptually such things are 
>>> possible. But Rust has a very different set of semantics for memory 
>>> ownership than Julia has and is doing a lot more analysis at compile-time 
>>> than Julia is doing. So Julia would need to change a lot to be more like 
>>> Rust. I've come to really adore Rust, so I'd like to see us borrow some 
>>> ideas, but my personal sense is that Julia and Rust simply serve different 
>>> niches and shouldn't really move towards one another too much lest each 
>>> language wind up forsaking what makes it useful.
>>>
>>>  -- John
>>>
>>>
>>> On Dec 15, 2014, at 8:43 PM, Eric Forgy <eric....@gmail.com> wrote:
>>>
>>> Hi,
>>>
>>> I'm new to Julia and mentioned it to a friend who is more into systems 
>>> than mathematical models and he mentioned his current "crush" is Rust, 
>>> which is also built on LVVM. I may have totally missed the point, but IF I 
>>> understand, Rust does away with garbage collection by "borrow blocking" at 
>>> compile time. The question popped into my head whether we could turn off GC 
>>> in Julia and check for problems at compile time. A google later, brought me 
>>> to this thread. Is that a totally misguided idea?
>>>
>>> Best regards,
>>> Eric
>>>
>>> PS: You can tell I'm coming in with almost no background knowledge about 
>>> compilers (or real languages for that matter), but am having fun learning. 
>>> LVVM was developed at my alma mater (PhD in ECE - Computational 
>>> Electromagnetics - from UIUC 2002). Go Illini! :)
>>>
>>> On Friday, February 22, 2013 7:11:32 PM UTC+8, Tim Holy wrote:
>>>>
>>>> Have you played with SProfile in the Profile package? It's rather good 
>>>> at 
>>>> highlighting which lines, in your code and in base/, trigger the gc. 
>>>> Note that 
>>>> in my experience the gc does not seem to be triggered necessarily on 
>>>> big 
>>>> allocations; for example, even allocating an array as 
>>>>    Array(Int, (3,5)) 
>>>> rather than 
>>>>   Array(Int, 3, 5) 
>>>> can trigger the gc (I see lots of gc() calls coming from our Lapack 
>>>> code for 
>>>> this reason). 
>>>>
>>>> Because I don't really know how the gc works, I'm not certain that kind 
>>>> of 
>>>> thing actually reflects a problem; perhaps it was just going to have to 
>>>> call gc 
>>>> on the next heap-allocation event, and (3,5) just happened to be the 
>>>> lucky 
>>>> candidate. But there's an open issue about this: 
>>>> https://github.com/JuliaLang/julia/issues/1976 
>>>>
>>>> Docs are here: https://github.com/timholy/Profile.jl 
>>>> I think they're slightly out of date, but only in very minor ways. 
>>>>
>>>> --Tim 
>>>>
>>>>
>>>>
>>>> On Thursday, February 21, 2013 03:17:59 PM nathan hodas wrote: 
>>>> > Here's the code that benefits from @nogc: 
>>>> > 
>>>> > Notice the iteration over a Dict and a Set. iscorrect() checks a 
>>>> field of 
>>>> > the Attempt type. I can tell by running this particular that the 
>>>> garbage 
>>>> > collection is running during the for loop. 
>>>> > function meantime(userdata::Dict{Int,Set{Attempt}}) 
>>>> >     usertimes = Dict{Int,Float64}() 
>>>> >     sizehint(usertimes,length(userdata)) 
>>>> >     for (uid,attempts) in collect(userdata) 
>>>> >         s = 0.0; 
>>>> >         c = 0.0; 
>>>> >         ic = 0.0; 
>>>> >         for a in attempts 
>>>> >                 ic = iscorrect(a) 
>>>> >                 s += (a.tend - a.tstart)*ic; 
>>>> >                 c += ic; 
>>>> >         end 
>>>> >         usertimes[uid] = s/c; 
>>>> >     end 
>>>> >     usertimes 
>>>> > end 
>>>> > 
>>>> > This code has no benefit from @nogc, regardless of the kernel 
>>>> function k1: 
>>>> > 
>>>> > function dostuff(input1,input2) 
>>>> >     output = similar(input1) 
>>>> >     len = length(input1) 
>>>> >     for i = 1:len 
>>>> >         x = input1[i] 
>>>> >         for j = 1:len 
>>>> >             y = input2[j] 
>>>> >             output[i] += k1(x,y) 
>>>> >         end 
>>>> >     end 
>>>> >     output 
>>>> > end 
>>>> > 
>>>> > On Thursday, February 21, 2013 10:37:09 AM UTC-8, Stefan Karpinski 
>>>> wrote: 
>>>> > > Can you post some example code? Are you just iterating the Dict 
>>>> object 
>>>> > > with a for loop? 
>>>> > > 
>>>> > > 
>>>> > > On Thu, Feb 21, 2013 at 1:35 PM, Stefan Karpinski 
>>>> > > <ste...@karpinski.org<javascript:>> 
>>>> > > > wrote: 
>>>> > >> That's good information to have. I'll look into it. 
>>>> > >> 
>>>> > >> 
>>>> > >> On Thu, Feb 21, 2013 at 1:13 PM, nathan hodas 
>>>> > >> <nho...@gmail.com<javascript:>>> 
>>>> > >> > wrote: 
>>>> > >>> It's true that @nogc is not a panacea.  For my particular 
>>>> function, it 
>>>> > >>> produces a robust 20x speed up, even after subsequent 
>>>> collection.  For 
>>>> > >>> other seemingly similar functions, it has no effect at all. I 
>>>> don't use 
>>>> > >>> any 
>>>> > >>> temporary arrays *that I'm aware of*, but it seems the iterators 
>>>> of a 
>>>> > >>> Dict 
>>>> > >>> are doing something in the background. 
>>>> > >>> 
>>>> > >>> On Wednesday, February 20, 2013 3:44:24 PM UTC-8, Tim Holy wrote: 
>>>> > >>>> The other thing you should check is whether you're allocating 
>>>> more than 
>>>> > >>>> you 
>>>> > >>>> need to. I find that I can often reuse bits of memory, and that 
>>>> can 
>>>> > >>>> dramatically decrease the need for gc. In the long run that may 
>>>> help 
>>>> > >>>> you a 
>>>> > >>>> _lot_ more than temporarily disabling gc, because at some point 
>>>> you'll 
>>>> > >>>> need to 
>>>> > >>>> turn it on again. 
>>>> > >>>> 
>>>> > >>>> There are examples of this kind of thing scattered all over the 
>>>> Julia 
>>>> > >>>> code 
>>>> > >>>> tree. Just because it was rather easy for me to find :-), here's 
>>>> the 
>>>> > >>>> patch I 
>>>> > >>>> pushed to Zip in iterator.jl today: 
>>>> > >>>> https://github.com/JuliaLang/**julia/commit/** 
>>>> > >>>> 89ece095e8ea1fa166074306927c6c**c5f90060f7<https://github.
>>>> com/JuliaLang 
>>>> > >>>> /julia/commit/89ece095e8ea1fa166074306927c6cc5f90060f7> It got 
>>>> rid of 
>>>> > >>>> two array allocations per iteration, by reusing one array and 
>>>> > >>>> pre-allocating "scratch space" inside the type for the other. 
>>>> > >>>> 
>>>> > >>>> You can also reuse bits of memory by writing functions with a 
>>>> syntax 
>>>> > >>>> like 
>>>> > >>>> 
>>>> > >>>> this: 
>>>> > >>>>    function myfunc(out::Array, arg1, arg2) 
>>>> > >>>> 
>>>> > >>>> where out is pre-allocated storage for the output. This helps if 
>>>> you'll 
>>>> > >>>> be 
>>>> > >>>> calling the same function many times and always need an array of 
>>>> the 
>>>> > >>>> same type 
>>>> > >>>> and dimensions. Our matrix multiplication routines can be used 
>>>> in this 
>>>> > >>>> way. 
>>>> > >>>> 
>>>> > >>>> --Tim 
>>>>
>>>
>>>
>>

Reply via email to