6 ms·
> 212kB Here's a 11 kB bootable x86-64 version of the game written in C# https://github.com/kant2002/SeeSharpSnake/tree/kant/uefi#run-on-uefi https://github.co
by MStrehovsky 5y ago
> 212kB
Here's a 11 kB bootable x86-64 version of the game written in C# https://github.com/kant2002/SeeSharpSnake/tree/kant/uefi#run-on-uefi https://github.com/kant2002/SeeSharpSnake/tree/kant/uefi#run....
There's an accompanying article with a video at the bottom https://codevision.medium.com/running-c-snake-inside-uefi-df193b6213e2 https://codevision.medium.com/running-c-snake-inside-uefi-df....
- elromulous 5y agoSo I admittedly only skimmed that link very briefly. But... how? I would think the c# runtime alone would balloon this to some astronomical size. Edit: Got my answer. /p:Mode=CoreRT-NoRuntime, /nostdlib, and a bunch of others.
- option_greek 5y agoSo how does it work. Where do the standard library functions come from? Where do all the garbage collecting functionality gets loaded from?. Or is it more like pinvoking a reduced external library in C for all needed functionality.
- hahamrfunnyguy 5y agoHe used a few different techniques. 1. Used CoreRT instead of the standard .NET libraries 2. He avoided using functionality that would use GC in the first place 3. Created his own alternative runtime library w/out GC and exception handling 4. Created a base type library for some of the System functions 5. Re-directed certain functions like Thread.Sleep to smaller implementations in specific libraries. The blog posting is well worth reading: https://medium.com/@MStrehovsky/building-a-self-contained-game-in-c-under-8-kilobytes-74c3cf60ea04 https://medium.com/@MStrehovsky/building-a-self-contained-ga...
- pjmlp 5y agoThis is also a very good example that not all languages with GC are created equal, some do provide the mechanisms to do alternative ways of managing resources.
- jaclaz 5y agoWhat about 512 bytes? https://github.com/nongiach/snake_boot_sector https://github.com/nongiach/snake_boot_sector or: https://github.com/w-shackleton/snake-in-my-boot https://github.com/w-shackleton/snake-in-my-boot
- pornel 5y agoThis implementation uses async/await, data structures from Rust's standard library (alloc crate), plus streams and channels (30 dependencies in total), so it's pretty fancy for a "no_std" project. Bare-bones Rust executables can start at about 3.5KB, and code size increase on top of that is comparable to C or C++. Rust can be a "portable assembler" if you write code in such style. It can also generate lots of code if you lean into generics (same issue as with C++ templates).