6 ms·
C72: A port of the earliest C compiler to x86 (2021)
- hnlmorg 5y ago> compound assignment operators are reversed, they are =+, =* Personally I always thought that made more sense than the (now) standard way because when you read it aloud it reads like the operation you’re performing: N equals N plus five N =+ 5 I still find myself occasionally writing those operators that way around even after decades of using C and similar languages.
- ghewgill 5y agoOne of the problems with the old notation is the ambiguity. What does each of the following mean? n =- 5 n = -5 n=-5
- hnlmorg 5y agoAhh yes, that’s a very good point.
- mhh__ 5y agoIf I were designing a new language and where dead-set on the =- form I would make it so: n =- 5 // n equals n - 5 n = -5 // n equals -5 n=-5 //Illegal This can be done, it just requires getting the lexer right.
- adrian_b 5y agoDennis Ritchie, in his paper about the history of C, explains that they became aware of these ambiguities only after the first C implementation, but they considered that it was a too big mistake, so they reversed the order in the next C version.
- Taniwha 5y agomaybe not quite the next version, from memory (and I ported compilers, and the kernels, for both) it was between v6 and v7 Unix
- dn3500 5y agoThat's correct, it wasn't the next version of the Ritchie compiler, it was a whole new compiler, the Portable C Compiler. It used yacc to generate the parser, and yacc complained about the ambiguity. They left the old syntax in for quite a while.
- Taniwha 5y agoYup, almost certainly PCC - which also still has struct fields in a global namespace as a (possible wonderful, possibly horrible) hack to provide the equivalent to unions
- jandrese 5y agoAnother problem: n =* p; Is p a pointer or an integer? Maybe you want to do pointer math, it's a very C thing to do.
- jamesfinlayson 5y agoThat was my thought too - seems like it would be ambiguous even with type information anyway as the readme says this iteration at least, any type can be converted to any other type.
- moonchild 5y agoThe modern notation contains a very similar 'ambiguity'. Compare: x---y, x-- - y, and x - --y.
- mburee 5y agoAnd sadly x-----y won't parse :(
- krylon 5y agoIt's been a while I used C, but I for one am kind of glad that doesn't parse. If you need to do this, you can use parentheses: x - (--y) or (x--) - y
- tom_ 5y agoAll parse fine, and unambiguously, due to the maximal munch rule. x---y is (x--)-y, which is semantically valid. x-----y is ((x--)--)-y - but it's a semantic error, as x-- is not an lvalue.
- gotaquestion 5y agoThis is a great study: the code isn't that large, and it is rather straightforward compared to looking at today's GCC. Thanks for putting this up!
- userbinator 5y agoIf you want to study a tiny "not quite C" compiler, I recommend C4: https://news.ycombinator.com/item?id=22353532 https://news.ycombinator.com/item?id=22353532
- jamesfinlayson 5y ago> no for loops Oh wow, I've read bits and pieces about early iterations of C but I didn't realise for loops weren't there from the start.
- edgyquant 5y agoFor loops are syntactic sugar for while loops, e.g. for(int i = 0; i < 10; i++); Is just int i = 0; while(i < 10) i++;
- kbelder 5y agoHonestly, I think that's cleaner.
- legalcorrection 5y agoThe problem is that the i++ goes at the end of the loop body. When the loop body is long, the increment can be many many lines away from the initialization and loop condition. The increment won't always be as obvious as "i++" and can involve function calls. With a well-written for loop, you can see all of that at a glance.
- zozbot234 5y ago> With a well-written for loop, you can see all of that at a glance. Yes, this is ultimately about the push for structured programming, which involves creating a pattern language of loops with "clean" semantics. Grouping the loop advancing statement with the other parts of a general loop construct helps wrt. recognition of known looping patterns.
- dataflow 5y agoKeep in mind they're not always equivalent. If you have 'continue' in the middle then the for loop will still perform the increment but the while loop won't.
- shric 5y agoAs this compiler is written in modern C, I guess the next logical step is to write a version that can compile itself?