It is a pain, but languages are software products as well, so they either get new features to keep going on each new release or they wither and fade away.
Eventually some do still die of complexity, replaced by simpler languages, and the cycle reboots, see PL/I, Algol 60/68, ...
C and assembly enter the chat
Wouldn't you agree that the fraction of software written in C or asm has shrunk tremendously over the last decades?
Burroughs (now Unisys ClearPath MCP) showed that intrisics are enough, no need for raw Assembly, so in a sense it isn't as crazy idea, and much developer friendly than the inline syntax used by GCC and clang.
ISAs have to exist but the way that code is generated for them is as varied as the landscape of high level languages.
I often have to Google for definition when I read code. Inevitably someone uses the latest feature.
Used to be foo* x=new foo(). Now it's std::shared_ptr<foo> x=std::make_shared<foo>()
It adds up, every line of code is three times longer than it used to be.
There's `auto` for that reason. No need to duplicate the info.
And: In general code is read more often than written, and the variant with `make_shared` provides extra information on the purpose of the heap allocation. That first line with the raw pointer and new requires following all calls closely to understand the intention. (Aside from also handling the lifecycle, which would this be code which one would have to write elsewhere, your example is missing at least one `delete x` (and likely more handling, considering this being a shared, not unique, ptr)
and the equivalent modern C++: auto x = std::make_shared<x>(); ...
Apps, operating systems, cars, languages, everything is being updated all the time.