百科问答小站 logo
百科问答小站 font logo



C语言本身是用什么语言写的? 第1页

  

user avatar   patronumme 网友的相关建议: 
      

原回答(21/04/10):

老问题了,新人/非专业人士常常会感兴趣,学过一点编译原理的人都不会问这个问题了。


C语言用什么语言编写?问题的出发点有一些问题,感觉好像一种语言一定要依赖另一种语言一样,其实并不存在这样的依赖链。一种语言编写出来的程序真正依赖的是运行时,和语言本身无关。而尽管很多语言例如java,C#,js都有各自的专属运行时,C语言却没有,他的运行时其实就是——CPU。

换句话说只要有一个东西(不管他是什么),只要能帮我把C语言写成的那段字符串,转换成一个能在CPU上运行的程序,那就够了,我可以不用管这个"东西"是什么。是另一个程序,还是一个人手工翻译然后手动烧录CPU指令;是用C语言写成的程序,还是用JS写成的……我都不用再关心了。

这种转换过程叫编译。如果是一个程序而不是人来做这个步骤,那我们把这样的程序叫做编译器程序。已有的C语言编译器程序,几乎都是用C语言编写的。历史上第一个C语言编译器,自然是用汇编语言来编写[有误]。像我上面说的,能不能用JS编写?理论上当然没问题(比如使用nodejs运行时),只要这个语言本身提供字符串处理,文件处理和二进制处理,就足够了。


然后我用C写好一个文本(字符串),用编译器程序帮我转换成一个可以在CPU上运行的程序,这个程序可不可以也是一个编译器程序呢?自然是没问题的。正因为这样C语言编译器才可能越来越庞大,功能越来越多,支持更复杂的语言特性。历史上正是这么迭代的。


更新(21/04/14):

多谢评论区 @RaySir 提醒"第一个C语言编译器用汇编写"这句话是错的。更多细节请参考评论,我这方面了解的也不是很多。

这个问题居然短暂地上了热搜,怪不得赞的数量蹭蹭蹭往上涨。虽然跟高赞没法比,但已经是我拿到的最高赞的回答了,我一乡下人哪见过这个?(知乎果然是一个流量平台,而不是问答平台[狗头])

我再补充一点,有不少回答提到鸡生蛋。我认为这更像是鸡生鸭蛋,鸭生鹅蛋(新的语言标准迭代)……反过来鹅也能生鸡蛋,鹅也能生鸭蛋,但是没什么意义。问题关键还在于要把三者的本质搞清楚:编译器程序,源代码,编译后的程序。当且仅当编译器和编译后的程序都在同一个运行时环境上,且编译后的程序也是一个同语言的编译器,这才算"自举"。事实上现在的汇编器也是用C写的,因为C语言确实好用啊,但现在的汇编器跟一开始还没有C语言时候的汇编器完全不是同一个东西。


user avatar   zhang-hao-72 网友的相关建议: 
      
  1. 当年KT和DMR应该是用的B语言和汇编写的第一个C编译器。当然有了C之后应该就没什么人再用B语言了。
  2. 后来的C编译器大多是用C写的。其他语言也往往要经历这个过程,叫做自举。
  3. 现在的gcc之类是用C++写的。

Algol60 -> CPL -> BCPL -> B -> C


user avatar   levelpp_edu 网友的相关建议: 
      原题未说明“学习艺术”是作为一个爱好还是作为一种职业,答主们请注意区分这两种情况


  

相关话题

  为什么使用virtual关键字在C++与C#会出现不同的效果?求解答。 
  大一新生入学半个月,有比赛需要一个月造出红外循迹智能车,会C语言和c++,要怎么开始入门? 
  既然scanf和strcpy等函数会被编译器报不安全,那么C语言教材为什么还讲这些函数? 
  C++异常处理写的代码太丑怎么办? 
  C/C++在函数调用时,为什么需要先将参数压栈? 
  请问学 C 有必要死磕指针吗? 
  C++中函数返回的过程是什么样的? 
  C 语言中,x += 5 == 4 是什么意思? 
  埃式筛为什么只要筛到根号n就好了? 
  C语言中,为什么指向指针的指针的类型是int **?类型的话直接int*不就行了? 

前一个讨论
如果《原神》策划要出克制雷电将军的怪物,这怪物机制如何设计?
下一个讨论
老公一个月给我1万3,但是我们没有钱旅行,到底是我不会管钱,还是老公给得太少?





© 2024-06-11 - tinynew.org. All Rights Reserved.
© 2024-06-11 - tinynew.org. 保留所有权利