Returning variable-sized stack data
ryuukk_
ryuukk.dev at gmail.com
Tue Aug 13 10:53:40 UTC 2024
On Tuesday, 13 August 2024 at 09:55:28 UTC, Quirin Schroll wrote:
> On Monday, 12 August 2024 at 17:42:11 UTC, ryuukk_ wrote:
>> On Monday, 12 August 2024 at 10:37:21 UTC, Quirin Schroll
>> wrote:
>>> On Wednesday, 17 July 2024 at 08:23:45 UTC, IchorDev wrote:
>>>> On Monday, 15 July 2024 at 17:20:57 UTC, monkyyy wrote:
>>>>> I think you should also preemptively handle runtime stack
>>>>> allocated arrays inside the function
>>>>>
>>>>> ```d
>>>>> int[$] foo(size_t i){
>>>>> int[i] output;
>>>>> foreach(...){
>>>>> ...
>>>>> }
>>>>> return output;
>>>>> }
>>>>> ```
>>>>
>>>> Oh yes, that would be fantastic!
>>>> It'd be lowered to something like this, right?
>>>> ```d
>>>> int[] output = (cast(int*)alloca(i * int.sizeof))[0..i];
>>>> ```
>>>
>>> Why not this:
>>> ```d
>>> scope xs = new int[](n);
>>> ```
>>
>>
>> `new` = GC heap allocation
>>
>> So it doesn't make sense to read that line
>
> Nonsense. Try this (use `-dip1000`):
> ```d
> void f(scope Object) @safe @nogc { }
> void main() @nogc @safe
> {
> scope o = new Object;
> f(o);
> }
> ```
>
> Oddly, `new` rather means: Creates a reference type. It does
> not mean: Allocates on the GC.
>
>> A value is a value, no `new` keyword, please, besides, in my
>> custom runtime, there is no `class`, no `new`, no `GC` and
>> more importantly, no `TypeInfo`
>
> What you’re basically saying is: You don’t use D; you use a
> personal language based on D.
I don't use a personal language based on D, i use D with a custom
runtime, big difference, because of that i can target both
consoles and WebAssembly, you can't with your C#/Java'd D
>>> With the same guarantees of allocation elision as `scope xs =
>>> [ 1, 2, 3 ];`?
It would have never been an issue if D made the right call of not
expecting `[1,2,3]` to be GC allocated without requiring `new`,
fix that mistake, don't put another mistake on top of it
>> D's biggest mistake was to make this GC allocated without
>> requiring `new`
>>
>> I hope this gets fixed with an Edition, because it is cringe
>
> Funnily enough, C#12 added [collection
> expressions](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-12#collection-expressions) which are basically what D had all along. In particular, no use of `new`.
>
> Some people overly care about GC and allocations. D is a GC
> language. It has facilities to statically ensure some parts of
> a program are free of GC allocations, probably for the purpose
> of optimizing hot spots. Most of Phobos is not written with
> `@nogc` in mind – or `nothrow` for that matter. For example, I
> recently fixed
> [`lockstep`](https://dlang.org/library-prerelease/std/range/lockstep.html) so that it is `@safe` (and `pure`), but not `@nogc` or `nothrow`. That is not due to the task it accomplishes, but because it uses `enforce`.
C# is a JIT/GC language
D was not, it slowly became one because nobody dared calling out
the GC and Java people, they have ruined its reputation during a
timeline that made Rust popular and now Zig..
It's easy to become C#, it's harder for C# to become D or even
Rust (stackalloc :vomit:)
More information about the dip.ideas
mailing list