DadHacker on why C is staying
dadhacker.com
dadhacker.com
>> Some people seem to think that C is a real programming language, but they are sadly mistaken. It really is about writing almost-portable assembly language
And that's why comparing C to other, more modern languages is kind of useless - it all comes down to what kind of programming you're doing. Even though more expressive languages have been created and more efficient ways to create programs are around, C is a very nice balance between high-level syntax and low-level actions.
It's such a silly argument. Good programmers pick the language that matches the problem they are trying to solve. Anyone that considers themselves a hacker isn't a square peg in round hole kind of person. They have several tools in their bag and will pick out the most appropriate one for the job.
That's all the comes to mind these days when I see these arguments: people need to open up their field of view and see what other great language exist for their craft. Did Leonardo only use paintbrushes to write in his notebooks?
I seem to remember a study someone did with CISC machines like VAX. On average, a C statement resulted in 2.5 machine language instructions.
edit: Added the text "easily and succinctly" as a qualifier on doing things to bits in response to stcredzero's comment. It isn't that C is the only language to allow it, it is that C allows one to do it without obscuring your intent. C# handles this quite well with unsafe blocks, Java not so much.
I don't see why arbitrary pointer operations are necessary anymore for memory management and the other things. I think this is something left over from the days when we had to squeeze every iota of performance out of machines. I suspect that entire systems could be built with references and almost no pointer arithmetic, and that we're simply stuck in the way we've always done things.
So what if we give up 20 or 30% of the CPU to do this? Pretty soon, we'll be trying to figure out how to keep 8 cores busy on a typical desktop. How about we use some of this to allow greater abstraction in the OS kernel and device drivers?
Squeezing out performance is pretty much the job description of system programmers. Can you give a compelling reason to change that?
Pretty soon, we'll be trying to figure out how to keep 8 cores busy on a typical desktop.
No, we won't. Software becomes twice as slow every two years. Things will stay pretty much the same as they've always been.
Achieving a higher degree of abstraction, more straightforward availability of system resources to programmers, higher levels of code reuse.
BeOS/Haiku already achieves this with C++. I think we can improve on this with something like Go.
Present-day system programmers seem to be able to build decent enough operating systems and the like at the level of abstraction C provides, and I suspect that most would consider straightforward management of system resources to be higher priority than straightforward availability of them.
I will concede the possibility that some unambiguously-better system could be written in a higher-level language. However, until evidence demonstrates that it actually can be done, that remains just a possibility, and one with very real and significant costs. Those costs are not, in the view of many system programmers, worth it.
Already happened: Symbolics Lisp Machines. (Modulo a few decades of programming practice not available to inform the Lisp Machines.)
I suspect that Go could get us there. Interfaces would allow for a higher degree of abstraction. The language would offer much cleaner concurrency. All the memory management cruft would be gone. In such an environment, many things that are now esoteric would become the realm of ordinary programming. I think there is much to be gained.
Yeah, because correctness is better than speed. I am willing to wait 2 milliseconds longer for an image to show up if it means I can open untrusted images without having my machine taken over. (See recent libpng and vorbis buffer overflows in Firefox.)
Remember, higher-level languages are almost as fast as C. For some languages, that "almost" is less than 2x slower.
Software becomes twice as slow every two years.
And it becomes 10x less correct. Less speed for less bugs is a reasonable tradeoff, considering computers double in speed every few years. You can buy speed at newegg for $100, but you can't buy correctness anywhere. No program I use today is particularly slow, but many are horribly incorrect.
So it seems like optimizing for speed is a bad idea. Programs that get me the wrong answer quickly are worthless.
Oh, but you don't write incorrect or unsafe C code... only other people do... I get it...
So this argument is a dead end. There will always be certain type of tasks where it pays to be as fast as possible. Even as computers get more powerful, software gets more complex and more abstracted which means there is always something on the bottom of all the abstractions that needs to run super fast and if it doesn't it will slow everything else to a crawl.
What argument do you think is going on here? My position is "all system programming doesn't have to be in C." It's not "C is dead" or any such nonsense.
The "argument" is a dead end because it exists in the imaginations of other posters. My position isn't such a straw man!
I won't dispute that C is useful. But I think that there is a future in systems programming in concurrency oriented languages.
That is why low-level parts of systems continue to be written in C. Only recently, with the advent of multi-core processors, we started discovering the deficiencies of the almost 40 year old language. The biggest is the missing memory model issue, which makes it impossible to write correct and portable multi-threaded code, which is inevitable at system level.
"C won't go away."
Of course not. [X] won't go away, where [X] is any number of languages.