百科问答小站 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 网友的相关建议: 
      原题未说明“学习艺术”是作为一个爱好还是作为一种职业,答主们请注意区分这两种情况


  

相关话题

  C/C++ 小括号中为何不能声明变量的同时对其赋值? 
  如果你是一个C++面试官,你会问哪些问题? 
  在C++中链表重不重要? 
  C++中this指针什么情况下是必须要用的? 
  能否把高版本的libstdc++静态连接到一个只暴露纯C接口的动态库中,给低版本c++程序调用? 
  如何把一个文件快速分发到 100w 个服务器? 
  C++ 的智能指针不就基本解决了野指针问题了吗?为什么还要吹捧rust的内存安全? 
  C语言中,write(1,buf,N)与write(0,buf,N)在底层存在什么样的区别? 
  为什么C语言100*1.05=104? 
  传统的try-catch异常处理是否是编程语言发展中的弯路? 

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





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