C语言是用C写的吗没有第一个编译器哪来的C那它到底从哪冒出来的。今天翻了翻老资料才知道这事根本不是传说里那样——C语言不是天才一拍脑袋想出来的它是被逼出来的。Multics项目搞了几年一堆大公司参与结果做出来的东西又慢又占内存贝尔实验室直接退出。汤普森回到自己办公室在一台破旧的PDP-7上写了个小系统连内存都只有8KB。他先用汇编写写完发现太累就弄了个叫B的语言解释执行简单是简单但跑得比蜗牛还慢。后来换到PDP-11机器好点B就不行了。里奇开始改——不是加功能是往硬件上靠。PDP-11有自动增减地址的指令他就把和--加进去寄存器能存16位数据就定int是16位内存按字节寻址char就刚好是1字节。这些不是随便定的是把机器怎么干活原样搬进语法里。连a等于*(ai)这种写法都是为了编译器能直接翻译成一条加法指令不浪费一个时钟周期。第一个C编译器根本不是用C写的。是里奇他们先用汇编写了个极简版本只支持if、while、基础运算和函数调用——小到可以在纸上推演清楚。用它编译出稍强一点的C编译器再用这个编译器去写更完整的C语言和UNIX内核。1973年第三版UNIX内核已经全用C重写了。这过程不是炫技是实在没别的路你不能一边造车一边设计轮子得先用木头轮子跑起来再换铁的、钢的、最后才是合金的。很多人说C可移植其实刚出生那会儿它根本离不开PDP-11。float自动变double因为PDP-11的浮点协处理器只算双精度。register关键字后来没人用了因为编译器自己比人更懂怎么分配寄存器。KR第一版里main()不写返回类型都行void也不需要不是忘了是当时PDP-11上压根没这个抽象需求。C不是通用语言它是PDP-11的镜像只是碰巧长得太像人类写的代码让人误以为它很“高级”。1978年那本《The C Programming Language》一出来大家才发现哦原来别人也是这么写的。它没被当成标准但所有人都照着它干——因为UNIX跟着它一起卖出去了。后来pcc编译器试图把C搬到别的机器上就得砍掉一些直译硬件的特性效率降了但能用了。到1989年ANSI定标准才正式加入void、函数原型、const这些东西。这不是技术升级是妥协C要进大公司、进学校、进课本就得放弃一部分和硬件的硬连接。标准化之后的C慢慢从系统程序员的工具变成了工程师的通用语言。但它的底子没变指针还是能随便算地址数组不检查越界union还是靠程序员自己记哪个字段在用。这不是bug是设计选择——它信任你能管住自己也默认你真正在乎的是机器怎么跑得快而不是代码看起来多安全。现在看C语言它不像Python那样友好也不像Rust那样防错。但它写出来的程序只要不写错就能贴着硬件跑。它的语法古怪但每一条背后都有一台老机器在喘气。它的编译器能自举不是为了秀技术是因为当年没人给它准备现成的工具链只能自己造一把钥匙再用这把钥匙打开下一扇门。C语言没说过它想改变世界。它只是静静地把1970年代一台小机器的脾气刻进了全世界的代码里。它到现在还在用。
C语言本身是用什么语言写的
C语言是用C写的吗没有第一个编译器哪来的C那它到底从哪冒出来的。今天翻了翻老资料才知道这事根本不是传说里那样——C语言不是天才一拍脑袋想出来的它是被逼出来的。Multics项目搞了几年一堆大公司参与结果做出来的东西又慢又占内存贝尔实验室直接退出。汤普森回到自己办公室在一台破旧的PDP-7上写了个小系统连内存都只有8KB。他先用汇编写写完发现太累就弄了个叫B的语言解释执行简单是简单但跑得比蜗牛还慢。后来换到PDP-11机器好点B就不行了。里奇开始改——不是加功能是往硬件上靠。PDP-11有自动增减地址的指令他就把和--加进去寄存器能存16位数据就定int是16位内存按字节寻址char就刚好是1字节。这些不是随便定的是把机器怎么干活原样搬进语法里。连a等于*(ai)这种写法都是为了编译器能直接翻译成一条加法指令不浪费一个时钟周期。第一个C编译器根本不是用C写的。是里奇他们先用汇编写了个极简版本只支持if、while、基础运算和函数调用——小到可以在纸上推演清楚。用它编译出稍强一点的C编译器再用这个编译器去写更完整的C语言和UNIX内核。1973年第三版UNIX内核已经全用C重写了。这过程不是炫技是实在没别的路你不能一边造车一边设计轮子得先用木头轮子跑起来再换铁的、钢的、最后才是合金的。很多人说C可移植其实刚出生那会儿它根本离不开PDP-11。float自动变double因为PDP-11的浮点协处理器只算双精度。register关键字后来没人用了因为编译器自己比人更懂怎么分配寄存器。KR第一版里main()不写返回类型都行void也不需要不是忘了是当时PDP-11上压根没这个抽象需求。C不是通用语言它是PDP-11的镜像只是碰巧长得太像人类写的代码让人误以为它很“高级”。1978年那本《The C Programming Language》一出来大家才发现哦原来别人也是这么写的。它没被当成标准但所有人都照着它干——因为UNIX跟着它一起卖出去了。后来pcc编译器试图把C搬到别的机器上就得砍掉一些直译硬件的特性效率降了但能用了。到1989年ANSI定标准才正式加入void、函数原型、const这些东西。这不是技术升级是妥协C要进大公司、进学校、进课本就得放弃一部分和硬件的硬连接。标准化之后的C慢慢从系统程序员的工具变成了工程师的通用语言。但它的底子没变指针还是能随便算地址数组不检查越界union还是靠程序员自己记哪个字段在用。这不是bug是设计选择——它信任你能管住自己也默认你真正在乎的是机器怎么跑得快而不是代码看起来多安全。现在看C语言它不像Python那样友好也不像Rust那样防错。但它写出来的程序只要不写错就能贴着硬件跑。它的语法古怪但每一条背后都有一台老机器在喘气。它的编译器能自举不是为了秀技术是因为当年没人给它准备现成的工具链只能自己造一把钥匙再用这把钥匙打开下一扇门。C语言没说过它想改变世界。它只是静静地把1970年代一台小机器的脾气刻进了全世界的代码里。它到现在还在用。