C is the second language we learned and one we spent many years programming. While it may not as simple to leverage libraries like Python and compilation of complex systems is an art unto itself, it is a powerful and efficient language.
Most flavours of Unix will come with a built into c compiler, so we shall start assuming you have one at the ready.

As always, when starting with a new language, or returning to it after a bit of a break, we like to test out the tooling plumbing with a simple “Hello World” program, like the following hello.c. Note the ‘\n’ is add as linefeed to ensure a cleaner output.
#include <stdio.h>
int main() {
printf("Hello World\n");
}
We can then compile and run it, using -o to specify the name of the executable program, to avoid the default of a.out
> cc -o hello hello.c
>./hello
Hello World
We are can confidently create more complicated programs.
Make File
With a hello world program, it is simple enough to do a command line compilation. As your program grows in complexity, with multiple files, libraries and other dependencies, a makefile can be very useful to perform both complex compilations as well as to speed up compilation by doing only what has been changed.
In the makefile, you can specify, the following, which build up over time to define a complex system, with many inter-dependencies.
- dependencies for a compiled entity
- how to compile it
Consider the following simple makefile for your hello world. It will get run ehe hello.c has been updated, and it runs the same compilation command we did earlier, manually. Note that is a tab, not spaces, before the ‘cc -o …’
hello: hello.c
cc -o hello hello.c
We can run the make file using the ‘make’ command. Our first attempt does nothing since hello.c has not been updated since we last generated our hello executable. We have forced a compilation by using the ‘touch’ command to update the timestamp on the file, but updating the code will do the same.
> make
make: `hello' is up to date.
> touch hello.c
> make
cc -o hello hello.c