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

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

前几天,聊到了一个有趣的问题:

C语言最主流的编译器当属GCC,但GCC本身也是由C语言写的,那第一个GCC是怎么来的?

GCC本来就是用来编译C语言的,那当初第一个GCC又是怎么编写出来的呢?

PS:我找到了第一版的GCC源码

https://github.com/huangguiyang/gcc-0.9

这有点类似于那个经典的哲学问题:先有鸡还是先有蛋?

要回答这个问题,可能需要去翻开计算机的发展历史,去历史的痕迹中寻找答案。

首先,C语言是什么时候诞生的?

答案是六十年代末,七十年代初。

那GCC又是什么时候出来的呢?

看吧,GCC是1987年才有了第一个版本,整整比C语言的诞生晚了十多年!那这十多年间,C语言程序是用什么编译呢?肯定有别的编译器。

我们来问问博学多识的ChatGPT同学:

根据ChatGPT的解答,第一个C语言编译器是用B语言写出来的。

我们的问题似乎解答了,但似乎又没有解答。

继续追问下去,那第一个B语言编译器又是怎么来的?这就像科学家一直在追逐的一个问题:世界的起源在哪里?

提到这个问题,就牵出一个重要的概念:自举。

大意说的是编译器可以自己编译自己,在不断迭代中完善,举个例子:

一开始的时候,什么高级语言都没有,只有汇编指令,现在我们要发明一种高级语言Q语言。

1、先定义出一个最简单版的高级语言Q0.1,然后用汇编语言写一个能编译这个Q0.1的编译器。

2、在Q0.1的基础上增加一些语法变成Q0.2,然后用Q0.1+汇编写一个能编译这个Q0.2的编译器。

3、···

在这个过程中Q语言渐渐完善,能编译Q语言的编译器也一步步出来了。

这听起来有些抽象,来看个具体的例子:

现在,你应该知道编程语言和编译器这个鸡生蛋蛋生鸡问题的答案了吧。

最后我想说,真的很佩服当年这些大佬,编程语言不好用,就发明一门编程语言,缺编译器就开发一个编译器,操作系统不好用就开发一个操作系统,更厉害的是,这些五六十年前搞出来的东西直接沿用到今天,还成为了整个计算机工程体系的基础设施,实在是吾辈楷模啊!

再看看如今的我们,哎不说了:

解决高版本GCC在低版本Linux系统的兼容性问题:原理与实战方案 在Linux开发中,动态链接库的版本兼容性是影响程序可移植性的关键因素。GCC编译器在构建时会依赖特定版本的glibc等系统库,这导致在高版本系统编译的程序无法在低版本系统运行。其核心原理在于动态链接机制和符号版本控制,程序运行时需要加载匹配的库文件。这一问题的技术价值在于实现跨系统版本的二进制兼容,保障开发环境与生产环境的一致性。应用场景广泛,包括为老旧服务器部署新功能、CI/CD流水线构建统一交付物等。本文聚焦于高版本GCC与低版本glibc的兼容性困境,通过分析动态链接机制,提供了静态链接、携带动态库 阅读详情

相关推荐

从源码编译安装GCC 10.1.0:完整指南与避坑实践

在Linux系统开发与软件构建领域,编译器是核心工具链的基础组件,负责将高级语言源代码转换为可执行机器码。其工作原理涉及词法分析、语法分析、语义分析、优化和代码生成等多个阶段。掌握编译器的构建与定制能力,对于实现特定版本需求、优化性能、适配交叉编译环境以及深入理解系统底层具有重要技术价值,广泛应用于嵌入式开发、高性能计算、操作系统移植和定制化工具链构建等场景。本文聚焦于GNU Compiler Collection(GCC)这一经典开源编译器套件,以gcc-10.1.0.tar.gz源码包为例,详细拆解其从

weixin_30423065的博客 349

从蛋生鸡到鸡生蛋:Makefile依赖生成的哲学困境与工程实践

本文深入探讨了Makefile在构建系统中自动生成头文件依赖时面临的哲学困境与工程实践。通过分析gcc的-MMD、-MF等关键选项,揭示了依赖生成的自举循环本质,并提供了健壮、高效的解决方案与完整模板,帮助开发者构建能够自我完善的现代构建系统。

weixin_28842269的博客 350

gcc-0.9_gcc源代码_9gcccom_9GCC_9gcc哦_

GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。

gcc configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0

转自:http://blog.sina.com.cn/s/blog_493667730100zt6n.html   从svn checkout svn://gcc.gnu.org/svn/gcc/trunk拿了GCC的最新代码,打算编译了学东西习学习C++ 11的东西,结果在configure的时候出现如下问题: Building GCC requires GMP 4.2+, MPFR 2.

qinglu000的专栏 1万+

CMAC算法原理

2、K1 通过以下运算导出:若 L 的最高有效位等于 0,则 K1 是 L 的左移 1 位。3、K2 通过如下运算导出:若 K1 的最高有效位等于 0,则 K2 是 K1 的左移 1 位。采用了 AES 算法中的类似 CBC 模式的加密方式,即对前一个分组的密文与当前分组的明文进行异或操作后在加密,2、分块处理:首先将消息分成多个固定长度的块,若消息长度不是块大小的倍数,则可以使用填充来将其填充到合适的大小。1、子密钥计算,通过主密钥生成子密钥(key1,key2),子密钥用于最后一个块处理;

sky的博客 1659

C语言手写HTTPD网站服务器

零基础手写C语言http网站服务器,快速入门C/C++后端开发、服务器开发。

程序员Rock的博客 1万+

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

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

javayuan的专栏 3157

Realsense D435i运行ORB-SLAM3

【代码】Realsense D435i运行ORB-SLAM3。

MAX_Hope的博客 2563

gcc egcs编译器带来的混乱

gcc egcs编译器带来的混乱:   egcs1997—1999年曾经是gcc的一个分支,很多系统支持他(如:UltraSPARC、Irix6.2、PPC/RS6000等),unix、SunOS、Linux也都用它作为编译器。   egcs刚开始被很多人看好,如:《Red Hat Linux 5.1安装指南》中这样介绍egcs:“人们正在积极开发这个编译器, 它(egcs)被认为

zzkjliu的专栏 2433

AI订单流异常检测:精准识别与闭环处置

本文系统阐述了订单流AI驱动的可视化与异常解释系统的构建策略。核心包括:1)多维度融合的异常检测技术,结合数据指纹、行为图谱和时序分析实现精准识别;2)分级分类与自动化处置机制,通过规则矩阵和风险熵值量化进行智能决策;3)基于SHAP/LIME的可解释性技术,提升决策透明度;4)千万级数据训练要求,确保模型达到87%以上的F1值。系统采用Flink+PAI实时计算架构,支持从异常检测到根因分析的完整闭环,为电商、金融等领域的订单风险管理提供智能化解决方案。

2401_83000568的博客 1360

Unity中的坐标系及其转换方法

Unity中的坐标系及其转换方法 Unity中有四种坐标系: 1.全局坐标系 World Coordinate System 全局坐标系是用于描述场景内所有物体位置的方向的基准,也称为世界坐标系,Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的,可以使用transform.position来获取游戏对象的世界坐标。 2.局部坐标系 Local Coordinate System 局部坐标系也称为模型坐标系或物体坐标系,每个物体都有自身独立的物体坐标系。当物体移动或改变方向

Z_hongli的博客 8179

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

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

hotmocha的专栏 2114

VN5620以太网测试——环境搭建篇

CANoe(CAN open environment)VN5620 :是一个紧凑而强大的接口,用于以太网网络的分析、仿真、测试和验证。VN5620 接口支持各种可能的应用。它适用于与其他总线系统、网络参与(例如在模拟和生成帧、测试中的负载和错误)的同步以太网监控。在2021年Vector公司的以太网接口卡VN5610和VN5640设备已经陆续停产,相应被VN5620和VN5650代替。

诊断协议那些事儿's blog 8937

GCC 用 C++ 来编译

GCC在2012年8月15日的时候,merge了一个patch – Merge from cxx-conversion branch,这意味着,以后在GCC的编译只能用C++的编译器了,也意味着,gcc的实现代码开始转向C++了。你可能会有两个问题,一个问题是为什么GCC要转成C++的实现?没有C++的编译器,我怎么编译C++编译器的代码?这不是“鸡生蛋还是蛋生鸡”的问题么?那,我们来看一看吧。为...

weixin_36841920的博客 2001

Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

干货来了,GTX IP核配置,搬砖全靠它~~

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

UDF学习(二)基础数据类型与常见宏

thread_loop_c (t,d) 必须与begin_c_loop (c,t)同时使用,但begin_c_loop (c,t)不一定与thread_loop_c (t,d)同时使用。同理thread_loop_f(t,d)必须与begin_f_loop (c,t)同时使用,但begin_f_loop (c,t)不一定与thread_loop_f(t,d)同时使用。begin_c_loop (c,t) 在计算域内对网格单元进行循环。c_face_loop (c,t)遍历网格单元上的所有网格面。

weixin_44386973的博客 857

你是否好奇,第一个C语言编译器是怎么来的

在编译型语言中,软件是由编译器编译而来的,编译器本身也是软件,那编译器又是怎么来的呢?咋一看这个问题,感觉又要掉入“鸡生蛋,蛋生鸡”这样无止尽的循环中了。下面以C语言编译器为例,介绍下C编译器是什么来的。 C语言之父   C语言并不是第一门编程语言,在它之前,已经有其他编程语言存在了,例如B语言、Fortran,汇编等。C语言的设计参考了B语言,历史上第一个C编译器是使用B语言编写的,甚至有可能是由B+汇编混合编写。在这里我们需要明确一点,C语言的发展并不是一蹴而就的,而是经历了多年的完善和修改才被

一口Linux的专栏 3614

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

gcc使用c++

GCC在2012年8月15日的时候,merge了一个patch - Merge from cxx-conversion branch,这意味着,以后在GCC的编译只能用C++的编译器了,也意味着,gcc的实现代码开始转向C++了。 你可能会有两个问题,     一个问题是为什么GCC要转成C++的实现?     没有C++的编译器,我怎么编译C++编译器的代码?这不是“鸡生蛋还是

zhangkongzhongyun的专栏 621

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

GCC 用 C++ 来编译(酷壳)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34081595的博客 147

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

点滴知识:高级程序语言都是怎么发明的?

很有意思的问题,高级语言是用低级语言写出来的吗?是,也不是。 这个问题曾经也困扰过我,这里和大家分享一下我认识到答案的过程。 一开始学计算机的时候,我一直以为C语言这种高级语言,肯定是用汇编语言写出来的。直到大学时候遇到一位很好的Linux老师,给我们分享了一个令人震惊的事实: C语言的编译器,是用C语言写的。 这让班里的小伙伴十分纳闷,这不就是“鸡生蛋,蛋生鸡”的问题吗?要让C语言编译通过,就需要一个C语言编译器。但是C语言编译器是用C写的。那么世界上第一个能执行的编译器,是如何编译的呢? 当时老师所说的

不如敲代码的博客 1167

用TCC实现C语言编译器自举的全过程

Tiny C Compiler(TCC)仅约100KB,却支持C99标准和多平台,具备直接运行C代码的独特能力。通过下载源码并使用TCC自身编译,可完成编译器自举实验,验证C语言“自己编译自己”的经典特性,整个过程简洁高效。

weixin_36328210的博客 1104

关于编译器的自举实现(关于如何实现一门闭环语言)

关于编译器的自举实现(关于如何实现一门闭环语言)

星空_MAX 1508
上一篇: 万亿模型训练需 1.7TB 存储,腾讯混元如何突破 GPU 极限?
下一篇: Windows 11“重大更新”:新版Bing添加至任务栏,iPhone也能在PC端接打电话了!
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值