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

2024-03-03 05:30

本文主要是介绍你是否好奇,第一个C语言编译器是怎么来的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在编译型语言中,软件是由编译器编译而来的,编译器本身也是软件,那编译器又是怎么来的呢?咋一看这个问题,感觉又要掉入“鸡生蛋,蛋生鸡”这样无止尽的循环中了。下面以C语言编译器为例,介绍下C编译器是什么来的。

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

C语言之父

  C语言并不是第一门编程语言,在它之前,已经有其他编程语言存在了,例如B语言、Fortran,汇编等。C语言的设计参考了B语言,历史上第一个C编译器是使用B语言编写的,甚至有可能是由B+汇编混合编写。在这里我们需要明确一点,C语言的发展并不是一蹴而就的,而是经历了多年的完善和修改才被推出(C语言诞生于1969 - 1973年间,由贝尔实验室的汤普逊(Ken Thompson)和里奇(Dennis Ritchie)二人共同发明,正式成型是在1973年。)。同样,C编译器也是经过逐次迭代更新才最终形成具备完整功能的C编译器。

  C语言具有自举特性,自举的意思是该语言的编译器可以编译出编译该语言的编译器。

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

 

是不是有点绕?话说我自己都差点没读懂自己写的话。说简单一点就是该语言不需要借助其他语言就可以编译出给自己用的编译器。但是,第一个编译器必须是通过其他语言编译出来的(先有鸡),有了第一版编译器之后,才能实现编译器的自我迭代。在用B语言编译出第一个C编译器后,利用C语言的自举特性,就可以像滚雪球一样,由最初的一个只具备基本功能的C编译器不断迭代,开发出支持更多特性的C编译器,并最终形成我们现在使用的版本。如果你有兴趣,可以在互联网上下载到最新的gnu C工具链源码并自行编译出gcc编译器。除了第一版C编译器以外,C编译器的源码早已经脱离了B语言,使用C语言本身编写了。

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

gcc源码下载地址

  知道了C编译是怎么来的,如果你还好奇B语言编译器是怎么来的,那就是用汇编写出来的。汇编器怎么来的,是用机器语言写出来的。套用道家的说法:机器生汇编,汇编生B,B生C,C生万物。

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

 

这篇关于你是否好奇,第一个C语言编译器是怎么来的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768591

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam