C语言是用什么语言写的?鸡与蛋的关系

编译器自举原理:从C语言诞生看编程语言如何实现自我编译 编译器作为将高级语言转换为机器码的核心工具,其工作原理涉及词法分析、语法分析、语义分析和代码生成等多个阶段。在计算机科学中,自编译性是指一门编程语言能够用自身编写其编译器,这建立在图灵完备性和语言表达能力的基础上。这种自举技术具有重要的工程价值,它允许语言开发者用更高级的抽象来维护和优化自身工具链,从而提升开发效率并确保生态独立性。在实际应用场景中,从C语言的早期实现到现代Go、Rust等语言的成熟,自举策略通过分阶段、滚雪球式的开发模式,解决了“先有鸡还是先有蛋”的启动难题。本文以C语言编译器的诞生为例, 阅读详情

来自一个小白的提问:“C语言本身用什么语言写的?”
在这里插入图片描述

换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来?用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?

我们假设世界上不存在任何编译器, 先从机器语言说起,看看怎么办。

机器语言可以直接被CPU执行,不需要编译器。

然后是汇编语言, 汇编语言虽然只是机器语言的助记符,但是也需要编译成机器语言才能执行,没办法只能用机器语言来写这第一个编译器了(以后就不用了)。
在这里插入图片描述

汇编语言的问题解决了,就往前迈进了一大步,这时候就可以用汇编语言去写C语言的编译器,我们说这是C编译器的老祖宗。

有了这个老祖宗,就可以编译任意的C语言程序了,那是不是可以用C语言本身写一个编译器?只要用老祖宗编译一下就可以了。

OK, 这么一层层上来,终于得到了一个用C语言写的编译器, 真是够麻烦的。

到这个时候,之前那个汇编写的C语言编译器就可以抛弃了。

当然,如果在C语言之前,已经出现了别的高级语言,例如Pascal,那就可以用Pascal来写一个C语言的编译器。

第一个Pascal的编译器据说使用Fortran写的。而作为第一个高级语言的Fortran,它的编译器应该是汇编语言写的。

关于编译器,这里边有个有趣的传说:
在这里插入图片描述

传说Unix 发明人之一的 Ken Thompson在贝尔实验室,大摇大摆的走到任何一台Unix机器前,输入自己的用户名和密码,就能以root的方式登录!

贝尔实验室人才济济,另外一些大牛发誓要把这个漏洞找出来,他们通读了Unix的C源码,终于找到了登录的后门, 清理后门以后编译Unix , 运行, 可是Thompson 还是能够登录进去。

有人觉得可能是编译器中有问题,在编译Unix的时候植入了后门, 于是他们又用C语言重新写了一个编译器,用新的编译器再次编译了Unix, 这下总算天下太平了吧。

可是仍然不管用, Thompson 依然可以用root登录,真是让人崩溃!

后来Thompson 本人解开了秘密,是第一个C 语言编译器有问题, 这个编译器在编译Unix源码的时候,当然会植入后门, 这还不够,更牛的是,如果你用C 语言写了一个新编译器,肯定也需要编译成二进制代码啊,用什么来编译,只有用Thompson写的那第一个编译器来编译,好了, 你写的这个编译器就会被污染了,你的编译器再去编译Unix , 也会植入后门 😃

说到这里我就想起了几年前的XcodeGhost 事件,简单来说就是在Xcode(非官方渠道下载的)中植入了木马,这样XCode编译出的ios app都被污染了,这些app就可以被黑客利用做非法之事。

虽然这个XCodeGhost和Thompson的后面相比差得远,但是提醒我们,下载软件的时候要走正规渠道,从官方网站下载,认准网站的HTTPS标准,甚至可以验证一下checksum。
在这里插入图片描述

可能有人问:我用汇编写一段Hello World都很麻烦,居然有人可以用它写复杂的编译器?这可能吗?

当然可能,在开发第一代Unix的时候,连C语言都没有, Ken Thompson 和 Dennis Ritchie 可是用汇编一行行把Unix敲出来的。 WPS第一版是求伯君用汇编写出来的, Turbo Pascal 的编译器也是Anders 用汇编写出来的,大神们的能力不是普通人能想象得到的。
在这里插入图片描述

对于编译器来说,还可以采用“滚雪球”的方式来开发:

还是以C语言为例,第一个版本可以先选择C语言的一个子集,例如只支持基本的数据类型,流程控制语句,函数调用… 我们把这个子集称为C0。

然后用汇编语言写个编译器,只搞定这个语言的子集C0,这样写起来就容易不少。

C0这个语言可以工作了,然后我们扩展这个子集,例如添加struct,指针… ,把新的语言称为C1。

那C1这个语言的编译器由谁来写? 自然是C0。

等到C1可以工作了,再次扩展语言特性,用C1写编译器,得到C2。

然后是C3, C4… 最后得到完整的C语言。

这个过程被称为bootstraping , 中文叫做自举。

学习C++之前一定要先学习C语言吗?先有鸡还是先有蛋呢? 初学编程的小伙伴应该都会遇到这个疑问吧? 因为最近总是有小伙伴问这个问题,所以今天在这里统一以文章的形式回答大家。都是干货,认真阅读哦~ C++读作“C加加”,是“C Plus Plus”的简称。 顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”,就像 iPhone 8P 和 iPhone 8、Win10 和 Win7 的关系。 从... 阅读详情

相关推荐

C语言判断关系R是否为自反关系

判断关系R是否为自反关系。键盘输入R的关系序偶,程序输出判断结果 #include <stdio.h> #include <stdlib.h> //输入关系 void input(char **a,int n) { int x,y; printf("输入关系,使用1~n之间的整数,使用\",\"分开,例如1,2,完成后输入0,0退出\n"); for(;;) { scanf...

SUNYAN_WADE的博客 3762

C语言这么厉害,它自身又是用什么语言写的?编写过程被称为自举!

来自一个小白的提问:“C语言本身用什么语言写的?” 换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来?用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡? 1 我们假设世界上不存在任何编译器, 先从机器语言说起,看看怎么办。 机器语言可以直接被CPU执行,不需要编译器。 然后是汇编语言, 汇编语言虽然只是机器语言的助记符,但是也需要编译成机器...

HUYA69的博客 1036

C语言中的字符串与数组的关系

在C语言中,字符串和数组之间的关系十分紧密。字符串本质上是字符数组,数组名是指向数组首元素的指针,而指针则可以用来遍历和操作字符串。理解字符串和数组之间的关系,以及如何通过指针高效地操作字符串,是学习C语言的一个重要部分。理解字符串与数组的差异也有助于避免一些常见的错误,例如对常量字符串的修改或数组越界访问等问题。同时能够在C语言中更加灵活地使用字符串和数组,编写更高效、更可维护的代码。

hzz812503533的博客 1292

C语言这么厉害,它自身又是用什么语言写的?

C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡? 1 我们假设世界上不存在任何编译器, 先从机器语言说起,看看怎么办。 机器语言可以直接被CPU执行,不需要编译器。 然后是汇编语言, 汇编语言虽然只是机器语言的助记符,但是也需要编译成机器语言才能执行,没办法只能用机器语言来写这第一个编译器了(以后就不用了)。 汇编语言的问题解决了,就往前迈进了一大步,这时候就可以用汇编语言去写C语言的编译器,我们说这是C编译器的老祖宗。 有了这个

wy122222222的博客 610

通俗范畴论12 鸡与蛋的故事

本文通过"鸡与蛋"的循环相生问题,展示了如何用范畴论方法分析和建模现实世界的复杂关系。作者首先尝试用简单的范畴结构(鸡与蛋作为对象,下蛋和孵化作为态射),发现存在边界问题(如公鸡不下蛋)。为处理异常,引入空元素概念。随后采用逆向思维,从"来源"而非"产生"的角度重构范畴,获得更简洁的表达。进一步丰富模型时,运用直和(区分公鸡/母鸡、受精卵/非受精卵)和直积(蛋父母)结构,展示了范畴论如何精确捕捉复杂系统中的各种关系。文章强调,范畴论不仅是一种数学工

RockTec的专栏 150

利用MobaXterm解密Session密码的实战指南

本文提供了利用MobaXterm解密Session密码的详细实战指南,帮助运维工程师和开发者在忘记密码时找回加密存储的远程连接信息。通过Python脚本和注册表操作,逐步解析MobaXterm的AES加密机制,实现密码解密,并分享安全建议和常见问题解决方案。

weixin_26759093的博客 232

C4:4个函数,528行代码实现可自举的 C语言编译器

以下内容转载自https://www.toutiao.com/i6831502722718499340/ 引言 自从华为方舟编译器横空出世,一举成为全民网红之后,一下子点燃了大家对编译器的热情。不过,对于大多数人来说,编译器仍然是遥不可及的神秘存在。 今天,介绍一个国外大牛写的C语言编译器 - C4,揭开编译器的神秘面纱。原来实现一个具备基本功能的编译器,竟是如此简单! C4:4个函数实现的C语言编译器 C4, C in four functions。 它是一个C语言编译器项目(项目地址在文末.

Shanks 4881

告别概念晕眩:用TC3xx SMU和TLF35584的配置实例,搞懂ASIL D功能安全落地

本文通过英飞凌TC3xx系列MCU的SMU模块与TLF35584电源管理芯片的协同配置实例,详细解析了如何实现符合ASIL D功能安全标准的刹车辅助ECU。文章涵盖SMU报警源配置、响应动作类型、TLF35584的安全状态管理,以及构建完整安全闭环的实践方法,帮助工程师将抽象的安全概念落地为具体设计方案。

weixin_30647065的博客 439

程序翻译过程详解

gcc和g++都是编译器,C语言可以用gcc或者是g++来进行编译,但推荐使用gcc来进行编译。但C++语言只能用g++编译器来进行编译。

m0_74265792的博客 1949

面板数据门槛归回分析,xthreg的安装,xthreg2安装包

我用的是Stata17,数据是不平衡的面板数据,需要用到xthreg2,虽然我找到了xthreg2.ado,但是还需要安装xthreg,因为运行xthreg2需要xthreg包顺带安装的lxthreg.mlib文件。但是!我后来发现还是不行,最后是去买了一个真正能用到xthreg2的lxthreg.mlib文件,才可以运行。

weixin_55252589的博客 1万+

N32在Keil中J-Link识别失败的排查与修复指南

本文详细解析了在Keil开发环境中,J-Link调试器无法识别N32系列MCU的常见问题。通过分步指导,从检查修改Keil工程配置文件、更新J-Link驱动,到手动添加N32专用设备支持包,系统性地提供了排查与修复方案,帮助开发者快速恢复调试连接,确保开发流程顺畅。

306

百鸡问题(入门级算法)(C语言)

//百鸡问题 //百钱换百鸡 #include <stdio.h> /*main() { int chicken,cock,hen; for (cock=0;cock<=20;cock++) for (hen=0;hen<=33;hen++) for (chicken=0;chicken<=100;chicken++) { if((5*...

James_bobo的博客 4365

VBA中如何使用Edge内核Browser?

在微软宣布停止对IE的支持后,许多使用VBA中Web Browser的用户遇到了困境,因为Web Browser使用的IE内核。然而微软并没有给出支持Edge的新版Web Browser,网上许多第三方的库也不够完善。经过调研,libEdge可以较好的和VBA集成,实现在Excel中打开Browser,甚至能够通过执行js代码,获取web页面的信息。项目需要WebView2Loader.dll和LibEdge.dll两个库,区分x86和x64版本。

金木AI 2401

百钱买百鸡——c语言算法实现

题目: 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何? 一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少。 解析: 要解这道题就得找出题目中所包含的所有等量关系,从题目标题中可以找到两个:“百钱”、“百鸡”,若我们设公鸡、母鸡、小鸡分别为x、y、z只,则有以下等式:x+y+z=100,

羞答答的玫瑰静悄悄地开 3万+

Python 爬虫实战:龙虎榜机构买卖数据爬取与代码详解(附数据分析)

龙虎榜是证券市场中重要的市场信息之一,记录了当日大宗交易及机构买卖情况,包括机构名称、买卖方向、成交金额、成交股数、买入卖出价格等信息。通过分析龙虎榜数据,投资者可以更好地了解市场动向和机构投资者的行为,从而做出更准确的决策。本文将详细介绍如何使用 Python 编写爬虫程序,高效地抓取龙虎榜机构买卖数据,并进行数据分析。我们将从环境搭建、数据抓取、数据存储到数据分析等关键步骤逐一展开,帮助读者掌握完整的爬虫实战流程。

u014481728的博客 703

YOLOv5 自定义模型 Android 部署完整指南

本文详细介绍了将YOLOv5模型部署到Android设备的完整流程,包含三个核心部分:首先验证官方模型测试,确保基础环境配置正确;随后进行模型转换,从PyTorch导出ONNX格式并优化,再转换为NCNN格式;最后在Android项目中集成自定义模型,包括文件替换、参数修改和代码适配。教程基于YOLOv5 6.1版本,使用NCNN框架进行移动端推理,涵盖了常见问题解决方案和关键配置要点,为开发者提供了从训练到部署的完整技术路线。

FJN110的博客 592

C语言百钱买百鸡

如果对于某种组合,剩余的鸡的数量可以正好被1整除(意味着可以买到的小鸡的数量是整数),并且剩余的鸡的总价等于剩下的鸡的数量乘以1(意味着剩下的都是小鸡,没有公鸡或母鸡),那么就打印出这种组合的数量。在这个问题中,我们可以先解决一个更小的子问题,即“用100元买少于100只鸡的所有可能的组合方式”,然后使用这些组合方式来构建完整的解。但是需要注意的是,这个解法假设了所有的小鸡都是以相同的单价购买的,如果小鸡的价格可以有所不同,那么这个问题会变得更加复杂,需要使用其他的方法来解决。然后我们使用两层循环来计算。

3517

基于lstm+gru+transformer的电池寿命预测健康状态预测-完整数据代码

基于lstm+gru+transformer的电池寿命预测健康状态预测-完整数据代码

882

GCC和C语言,鸡生蛋还是蛋生鸡?

最后我想说,真的很佩服当年这些大佬,编程语言不好用,就发明一门编程语言,缺编译器就开发一个编译器,操作系统不好用就开发一个操作系统,更厉害的是,这些五六十年前搞出来的东西直接沿用到今天,还成为了整个计算机工程体系的基础设施,实在是吾辈楷模啊!1、先定义出一个最简单版的高级语言Q0.1,然后用汇编语言写一个能编译这个Q0.1的编译器。C语言最主流的编译器当属GCC,但GCC本身也是由C语言写的,那第一个GCC是怎么来的?一开始的时候,什么高级语言都没有,只有汇编指令,现在我们要发明一种高级语言Q语言。

IT界那些事儿 254

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言字符型char和整型int的关系和示例

1、字符就是整数 字符和整数没有本质的区别。可以给 char变量一个字符,也可以给它一个整数;反过来,可以给 int变量一个整数,也可以给它一个字符。 char 变量在内存中存储的是字符对应的 ASCII 码值。如果以 %c 输出,会根据 ASCII码表转换成对应的字符,如果以 %d 输出,那么还是整数。 int 变量在内存中存储的是整数本身,如果以 %c 输出时,也会根据 ASCII码表转换成对...

C语言技术网-码农有道 2万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

先有鸡还是先有鸡蛋?计算机语言发展史给出的答案

先有第一只鸡还是先有第一只鸡蛋?这是个悖论。没有鸡哪儿来的鸡蛋呢?同样,没有鸡蛋怎么孵出鸡呢?计算机语言中其实也有类似的现象。以C语言和它的编译器gcc为例。C语言的编译器是用C语言写的,这样看来应该先有C语言。可是如果没有C语言编译器,C语言也没法运行。这里C语言就好像鸡蛋,而C语言编译器就好像是鸡。鸡孵化鸡蛋,C语言编译器编译C语言。在C语言这个范畴里,先有C语言还是先有C语言编译器也是一个悖

javayuan的专栏 3157

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

学C语言和C++它有毛关系吗?

这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图。 实不相瞒,这类问题之前也经常看到,但是我忘了截图了。 每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊聊吧,如果小伙伴们有不同看法,也欢迎批评指正,评论区见。 本文在开源项目:https://github.com/hansonwang99/JavaCollection 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中... ” C语言和C++到底是

CodeSheep 1万+

c语言中数组与指针的关系

/来源网络,仅限个人学习记录适用/ 指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用。   1.指针与数组的关系   当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。 如:   char str[20], *ptr;   ptr=str;   ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之

hh_buddy的博客 4652

C语言和C++到底有什么关系?

C++ 读作“C 加加”,是“C Plus Plus”的简称。顾名思义,C++ 就是在 C 语言的基础上增加了新特性,玩出了新花样,所以才说“Plus”,就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的关系。C 语言是 1972 年由美国贝尔实验室开发成功的,在当时算是高级语言,它的很多新特性都让汇编程序员羡慕不已,就像今天的 Go 语言,刚出生就受到追捧。

zdoeo的博客 2593

c语言中.h文件和.c文件的关系

详解C语言项目中.h文件和.c文件的关系 在编译器只认识.c(.cpp))文件,而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地,人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件。但更为恐怖的是,当其中一个声明有变更时,就需要检查所有的.c(.cpp)文件。 于是人们将重复的部分提取出来,放...

weixin_43455338的博客 1万+

先有鸡还是先有蛋,程序员怎么看

先有鸡还是先有蛋,这个问题你是否也想过?这种具有互相依赖关系的情况,其实相对于经常接触电子产品和信息系统的程序员来说,也很常见。你有没有想过,这种现象就好比现代CPU的设计,需要在PC电脑上设计,而PC电脑的运行又依赖CPU。好比编写操作系统的人,也是在操作系统中开发。好比go语言的编译器,还是用go语言写的。 go语言发展史 作为程序员,最近追踪了一下go语言的发展史,发现go的编译器,最开始是用c语言写的。有些初学者可能不清楚,简单科普一下编译器(compiler),有了编译器,你写的代码.

donlian的专栏 499
上一篇: 【JVM】深入了解JAVA原理,你得先了解它!
下一篇: c++优先队列的用法 (priority_queue)
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值