[HN Gopher] SectorC: A C Compiler in 512 bytes (2023)
___________________________________________________________________
SectorC: A C Compiler in 512 bytes (2023)
Author : valyala
Score : 369 points
Date : 2026-02-07 17:39 UTC (1 days ago)
(HTM) web link (xorvoid.com)
(TXT) w3m dump (xorvoid.com)
| riedel wrote:
| Beautiful, but make sure to quickly add 2023 to the title.
|
| Discussed at the time:
| https://news.ycombinator.com/item?id=36064971
| dang wrote:
| Thanks! Macroexpanded:
|
| _SectorC: A C Compiler in 512 bytes_ -
| https://news.ycombinator.com/item?id=36064971 - May 2023 (80
| comments)
| gjvc wrote:
| why? and why "quickly?
| sanufar wrote:
| The way hashing is used for tokens and for making a pseudo symbol
| table is such an elegant idea.
| fix4fun wrote:
| I think the same. Really nice project and good trick with
| hashing tokens.
|
| PS. There left 21 bytes (21 * 0x00 - from 0x01e0 to 0x01fd).
| Maybe something can be packed there ;)
| avadodin wrote:
| I actually "shipped" a parser using the symbols' hash(as the
| only identifier) for a test tool once. Hopefully, the users
| never used enough symbols to collide 32-bits.
| benj111 wrote:
| I've had the idea before. Was never quite brave enough to do
| it. It's elegant until it isn't....
| xorvoid wrote:
| I may be the author.. enjoy! It was an absolute blast making
| this!
| veltas wrote:
| This is very nice. I'm currently writing a minimalist C
| compiler although my goal isn't fitting in a boot sector, it's
| more targeted at 8-bit systems with a lot more room than that.
|
| This is a great demonstration of how simple the bare bones of C
| are, which I think is one reason I and many others find it so
| appealing despite how Spartan it is. C really evolved from B
| which was a demake of Fortran, if Ken Thompson is to be
| trusted.
| JamesTRexx wrote:
| Would and how much would it shrink when if, while, and for were
| replaced by the simple goto routine? (after all, in assembly
| there is only jmp and no other fancy jump instruction (I
| assume) ).
|
| And PS, it's "chose your own adventure". :-) I love minimalism.
| SAI_Peregrinus wrote:
| What fancy jumps are present in assembly depends on the CPU
| architecture. But there are always conditional jumps, like
| JNZ that jumps if the Zero flag isn't set.
| direwolf20 wrote:
| It's " _choose_ your own adventure "
| globalnode wrote:
| thats the most important thing i noticed about the article,
| apart from the forth tokenising ideas.
| dzaima wrote:
| It only does if & while, not for. A goto in a single-pass
| thing would need separate handling for forwards vs backwards
| jumps, which involves keeping track of data per name (in a
| form where you can tell when it's not yet set; whereas
| if/while data is freely held in recursion stack). And you'd
| still need to handle at least `if ( expr ) goto foo;` to do
| any conditionals at all.
| MobiusHorizons wrote:
| The "fancy jump" is the branch instruction. As far as I know
| all ISAs have them. Even rv32i which is famously minimal has
| several branch instructions in addition to two forms of
| unconditional jump. Branches are typically used to construct
| if / for / while as well as && and || (because of short
| circuiting) and ternary (although some architectures may have
| special instructions for that that may or may not be faster
| than branches depending on the exact model). Without it you
| would have to use computed goto with a destination address
| computed without conditional execution using constant time
| techniques.
| einpoklum wrote:
| An interesting use case - for the compiler as-is or for the
| essentiall idea of barely-C - might be in bootstrapping chains,
| i.e. starting from tiny platform-specific binaries one could
| verify the disassembly of, and gradually building more complex
| tools, interpreters, and compiler, so that eventually you get
| to something like a version of GCC and can then build an entire
| OS distribution.
|
| Examples:
|
| https://github.com/cosinusoidally/mishmashvm/
|
| and https://github.com/cosinusoidally/tcc_bootstrap_alt/
| teo_zero wrote:
| It would be interesting to understand what non-toy programs
| can be coded in this subset of C. For example, could tcc be
| rewritten in this dialect?
| tekknolagi wrote:
| You may enjoy https://github.com/ludocode/onramp
| direwolf20 wrote:
| https://bootstrapping.miraheze.org/wiki/Main_Page
|
| (Why does the referenced short story remind me of "There Is
| No Antimemetics Division"?)
| ahazred8ta wrote:
| Related: the stage0/stage1 series of hex-to-c compiler
| bootstrapping tools
| https://github.com/oriansj/stage0?tab=readme-ov-file and OTCC
| https://bellard.org/otcc/
| NooneAtAll3 wrote:
| > I wrote a fairly straight-forward and minimalist lexer and it
| took >150 lines of C code
|
| was it supposed to be "<150"?
| owalt wrote:
| They're saying the naive implementation was more than 150 lines
| of C code (300-450 bytes), i.e. too big.
| mojuba wrote:
| Compare that to the C compiler in 100,000 lines written by Claude
| in two weeks for $20,000 (I think was posted on HN just
| yesterday)
| vidarh wrote:
| It's a fun comparison, but with the notable difference that
| that one can compile the Linux kernel and generate code for
| multiple different architectures, while this one can only
| compile a small proportion of valid C. It's a great project,
| but it's not so much a C compiler, as a compiler for a subset
| of C that allows all programs this compiler can compile to also
| be compiled by an actual C compiler, but not vice versa.
| d_silin wrote:
| But can it compile "Hello, World" example from its own
| README.md?
|
| https://github.com/anthropics/claudes-c-compiler/issues/1
| Retr0id wrote:
| It's fascinating how few people read past the issue title
| fooker wrote:
| And this is exactly why coding with AI is not-so-slowly
| taking over.
|
| Most people think they are more capable than they
| actually are.
| vidarh wrote:
| Noticed the part where all it requires is to actually have
| the headers in the right location?
| d_silin wrote:
| "The location of Standard C headers do not need to be
| supplied to a conformant compiler."
|
| From https://news.ycombinator.com/item?id=46920922
| discussion.
| vidarh wrote:
| And it doesn't for the compiler in question either. As
| long as the headers exist in the places it looks for
| them. No compiler magically knows where the headers are
| if you haven't placed them in the right location
| Retr0id wrote:
| stddef.h (et al) should be shipped by the compiler
| itself, and so it _should_ know where it is. But they
| rely on gcc for it, hence it doesn 't always know where
| to look. Seems totally fine for a prototype.
| vidarh wrote:
| Especially given they're not shipping anything. The GCC
| binaries can't find misplaced or not installed headers
| either.
| josefx wrote:
| Shipping GPL headers that explicitly state that they are
| part of GCC with a creative commons licensed compiler
| would probably make a lot of people rather unhappy,
| possibly even lawyers.
| d_silin wrote:
| Would you accept the same quality of implementation from
| a human team?
| vidarh wrote:
| A compiler that can't magically know how to find headers
| that don't exist in the expected directory?
|
| Yes, that is the case for pretty much _every_ compiler. I
| suppose you _could_ build the headers into the binary,
| but nobody does that.
| tekne wrote:
| Consider: content-addressed headers.
| vidarh wrote:
| Then you might as well embed the headers, since in that
| case you can't update the compiler and headers separately
| anyway.
| IshKebab wrote:
| I guess you've heard of https://www.unison-lang.org/
| dzaima wrote:
| I've certainly encountered clang & gcc not finding or
| just not having header files a good couple times. Mostly
| around cross-compilation, but there was a period of time
| for which clang++ just completely failed to find any C++
| headers on my system.
| fooker wrote:
| Yes, clang is famously in this category.
|
| If you copy the clang binary to a random place in your
| filesystem, it will fail to compile programs that include
| standard headers.
| HendrikHensen wrote:
| Noticed the part where the exact instructions from the
| Readme were followed and it didn't work?
| vidarh wrote:
| So we're down to a missing or unclear description of a
| dependency in a README - note following the instructions
| worked for others -, from implications the compiler
| didn't work.
| mojuba wrote:
| Well I'm pretty sure the author can make a compliant C
| compiler in a few more sectors.
| vidarh wrote:
| I mean we know it can be done in little space, given the
| many tiny C compilers. I think what is most interesting
| about this one is exactly the creative shortcuts. It's an
| interesting design space for e.g. bootstrapping to impose
| extra restrictions.
| mati365 wrote:
| Oh, it looks like my X86-16 boot sector C compiler that I made
| recently [1]. Writing boot sector games has a nostalgic magic to
| it, when programming was actually fun and showed off your skills.
| It's a shame that the AI era has terribly devalued these
| projects.
|
| [1] https://github.com/Mati365/ts-c-compiler
| w4yai wrote:
| > when programming was actually fun and showed off your skills
|
| Oh no. Now more people are able to do what I do. I'm not
| special anymore.
| mlsu wrote:
| Seems like this is facetious but to me, "I'm not special" is
| a pretty valid thing to be sad about.
| tgv wrote:
| The two dos in "do what I do" do absolutely not carry the
| same meaning.
| guenthert wrote:
| Er, what? The article describes a compiler for a not-quite-C
| programming language which _fits_ entirely in 512B. Your
| project, if I see this correctly, can optionally produce code
| meant to execute as boot sector.
|
| Both interesting projects, but other than the words 'boot
| sector', 'C' and 'compiler', I don't see a similarity.
| SeanSullivan86 wrote:
| Why is it called a C Compiler if it's a subset of C?
| gonzus wrote:
| Lacking support for structs, I think this is too minimalistic to
| be called "a C compiler".
| pilord314 wrote:
| you bootstrap it into a library you can include optionally, duh
| benj111 wrote:
| Weren't structs a fairly late addition to C?
|
| And anyway, isn't that kind of missing the point. 512 bytes
| isn't much. Your comment is nearly a 5th of that budget.
| kayo_20211030 wrote:
| Nice. Very K&R-ish. Not a bad thing.
| EGreg wrote:
| Reminds me of Allegro SizeHack where we made games in 10KB - but
| we were using C and Allegro library!
|
| https://www.oocities.org/trentgamblin/sizehack/entries.html#...
| layer8 wrote:
| If this implementation had existed in the 1980s, the C standard
| would have a rule that different tokens hashing to the same
| 16-bit value invoke undefined behavior, and optimizing compilers
| in the 2000s would simply optimize such tokens away to a no-op.
| ;)
| xorvoid wrote:
| Too real! LMAO
| RodgerTheGreat wrote:
| "you don't have -wTokenHashCollision enabled! it's your own
| foolish ignorance that triggered UB; the spec is _perfectly
| clear_! "
| fredrikholm wrote:
| Hey stop it with the ad hominems!
| fooker wrote:
| This is so cool!
|
| Fun fact, Tiny C Compiler was derived from such a C compiler
| submitted to the the International Obfuscated C Code Contest.
|
| https://www.ioccc.org/2001/bellard/index.html
| xorvoid wrote:
| Further Fun fact, that submission was called OTCC. I reverse
| engineered it and that provided inspiration for SectorC.
|
| https://xorvoid.com/otcc_deobfuscated.html
| https://github.com/xorvoid/otcc_deobfuscated
| pseudohadamard wrote:
| Meh, I did an entire awk interpreter in two lines:
| #!/bin/sh echo "awk: bailing out" >&2
| userbinator wrote:
| C-subset, to be precise; but microcomputer C compilers were in
| the tens of KB range, for one that can actually compile real C.
| kreelman wrote:
| There seems to be a good amount of interest for a boot sector
| compiler!!
|
| If you're running on Linux, adjust the qemu call to use alsa
| rather than coreaudio.
|
| I generated a pull request for this on Github. If the author is
| happy enough with my verbose shell scripting style :-) it might
| get included.
| wbsun wrote:
| Nice, now you can dd it to your boot sector and ... Wait, it is
| 2026, there are 1000 ways of booting and memory mapping on so-
| called unified ARM architecture @,@
| DeathArrow wrote:
| For me is not interesting because it fits in 512 bytes, it's
| interesting because it's very simple. I think it would be a great
| introduction to learning about compilers.
| shikaan wrote:
| Such a great read! Reminds me of the bootsector OS I made some
| time ago[^1]
|
| Maybe it's time to equip it with a C compiler...
|
| [1]: https://github.com/shikaan/osle
| zahlman wrote:
| > Big Insight #2 is that atoi() behaves as a (bad) hash function
| on ordinary text. It consumes characters and updates a 16-bit
| integer.
|
| I could have sworn I remembered atoi() being defined to return 0
| for invalid input (i.e. text not representing an integer in base
| ten).
| MobiusHorizons wrote:
| That would be true of one using a libc, but in a boot sector,
| you only have the bios, so the atoi being referenced is the one
| defined in c near the beginning of the article
| zahlman wrote:
| Ah, I somehow skipped over that exact code block on first
| read.
| wzbtoolbox wrote:
| This is the kind of project that reminds you how far removed
| modern development is from the actual machine. We pile
| abstractions on abstractions until "Hello World" needs 200MB of
| node_modules, and then someone fits a C compiler in 512 bytes.
|
| Not saying we should all write boot sector code, but reading
| through projects like this is genuinely humbling. Great
| educational resource too.
| lock1 wrote:
| This kind of comment reminds me of how broad "software
| development" is.
|
| On other HN posts, they're stating something like "software
| development is dead", "LLM as a compiler", "Do you read
| compiled assembly?", and so on.
|
| While some other posts like this contain huge mechanical
| sympathy and literally r/w the assembly directly.
| hgs3 wrote:
| Great read. It would be neat to see a mini operating system under
| 1 kb of code.
| alittlebee wrote:
| This is really beautiful (I feel like this sort of project is
| outsider art), thank you for sharing.
| drob518 wrote:
| Brilliant! I love the stealing of Forth ideas to power this.
| Forth's minimalism is highly underrated.
___________________________________________________________________
(page generated 2026-02-08 23:01 UTC)