| ▲ | Show HN: Xcc700: Self-hosting mini C compiler for ESP32 (Xtensa) in 700 lines(github.com) |
| 81 points by isitcontent 9 hours ago | 16 comments |
| Repo: https://github.com/valdanylchuk/xcc700 Hi Everyone! I just wrote my first compiler! - single pass, recursive descent, direct emission - generates REL ELF binaries, runnable using ESP-IDF elf_loader - very basic features only, just enough for self-hosting - treats the Xtensa CPU as a stack machine for simplicity, no register allocation / window usage - compilable on Mac, probably also Linux, can cross-compile for esp32 there - wrote for fun / cyberdeck project Sample output from esp32: xcc700.elf xcc700.c -o /d/cc.elf
[ xcc700 ] BUILD COMPLETED > OK
> IN : 700 Lines / 7977 Tokens
> SYM : 69 Funcs / 91 Globals
> REL : 152 Literals / 1027 Patches
> MEM : 1041 B .rodata / 17120 B .bss
> OUT : 27735 B .text / 33300 B ELF
[ 40 ms ] >> 17500 Lines/sec <<
My best hope is that some fork might grow into a unique nice language tailored to the esp32 platform. I think it is underrated in userland hobby projects. |
|
| ▲ | uecker 5 hours ago | parent | next [-] |
| Cool! And I do think the world needs more C compilers. There is so much you could do with this language, but it needs to be disentangled from the C++ compiler behemoths. (yes, I now that there are other small C compilers) |
| |
| ▲ | isitcontent 5 hours ago | parent [-] | | There is the TCC. Adapting that would probably be a faster path to a full featured C compiler on esp32 than building up my xcc700. This is more of an educational sandbox project. | | |
| ▲ | uecker 4 hours ago | parent [-] | | I know, and there are chibicc, kefir, etc. .. and I have my own experimental C compiler. | | |
| ▲ | fuhsnn 3 hours ago | parent [-] | | I would love to see how you handle variably-modified types, the way I retrofitted them onto chibicc never felt quite right, and I've never seen another non-gcc/clang compiler fully support noplate's VM type patterns. |
|
|
|
|
| ▲ | boznz 7 hours ago | parent | prev | next [-] |
| Cool, always refreshing to see different approaches to the same problem, and you learn so much by doing, this is more the kind of tinkering I will be doing in retirement. |
|
| ▲ | ladyanita22 5 hours ago | parent | prev | next [-] |
| That's super cool! I have been wondering what could be done with ESP32 if it weren't for the lack of RAM. As a fun of Rust, one thing that saddens me is knowing these things would be difficult to achieve with a Rust compiler, given the language seems to be vastly more complex. Unless someone created a subset of Rust without (some?) safety checks, I guess. |
| |
| ▲ | isitcontent 5 hours ago | parent [-] | | Right, Rust is more complex, and it is the complex bits that make it Rust. There are sure some shortcuts possible for starters, for example scope-based lifetimes like in early Rust versions, but still, to make it a worthwhile upgrade over C, it would take some intermediate representation, and definitely more than 700 lines. There is a lively movement for coding in Rust for esp32, that works, just not on the device I think. |
|
|
| ▲ | saidnooneever 3 hours ago | parent | prev | next [-] |
| hats off. this is really easy to read and well written and easy to comprehend code imho because it only support basic features. its a really nice example to read through thanks. nice inspiration to see its possible to roll your own for this with a bit restricted featureset and goals :). |
| |
|
| ▲ | MobiusHorizons 6 hours ago | parent | prev | next [-] |
| Very cool! What was the shell you are running in the demo video? |
| |
| ▲ | isitcontent 6 hours ago | parent [-] | | Thanks! That is just my small custom experimental mini shell. This project started as a retro DOS-like cyberdeck, and first thing I tried to run there was DOS programs, which is why it looks like that. Only got to COM files, when I learned about elf_loader, so I now focus on that. I might extract and release whatever is valuable/reusable in that shell later on. | | |
| ▲ | MobiusHorizons 4 hours ago | parent | next [-] | | Yeah, very cool. I was thinking about possibly porting it to risc-v and using it on my fpga based core. I was trying to build a monitor style shell, but C like environment would be very cool. | | |
| ▲ | isitcontent 4 hours ago | parent [-] | | Porting to different CPU/bytecodes should be doable. Just keep in mind that in ESP-IDF we also get the dynamic linker and the libc for free (and any other C functions exposed in the firmware). On the other platforms, that may be some extra work for the compiler. |
| |
| ▲ | guestbest 6 hours ago | parent | prev [-] | | Thanks for posting this here. I star’d the project. Getting a portable computer with a minimal flexible and previously well supported operating system was one of my goals for the esp32 as well. I’ll be watching for more. |
|
|
|
| ▲ | nunobrito 4 hours ago | parent | prev [-] |
| Can this run ELF programs that are placed on the memory card? |
| |