首先c语言是一种语言, 是人们约定的一种编程方式, 就像英语, 法语一样, 是一种语言, 是一种约定的规范.
所谓什么写的, 应该是指c语言的编译器吧.
编译器的作用就是把编程语言变成机器语言, 也就是把"代码"(如.c文件)变成计算机可读的机器语言文件. 所以编译器就是一个程序, 把一种文字转化为另一种文字.
既然编译器是程序, 那任何编程的语言都可以写编译器.
在早期, 计算机只有汇编语言, c语言刚发明的时候只能用汇编语言写c语言的编译器, 但是会比较麻烦.
后来c语言编译器完善后, 可以用c语言再写一遍自己的编译器, 用原来那个汇编语言写的编译器编译通过后, 就得到一个新的c语言编译器(现在就有两个编译器了).
再后来有了JAVA("JAVA是什么写的"同理C语言), 也可以用JAVA来写一个c语言的编译器(以上就有3个C语言编译器了).
也就是说, 一个语言是约定的, 固定的. 但是他的编译器可以有千千万, 不同的人, 不同的语言可以写出很多个同一种语言的编译器. 比较出名的有微软公司写的vc++, 和GNU组织的gcc.
-----------------------------------------
另外补充一点就是, 从一种语言的代码到一种机器的的代码是非常复杂的问题, 不同机器的机器语言都不同, 因此如果有N种语言和M种机器, 那至少应该有N*M个编译器.
后来人们就采用一种中间语言来解决这个问题, 即所有语言都编译成中间语言, 再由中间语言变为机器语言.
这样就把编译器分为了前段和后端.(当然, 中间语言是怎样的也是争论纷纷).