Why I Write Games in C (yes, C)

I am an unusual beast. All my solo project games I've been making recently have been written in 'vanilla' C. Nobody does this. So I think it might be interesting to explain why I do.

Dry programming language opinions incoming, you have been warned.

What I need from a language

There's some things which are non-negotiable. First of, it has to be reliable. I can't afford to spend my time dealing with bugs I didn't cause myself.

A lot of my games were written for flash, and now flash is dying. I do not want to spend my time porting old games to new platforms, I want to make new games. I need a platform that I am confident will be around for a while.

Similarly I want to avoid tying myself to a particular OS, and ideally I'd like to have the option of developing for consoles. So it's important that my programming language is portable, and that it has good portable library support.

What I want from a language

The strongest thing on my desired, but not required list is simplicity. I find looking up language features, and quirky 'clever' api's incredibly tiring. The ideal language would be one I can memorize, and then never have to look things up.

Dealing with bugs is huge creative drain. I want to produce less bugs, so I want strict typing, strong warning messages and static code analysis. I want bugs to be easier to find, so I want good debuggers and dynamic analysis.

I'm not interesting in high-def realism, but I do still care a bit about performance. Having more cycles available broadens the palette of things you can do. It's particularly interesting to explore what is possible with modern, powerful computers if you aren't persuing fidelity.

Even more than that I care about the speed of the compiler. I am not a zen master of focus, and waiting 10+ seconds is wasteful, yes, but more importantly it breaks my flow. I flick over to Twitter and suddenly 5+ minutes are gone.

I am not an OOP convert. I've spent most of my professional life working with classes and objects, but the more time I spend, the less I understand why you'd want to combine code and data so rigidly. I want to handle data as data and write the code that best fits a particular situation.

The Alternatives

C++ is still the most common language for writing games, and not without reason. I still do almost all of my contract work in it. I dislike it intensely.

C++ covers my needs, but fails my wants badly. It is desperately complicated. Despite decent tooling it's easy to create insidious bugs. It is also slow to compile compared to C. It is high performance, and it offers features that C doesn't have; but features I don't want, and at a great complexity cost.

C# and Java have similar issues. They are verbose and complex beasts, and I am searching for a concise, simple creature. They both do a lot to railroad a programmer into a strongly OOP style that I am opposed to. As per most higher level languages they have a tendency to hide away complexity in a way that doesn't actually prevent it from biting you.

I like Go a lot. In many ways it is C revisited, taking into account what has be learnt in the long years since it was released. I would like to use it, but there are big roadblocks that prevent me. The stop-the-world garbage collection is a big pain for games, stopping the world is something you can't really afford to do. The library support for games is quite poor, and though you can wrap C libs without much trouble, doing so adds a lot of busy work. It is niche enough that I worry a little about long term relevance.

It would be nice to make things for the web, but it feels like a terrifyingly fast moving enviroment. It is particularly scary with the death of flash. I really dislike javascript, it is so loose that I marvel that people are able to write big chunks of software in it. I have no interest in trying.

Haxe feels much more promising than most alternatives. If I do web stuff again I'll be diving in here. There is some good library support. I am a little concerned by its relative youth, will it last? I don't much have else to say about it though, I've only dabbled with the surface.

Jonathan Blow is writing his own language. The language he would want to use. I admire this, and sometimes I toy with the idea of doing the same. It feels like too much to throw away all existing library support, and taking full responsibilty for future compatibility. It is also very difficult, and when it comes down to it I would rather be making games than programming languages.

Why C is still my best fit

C is dangerous, but it is reliable. A very sharp knife that can cut fingers as well as veg, but so simple it's not too hard to learn to use it carefully.

It is fast, and when it comes to compilation I can't think of anything faster.

It can be made to run on just about anything. Usually this is relatively easy. It is hard to imagine a time when this won't be the case.

The library and tooling support is strong and ongoing.

I say this with some sadness, but it is still the language for me.

I absolutely DO NOT mean to say "hey, you should use C too". I full appeciate preferences here are pretty specific and unusual. I have also already written more 'vanilla' C code than most, and this certainly is part of my comfort.

So yeah, that's it :-)

Back to main site