The C language (and all of Unix) was designed to be very terse as a consequence.
The C language (and all of Unix) was designed to be very terse as a consequence.
Speaking of terseness, I love the the fact that C does not have 'fn'.
Obviously, there's no way to go back and edit anything mid-stream, you have to write the whole thing out in one shot.
$ cat foo bar > baz
will join the files foo and bar together into a single file called bazSimilar story with the design of QDOS / MS-DOS / Windows and nowadays with Android. Both designed for super underpowered machines that basically went away less than a decade after they were launched and that will be hobbled because of those early decisions for a long, long time.
If they had gone for wart-free on properly powered hardware, they would be stuck back in Multics land or living with the gnu Hurd—cancelled for being over budget or moving so slowly that projects that actually accomplish what the users need overtake them.
Do I wish that C had fixed its operator precedence problem? Sure. But the trade offs as a total package make a lot of sense.
https://multicians.org/history.html
Instead we pile mitigations on top of mitigations, with hardware memory tagging being the last hope to fix it.
“In retrospect it would have been better to go ahead and change the precedence of & to higher than ==, but it seemed safer just to split & and && without moving & past an existing operator. (After all, we had several hundred kilobytes of source code, and maybe 3 installations....)“
Why is this precedence weird? Bitwise AND tends to be used to transform data while a logical AND tends to be used for control flow.
As in:
if (x & 2 == 2)
...is actually parsed as: if (x & (2 == 2))
...which isn’t intuitive.Perhaps this is why a programmer would want to rewrite a system & tout "funny success stories" about the effort & results?
https://news.ycombinator.com/item?id=25844428
> Why couldn't you just upgrade the dependencies once then set up the same CI/CD you're presumably using for Svelte so that you can them upgrade versions easily?
Because the existing system was painful & time/energy intensive to upgrade. It happens with tight coupling, dependency hell, unchecked incidental complexity, architecture churn, leaky abstractions, etc...
Maintenance hell & > 1 month major version upgrades tend to occur with large, encompassing, first-mover frameworks, often built on a brittle set of abstractions, as they "mature" & "adapt" to the competition. e.g. Rails, Angular...
And there are people claiming that computer scientists are not conservative :)
To what extend this explanation is correct is another question... The article by Denis Richie says "Other fiddles in the transition from BCPL to B were introduced as a matter of taste, and some remain controversial, for example the decision to use the single character = for assignment instead of :=".
It's a kind of butterfly effect :) Mr. Richie prefered "=" over ":=" and fifty years later a server crashes somewhere because somebody wrote a=b=c instead of a=b==c.