C语言的产生源于一个失败的项目,1969年,通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目--Multics工程。该项目的目的是创建一个操作系统,但显然遇到了麻烦;它不但无法交付原先所承诺的快速而便捷的在线系统,甚至连一点有用的东西都没有弄出来。虽然开发小组最终勉强让Multice开动起来,但他们还是陷入了泥沼,就像IBM在OS/360上面一样。他们试图建立一个非常巨大的操作系统能够应用于规模很小的硬件系统中。Multice成了总结工程教训的宝库,但它同时也为C语言体现“小即是美”铺平了道路。

       但心灰意冷的贝尔实验室的专家们撤离Multice工程后,他们又去寻找其他任务。其中一位叫Ken Thompson的研究人员对另一个操作系统很感兴趣,为此好几次向贝尔管理层提议,但均遭否决。在等待官方批准时,Thompson和他的同事Dennis Rithie自娱自乐,把Thompson的“太空旅行”软件移植到不常用的PDP-7系统上。太空旅行软件模拟太阳系的主要星体,把他们显示子啊图形屏幕上,并创建了一架航天飞机。它能够飞行并降落到各个行星上。于此同时,Thompson加紧工作,为PDP-7编写了一个简单的新型操作系统。它比Multice简单得多,也轻便得多。整个系统都是用汇编语言写成的。Brian Kernighan在1970年给它取名为Unix,自嘲的总结了从Multice中获得的那些不应该做的教训。

       是先有C语言还是先有Unix呢?说起这个问题,人们很容易陷入先有鸡还是先有蛋的套套中。确切的说,Unix比C语言出现得早。用汇编语言编写Unix显得很笨拙,在编制数据结构时浪费了大量的时间,而且系统难以调试,理解起来也非常困难。Thompson想利用高级语言的一些优点,但是又不想像PL/I那样效率低下。也不想碰见在Multics中遇到过的复杂问题。在用Fortran进行了一番简短而又不成功的尝试之后,Thopson创建了B语言,他把用于研究的语言BCPL作了简化,使B的解释器能常驻于PDP-7只有8KB大小的内存中,B语言从来不曾真正成功过,因为硬件系统的内存限制,它只允许放置解释器,而不是编译器。由此产生的低效阻碍了使用B语言进行Unix自身的系统编程。

       B语言通过省略一些特性,对BCPL语言作了简化,并发扬了“引用数组元素相当于对指针加上偏移量的引用”这个想法。B语言同时保持了BCPL语言无类型这个特点,它仅有的操作系统就是机器的字。Thompson发明了++和--操作符,并把它加入到PDP-7的B编译器中。它们在C语言中依然存在,很多人天真的以为这是由于PDP-11存在对应的自动增/减地址模型,这种想法是错误的!自动增/减机制的出现早于PDP-11硬件系统的出现。

      当1970年开发平台转移到PDP-11以后,无类型语言很快就显得不合时宜了。这种处理器以硬件支持几种不同长度的数据类型为特色,而B语言无法表达不同的数据类型。效率也是一个问题,这也迫使Thompson在PDP-11上重新用汇编语言实现了Unix。Dennis Ritchie利用PDP-11的强大性能,创立了能够同时解决多种数据类型和效率的“New B”(这个名字很快变成了“C”)语言,它采用了编译模式而不是解释模式,并引入了类型系统。每个变量在使用前必须先声明。