Hacker News new | ask | show | jobs
by actionfromafar 622 days ago
Maybe I should write that tutorial on how to use C# for low-level.
3 comments

Heh, I've been procrastinating on making a blog and writing a blog post on "C# for systems programming". Would be nice to read and provide feedback if someone beats me to it.
It will not work if you low-level target is rp2040 microcontroller board...
There was a port of the .NET Nano Framework for RP2040.

But I think the more interesting thing is that if you remove all features in C# that require heap allocations, the resulting subset is basically C with namespaces and generics, which is still useful, and certainly possible to compile efficiently even for very constrained platforms.

Yes, it's technically doable, but what’s the point of using it if you lose almost the entire standard library because it relies on the GC?
There is a practical answer to this question: https://github.com/bflattened/bflat specifically the --stdlib:zero target.

C# is quite a bit more than just enhanced C if you remove GC-reliant features as the generics and interface constraints enable a huge subset of features, alongside SIMD API, stack-allocated buffers and all sorts of memory wrappable in Span<T>s, which almost every method in the standard library that works on some sort of buffer accepts nowadays instead of plain arrays.

You can also manually allocate objects - there are multiple ways to go about it and even with the presence of GC, there is a "hidden" but supported API to register a NonGC heap that GC understands when scanning object references.

Though effective targeting is limited to much fewer count of platforms. Mono can target as low as ARMv6 but CoreCLR/NativeAOT mainly work with x86, x86_64, ARM and ARM64. For microcontrollers you are better off using Rust in my opinion. But for anything bigger .NET can be a surprisingly capable choice.

Yes please do!