Hacker Timesnew | past | comments | ask | show | jobs | submitlogin

C is advanced assembler. It is an absolutely great language for system level stuff, especially because everything is explicit, no relying on side effects or stuff hidden from view.

The thread of execution is extremely easy to follow.

The only thing I would change if we could revisit the past is that I would add a string primitive to the language with a half decent set of string operators. That would have made my life a lot easier at some point in the past.

The funny thing is that most languages that people use that criticize 'C' are usually at the core levels written in C.

There is probably a good case to be made for the claim that Unix would not exist if it weren't for the C language.



> The funny thing is that most languages that people use that criticize 'C' are usually at the core levels written in C.

The difference is that the people using these higher level languages only depend on a single set of maintainers who need to get the primitives right once instead of every random coder needing to manage buffers, garbage collecting unused memory, threading, and a host of other landmines on each and every project.


I think those 'random coders' would grow up quite rapidly if they had to learn how to program for real.

It's the high level language cruft that is a prime source of all the endless layering of glue on top of other glue that we're stuck with.

Less scripting, more binaries.

I cringe every time I install some minor system level package and I have to include perl, awk, php and python or some other combination of stuff.


Funnily enough the proliferation of those scripting languages has made it easier to get a picture of what's going on if you do get rooted by the consequences of running a flakey C app. In the old days the md5 binary would be broken and you were pretty much screwed if the other guy was good. But these days you can hammer out manual md5 algorithms and do other stuff using perl, python, and anything else at your disposal - things that are deployed by default on contemporary unix distributions. Better still, if you've got a book on unix systems calls you can absolutely fly through troubleshooting techniques that weren't practical before. (Sure the bad guys could just delete your VMs, but then that is a clear sign that the system has had it - and that signal is useful in and of itself - one of the difficult things in a situation like that is making a call on how far gone your system is so you can set short-term priorities in the lead up to rebuilding everything)


Good thing those coders wading around what you seem to consider the shallow end of the coding pool are not writing things like our nameservers, web servers, operating systems, or anything else important. Oh, that's right, they are. And they keep fucking up. Repeatedly.

When this keeps happening over and over again it is time to consider the possibility that the problem isn't the craftsman but the tool.

The advantage of using lots and lots of glue languages is that it forces the important bits to be loosely coupled, adds flexibility to the development and deployment process, and leads to systems that are easier to comprehend and reason about. The only things that should be opaque binaries are system libraries and VMs/runtimes. Everything else should be "glue".


Given the number of lines of C code out there the number of fuckups is a lot less than you'd expect. Because C is usually used in gatekeeper situations (operating systems, compilers, servers, network stacks) when there is a breach it is serious.

I find it hard to conceive of a posix compliant OS written in a higher level language, especially because of the lack of deterministic behaviour when handling interrupts and allocating memory. C is mind numbingly simple at that level which is exactly why it is used in these situations.

But every language makes it possible to write insecure code, C has its own unique challenges:

It isn't that long ago that somebody managed to get an exploitable scenario out of UTF-8, it took me a long time looking at the code to see how it was even possible. In a higher level language that sort of thing is more difficult to achieve, that's for sure.


The funny thing is that most languages that people use that criticize 'C' are usually at the core levels written in C. There is probably a good case to be made for the claim that Unix would not exist if it weren't for the C language.

Check out Oberon (both the language(s) and the operating system(s)) for a look at an alternate universe in which C doesn't exist and Unix never happened. And people are happy. And anything that can be done in C can be done. Although some mistakes are significantly more difficult to commit.


You and I must use different definitions for “side effects or stuff hidden from view” if you think those are things you avoid by programming in C.


The only really 'hard' thing I ever did in C was write an OS with interrupt handlers that passed control to user space.

Debugging that took me more time than I care to remember, I hung that box so often that I hooked the reset switch up to a foot pedal :)

Other than that C has been pretty good to me in terms of showing where the bugs are. Post mortem debugging would usually give you the location of your crash and that plus a little bit of deduction will tell you what you're doing wrong.

Memory overwrites (and stack overwrites) are things that belong to a certain phase of coding where you are still learning the ropes and you have not yet mastered the idiomatic solutions that people will use to avoid such problems. Setjmp and longjmp are also an excellent source of hard to find bugs, as well as multi-threading (the multi-threading problems are not unique to C, some languages are simply better at doing that sort of thing, occam for instance).

I've heard C compared to a race car, it's great as long as you stay between the lines, take a turn too fast and you're heading straight for trouble. Experience (as in bumping your head a couple of times) will make sure that you know how far you can push it.

C is like any other powertool (think chainsaw or plasmacutter), you can easily get hurt but once you've mastered the tool it is quite amazing what you can do with it.

I got in to C after a long period of writing almost nothing but assembly language (x86, 68K and a bunch of 8 bitters) and I remember thinking of C as a very 'high level language'. My perspective has changed a bit since then...


> The funny thing is that most languages that people use that criticize 'C' are usually at the core levels written in C.

The JVM and MS CLR are largely in C++.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: