4 ms·
I love c4. The author writes very readable and simple code. I recommend trying out swieros as well “a tiny Unix like kernel”: https://github.com/rswier/swieros
by codezero 7y ago
I love c4. The author writes very readable and simple code. I recommend trying out swieros as well “a tiny Unix like kernel”: https://github.com/rswier/swieros https://github.com/rswier/swieros
- snagglegaggle 7y agohttps://github.com/rswier/c4/blob/master/c4.c https://github.com/rswier/c4/blob/master/c4.c Holy what
- zik 7y agoOh wow. That's quite something.
- megous 7y agoA bit terse perhaps, but only thing that is a bit more than a simple tokenization/parsing and direct output is the precedence climbing part for parsing expressions. That may cause some headscratching for some if they haven't implemented it in the past. But it's easy to read up on that algorithm on wikipedia. Anyway, even using that ultimately makes code more readable than trying to implement the same with recursive descent.
- agumonkey 7y agoyeah, I wrote a mini xml parser in python and the code is really similar ... I'm sure most handwritten parsers are. Or maybe I'm an anonymous demoniac in denial.
- Razengan 7y agoVery readable? It's on the cusp of becoming a demon summoning ritual.
- yitchelle 7y agoThe usage of the 2 character variable names is a "refreshing". At least the author of the code was gracious enough for the following to help debugging. debug; // print executed instructions
- klingonopera 7y agoWhile this is about C++, John Carmack just came from C, so a lot of this applies to C as well: https://kotaku.com/the-exceptional-beauty-of-doom-3s-source-code-5975610 https://kotaku.com/the-exceptional-beauty-of-doom-3s-source-...
- userbinator 7y agoThe major breakthrough of C4 is that it's both terse and yet still very readable; previously the only other well-known self-compiler of that size was OTCC, which is deliberately obfuscated.
- dTal 7y agoInstead of just gazing at the sea of terse variable names in awe, try actually reading it! There's only about a dozen variables and they're all documented at the top - the actual code is actually amazingly clear for what it does. There's not a lot of gratuitous cleverness. For example, just picking a random segment, you don't have to squint very hard to see that this is a number literal parser: else if (tk >= '0' && tk <= '9') { if (ival = tk - '0') { while (*p >= '0' && *p <= '9') ival = ival * 10 + *p++ - '0'; } else if (*p == 'x' || *p == 'X') { [...goes on to handle the hexadecimal case...] (aside - I love the conversion from string to decimal by subtracting the string value of '0', as this will work for any text encoding where the decimal digits are monotonic and contiguous - so ASCII and EBDIC at least...)
- aasasd 7y ago> I love the conversion from string to decimal by subtracting the string value of '0' That's how everyone did character arithmetic since forever, though, especially with the letters. Wouldn't be surprised if it's in K&R. And it probably became a subtle source of errors when environments changed, as mixing semantics and implementation tends to do.
- edflsafoiewq 7y ago>as this will work for any text encoding where the decimal digits are monotonic and contiguous The C spec requires this be the case for both the source and execution basic character sets.
- tom_mellior 7y agoc4 is very cool, but it's not a compiler in the usual sense of the term. It compiles to a kind of bytecode which it then interprets (like Python, for example), but it doesn't generate assembly or machine code (like GCC or JIT compilers, for example). But there's a more realistic compiler inside swieros: https://github.com/rswier/swieros/blob/master/root/bin/c.c https://github.com/rswier/swieros/blob/master/root/bin/c.c that emits actual "binaries" for the emulated toy CPU. It's hard to tell what exactly is going on though, as this is not "very readable and simple code".
- bicolao 7y agoIt's just a small step to generate machine code, this fork [1] can generate an executable, or run it JIT style, both on x86 (there's also the 'arm' branch) [1] https://gitlab.com/pclouds/c4 https://gitlab.com/pclouds/c4
- unkulunkulu 7y agoI must be missing something about compiler design, but why does it seem to have an interpreter at the and of main?
- pygy_ 7y agoYou went to the code too fast (a mistake I also commit often, since unlike comments/doc, code doesn’t lie...). From the project description: “A tiny hand crafted CPU emulator, C compiler, and Operating System”
- altermark 7y agoc4 with tiny x86 JIT: https://github.com/EarlGray/c4 https://github.com/EarlGray/c4 https://github.com/EarlGray/c4/blob/master/c4x86.c https://github.com/EarlGray/c4/blob/master/c4x86.c
- acqq 7y agoIt's beautiful. Here are examples of compiling c4 and using it, following the README: $ gcc -o c4 c4.c 2>/dev/null $ ./c4 hello.c hello, world exit(0) cycle = 9 $ ./c4 -s hello.c 1: #include <stdio.h> 2: 3: int main() 4: { 5: printf("hello, world\n"); ENT 0 IMM -274739184 PSH PRTF ADJ 1 6: return 0; IMM 0 LEV 7: } LEV $ ./c4 c4.c hello.c hello, world exit(0) cycle = 9 exit(0) cycle = 26015 $ ./c4 c4.c c4.c hello.c hello, world exit(0) cycle = 9 exit(0) cycle = 26015 exit(0) cycle = 10060183 It works on Windows too, if you have gcc installed. Also, see "Adding support for 64 bit targets" commit: https://github.com/rswier/c4/commit/2feb8c0a142b2e513be69442c24af82dbaf41a25 https://github.com/rswier/c4/commit/2feb8c0a142b2e513be69442... And yes, swieros has much more.
- candiodari 7y agoSo it's not actually a compiler, it's a bytecode compiler + interpreter (like python) where the names of the bytecodes match what an x86 assembler would use, but the encoding doesn't (and it doesn't know how to create or link .exe ELF or whatever macos uses)