컴퓨터는 계산(computation)을 하는 기계이고 복잡한 여러 회로들과 주변장치들로 구성되어 있습니다. 이 계산을 하는 주체는 주로 CPU(Central Processing Unit)이며,
현대의 CPU는 대단히 복잡한 구조를 가지고 있지만 스스로 계산을 하지는 못합니다. 어떠한 계산을 해야하는 지에 대한 작동계획(Program)이 있어야 하는데 이것은 CPU가 이해하는 언어인 기계어로 이루어져있습니다.
하지만 안타깝게도 이 기계어는 0과 1(실제 CPU 회로에 입력되는 전기신호)로만 이루어져있어서 보통사람이 기억하고 읽고 쓰기에 적절한 언어가 아닙니다. 그래서 사람들은 어셈블리(Assembly) 언어라는 것을 만들어냈습니다. CPU 명령어들에 영어 이름을 붙여 사람이 소리내어 읽을 수 있으며 사람이 빠르게 이해할 수 있도록 만든 언어입니다. 어쨌든 이 어셈블리어도 기계(CPU)가 이해할 수 없기 때문에, 기계어로 번역이 되어야 실행이 가능해집니다.
어셈블리어에도 기계어와 같은 단점이 있는데, 여전히 CPU의 구조에따라 명령어 및 체계가 달라진다는 것입니다. 즉 프로그래밍을 하기 위해서 타겟 CPU의 레지스터는 몇개이고, 명령어 구조는 어떻게 되어있는 지 알아야합니다.
결국 프로그래머들은 타겟(프로그램이 실행 될 CPU)에 무관하게 쓰일 수 있는 고수준 언어들을 고안해냅니다. 사실상 모든 컴퓨터는 튜링완전(Turing complete)하다고 가정되므로, 그 명령체계가 다르더라도 결국 하는 일/할 수 있는 일은 같습니다. 때문에 마찬가지로 튜링완전한 프로그래밍 언어라면 어떤 CPU를 타겟으로 번역되더라도 특별히 문제될 것이 없습니다. 이 번역작업은 바로 컴파일러라는 고도의 소프트웨어가 수행해주기 때문에 프로그래머들은 개발할 때 타겟 아키텍쳐를 훨씬 적게 고려해도 되게 되었습니다.
어셈블리 언어에서 발전한 고수준 언어들은 ALGOL, B언어 등 다양한 언어들이 있었지만 역대 가장 히트를 친 언어는 바로 C언어입니다. 데니스 리치(Dennis Ritchie)가 유닉스(Unix) 개발을 위해 켄 톰슨(Ken Thompson)과 함께 새로운 언어를 고안하여 1973년에 탄생하게 되었죠.
C언어는 프로그래밍 언어의 역사에 한 획을 그었으며, 아직도 많이 쓰이고 있습니다. 또한 다른 주류 언어인 C++, C#, Java, Perl, PHP, Go 등도 모두 C-family 언어라고 불릴 정도로 여전히 C언어는 비함수형/비스크립트 언어의 대표로서 입지를 지키고 있습니다.