Reading the transcript of Stalin, Molotov, etc's conversation with Eisenstein was really interesting. Even if you disagree with their analysis and what they're doing, it's clear they know the period very well--it's hard to imagine modern politicians speaking on history like that.
It's hard to imagine a modern head of state incapable of delivering that level of basic national mythology/history. There's probably the occasional counterexample but this is common enough to regularly pop up in available transcripts of national leaders meeting to this day.
Thank you for making it free! I've used it on my blog (https://vgel.me) forever, since back before I ever would've paid for analytics, and it's been rock-solid the whole time. Some of the most "set it and forget it" software I use. I definitely owe you a donation so I'm glad I saw this!
Oh, interesting--I remember messing around with flags on the stack but was having issues with the WASM analyzer (it doesn't like possible inconsistencies with the number of parameters left on the stack between blocks). I think your solution might get around that, though!
I've found struct fields that are pointers far more common than pointers to pointers to structs, so if nothing else it feels like *(p->target) is a more widely useful interpretation of *p->target than (*p)->target would be.
Regarding "n = -5", it would presumably be interpreted as "n=(-5)", same as today. Operators don't have spaces in them. So "n- -5" is "n-(-5)", rather than "n--5" (not valid).
As you note in your edit; we already have to watch for that pitfall :)
so really the best way out is to be as verbose as possible imo; a = a + c or auto nodep = *nodepp; nodep->next;
Compilers and compute performance have grown to make the difference negligible for code output and compilation times but they definitely take a lot of mental complexity out of such scenarios (anything helps when grokking 10k+ lines of code).
Maybe not the language choice, but the codegen of this compiler is terrible because of the single-pass shortcuts (for example, it unconditionally loads the result of all assignment operations back to the stack just in case you want to write `a = b = 1`, even though 99% of the time that load is immediately thrown away.)
Well, I set the 500 line budget up front, and that was really as much as I could fit with reasonable formatting. I'll be excited to see your 500 line C compiler supporting all those features once it's done ;-)