\section{History of C}

C was developed by Dennis Ritchie and Ken Thompson at Bell Labs back in 1973 \cite{Ritchie:1993:DCL:155360.155580}.
Back then, we had gems of programming languages like Fortran, ALGOL, and LISP.
The goal of C was two-fold.
Firstly, it was made to target the most popular computers at the time, such as the PDP-7.
Secondly, it tried to remove some of the lower-level constructs (managing registers, and programming assembly for jumps), and create a language that had the power to express programs procedurally (as opposed to mathematically like LISP) with readable code.
All this while still having the ability to interface with the operating system.
It sounded like a tough feat.
At first, it was only used internally at Bell Labs along with the UNIX operating system.

The first "real" standardization was with Brian Kernighan and Dennis Ritchie's book \cite{kernighan1988c}.
It is still widely regarded today as the only portable set of C instructions.
The K\&R book is known as the de-facto standard for learning C.
There were different standards of C from ANSI to ISO, though ISO largely won out as a language specification.
We will be mainly focusing on is the POSIX C library which extends ISO.
Now to get the elephant out of the room, the Linux kernel is fails to be POSIX compliant.
Mostly, this is so because the Linux developers didn't want to pay the fee for compliance.
It is also because they did not want to be fully compliant with a multitude of different standards because that meant increased development costs to maintain compliance.

We will aim to use C99, as it is the standard that most computers recognize, but sometimes use some of the newer C11 features.
We will also talk about some off-hand features like \keyword{getline} because they are so widely used with the GNU C library.
We'll begin by providing a fairly comprehensive overview of the language with language facilities.
Feel free to gloss over if you have already worked with a C based language.

\subsection{Features}

\begin{itemize}
	\item Speed. There is little separating a program and the system.
	\item Simplicity.
    C and its standard library comprise a simple set of portable functions.
	\item Manual Memory Management.
    C gives a program the ability to manage its memory.
    However, this can be a downside if a program has memory errors.
  \item Ubiquity.
    Through foreign function interfaces (FFI) and language bindings of various types, most other languages can call C functions and vice versa.
    The standard library is also everywhere.
    C has stood the test of time as a popular language, and it doesn't look like it is going anywhere.
\end{itemize}


