Linux的编译器

news2024/11/20 10:26:33

程序编译的过程

程序的编译过程是将源代码转换为可执行文件的一系列步骤。这个过程涉及多个阶段,主要包括预处理、编译、汇编和链接。下面详细介绍每个阶段:

1. 预处理(Preprocessing)

在实际编译之前,源代码文件首先经过预处理器处理。预处理阶段主要处理那些以井号(#)开头的指令,如宏定义(#define)、文件包含(#include)等。预处理器执行的任务包括:

  • 宏展开:将所有的宏定义替换为相应的值。
  • 文件包含:将包含指令(#include)指定的文件内容插入到源代码文件中。
  • 条件编译:根据特定的条件编译指令,决定是否编译代码的特定部分。
  • 移除注释:从源代码中移除所有注释。

2. 编译(Compilation)

预处理后的代码(现在是纯文本)被送到编译器,编译器将其转换成汇编代码。编译阶段的主要任务是:

  • 语法分析:检查代码是否符合语言的语法规则。
  • 语义分析:检查代码中的表达式和语句是否有意义(比如类型检查)。
  • 生成中间代码:生成一种更接近机器语言的中间表示形式,通常是汇编语言。

3. 汇编(Assembly)

汇编器接收编译阶段生成的汇编代码,将其转换为机器码(二进制代码)。每一条汇编指令几乎直接对应一条机器指令。生成的输出通常是目标文件(.o 或 .obj 文件),这些文件包含了程序的机器语言表示。

4. 链接(Linking)

程序通常由多个源代码文件组成,这些文件需要被单独编译和汇编。链接器的任务是将一个或多个目标文件合并成一个单一的可执行文件。在链接过程中,链接器还会解决程序中各个部分之间的引用和依赖问题,例如:

  • 解析外部引用:处理程序不同部分或外部库之间的调用关系。
  • 地址绑定:确定程序和数据在内存中的位置。
  • 库链接:将程序需要的库(动态链接库或静态库)合并到最终的可执行文件中。

完整的流程图

源代码 -> [预处理] -> 预处理后的代码 -> [编译] -> 汇编代码 -> [汇编] -> 目标代码 -> [链接] -> 可执行文件

这个过程是高度自动化的,通常由构建系统(如 Makefiles、CMake 等)控制,它会根据需要执行上述所有步骤,生成最终的可执行程序。每个阶段都有专门的工具和软件来执行,比如 GCC 或 Clang(在 C/C++ 开发中)等。

语言自举的过程

语言自举(Bootstrapping a language)是一种使用编程语言的编译器或解释器来编写该语言本身的编译器或解释器的过程。简而言之,这意味着用一种语言编写该语言自身的编译器或解释器。这个过程中,该语言的初期版本通常是用另一种语言编写的,而后续版本则可能完全或部分使用该语言自身来进行重写或优化。

自举过程的步骤

  1. 初始实现:在最开始,编程语言的编译器或解释器通常用另一种已存在的语言编写。这样做是因为初始的编程语言还没有足够的工具和支持来自我编译。

  2. 自我编译:当这种新语言发展到足够成熟,可以支持更复杂的功能时,开发者会使用这种语言自身来重写其编译器或解释器。这意味着新语言现在可以编译自己的编译器,这通常被看作是一种成熟的标志。

  3. 优化和扩展:一旦编译器可以用其自身的语言成功编译,开发者就可以继续使用该语言来优化和扩展编译器的功能。这可能包括添加新的语言特性、优化性能或改进错误处理。

  4. 迭代改进:随着时间的推移,编译器可以不断通过自身来进行迭代改进和更新,这增强了其功能和效率,并可以支持新的编程范式或标准。

自举的优势

  • 独立性:自举减少了对其他编程语言的依赖,使得编程语言及其工具链更加独立。
  • 演示能力:使用一种语言编写其自身的编译器是对该语言功能强大和成熟度的展示。
  • 自我验证:自举过程可以作为一种验证手段,证明语言足够强大,能够处理复杂的编程任务,如编写和处理编译器代码。

自举的例子

  • C语言:C语言最初的编译器是用汇编语言编写的,但很快之后,C的编译器就开始用C语言本身来编写,这是最著名的自举案例之一。
  • Pascal:Niklaus Wirth 设计的 Pascal 语言也是先用其他语言编写了编译器,后来用 Pascal 自身重写。
  • Rust:Rust 语言最初的编译器是用 OCaml 编写的,现在的 Rust 编译器(rustc)主要用 Rust 本身编写。

gcc / g++

GCC(GNU Compiler Collection)是一个开源的编译器套件,支持多种编程语言,其中最为人熟知的是 C 和 C++(通过 G++ 编译器)。GCC 是在自由软件基金会(FSF)的 GNU 项目下开发的,旨在提供一个标准的、高性能、高可靠性的编译器,它在开源和自由软件开发中占有非常重要的地位。

  1. 多语言支持:GCC 最初是作为一个 C 语言编译器开始的,但后来扩展到支持多种语言,包括 C++(G++)、Objective-C、Fortran、Ada、Go,以及 Java 等。

  2. 跨平台:GCC 可以在多种类型的操作系统上运行,包括 Linux、Mac OS、Windows(通常通过 MinGW 或 Cygwin)等,支持广泛的架构,如 x86、x64、ARM、PowerPC 等。

  3. 代码优化:GCC 提供了多种级别的优化选项,可以帮助开发者提高程序的执行效率。从 -O0(无优化)到 -O3(最大优化),还有 -Os(优化空间)和 -Ofast(忽略严格标准的最快速优化)。

  4. 标准遵从:GCC 高度遵循各个编程语言的标准,如 ISO C、C++,并定期更新以支持最新的语言标准。

  5. 调试和错误报告:GCC 提供详细的错误和警告消息,帮助开发者诊断代码问题。配合 GDB(GNU Debugger)使用,可以有效地进行代码调试。

  6. 扩展性:GCC 也支持内联汇编,允许开发者插入架构特定的汇编代码来优化程序,同时支持自定义的编译器插件。

G++ 是 GCC 中的 C++ 编译器,支持 C++ 的所有标准特性,包括最新的 C++20 标准。G++ 不仅能够编译复杂的 C++ 应用程序和库,还支持异常处理、模板编程等现代 C++ 特性。

动态库&&静态库

静态库和动态库是在软件开发中用来实现代码重用和模块化的两种不同类型的库。它们主要的区别在于它们如何被集成和使用在应用程序中。

静态库

静态库是一种在程序编译时期就已经被包含进程序的库。它们通常包含一组编译好的代码,这些代码可以直接链接到最终的可执行文件中。

  • 集成方式:在编译阶段,静态库中的代码被复制到最终的可执行文件中。这个过程是由链接器完成的,链接器将程序中用到的静态库中的对象文件直接集成到程序的可执行文件中。
  • 部署和分发:由于静态库的内容已经被集成到可执行文件中,所以这些程序在分发时不需要附带这些库文件。可执行文件本身就包含了所有必要的代码。

动态库

动态库是一种在程序运行时才加载的库。它们的代码在程序运行时被载入内存,并通过操作系统进行管理。

  • 集成方式:动态库并不是在编译时被包含进可执行文件,而是在程序运行时由操作系统动态地加载。程序在运行时会请求操作系统加载所需的库,并将其链接到正在运行的程序中。
  • 部署和分发:因为动态库不是程序的一部分,所以在分发这些程序时,需要确保动态库可以在目标系统上被访问。通常,动态库需要与程序一起分发,或者确保目标系统已经安装了相应的库。

区别

  • 链接时期:静态库在编译时被集成,动态库在运行时被加载。
  • 体积影响:使用静态库的程序通常体积更大,因为所有需要的库代码都被包含在内;使用动态库的程序体积更小,但需要在运行环境中有对应的库。
  • 运行依赖:静态库的程序运行时不依赖外部库文件,而动态库的程序需要在运行时环境中访问这些库。
  • 更新和维护:动态库更易于更新和维护,因为只需替换单个库文件即可影响所有使用该库的程序;静态库的更新需要重新编译和分发整个程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1661668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs2019 里 C++ 20规范的 string 类的源码注释

(1)读源码,可以让我们更好的使用这个类,掌握这个类,知道咱们使用了库代码以后,程序大致具体是怎么执行的。而不用担心程序出不知名的意外的问题。也便于随后的代码调试。 string 类实际是 库中 basic_strin…

STC8增强型单片机开发【定时器Timer⭐】

目录 一、引言 二、定时器基础知识 三、STC8定时器配置 四、代码示例 五、总结 一、引言 在单片机开发中,定时器(Timer)是一个极其重要的组件,它允许开发者基于时间触发各种事件或任务。STC8增强型单片机作为一款功能丰富的…

【机器学习】逻辑化讲清PCA主成分分析

碎碎念:小编去年数学建模比赛的时候真的理解不了主成分分析中的“主成分”的概念!!但是,时隔两年,在机器学习领域我又行了,终于搞明白了!且看正文!再分享一个今天听到的播客中非常触…

ICode国际青少年编程竞赛- Python-4级训练场-绿色能量1

ICode国际青少年编程竞赛- Python-4级训练场-绿色能量1 1、 Dev.step(3) Dev.turnLeft() Dev.step(3) Spaceship.step(4) Spaceship.turnRight() Spaceship.step(4) Dev.step(3) while Item[1].y ! Dev.y:wait()2、 Dev.step(4) while Item[0].x ! Dev.x:wait() Dev.turnLe…

luceda ipkiss教程 69:导出器件或者线路的三维模型

ipkiss 3.12版加入write_obj函数,可以直接输出器件的三维模型。 如,输出自定义的mmi的三维模型: 代码如下: from si_fab import all as pdk from ipkiss3 import all as i3class MMI1x2(i3.PCell):"""MMI with …

北京车展现场体验商汤DriveAGI自动驾驶大模型展现认知驱动新境界

在2024年北京国际汽车展的舞台上,众多国产车型纷纷亮相,各自展示着独特的魅力。其中,小米SUV7以其精美的外观设计和宽敞的车内空间,吸引了无数目光,成为本届车展上当之无愧的明星。然而,车辆的魅力并不仅限…

学习3D几何和特征一致的高斯溅射目标去除

earning 3D Geometry and Feature Consistent Gaussian Splatting for Object Removal 学习3D几何和特征一致的高斯溅射目标去除 Yuxin Wang 王玉欣 HKUST &Qianyi Wu Monash University &Guofeng Zhang Zhejiang University &Dan Xu HKUST 香港科技大学&吴倩…

java期末复习

java jdk jre jvm .java-------->.class----jvm---->机器语言 编写源文件 编译源文件生成字节码 加载运行字节码 java语句执行顺序 顺序 选择 循环 异常处理 基本语法 方法格式 权限修饰符 返回值声明 方法名称(参数列表){方法中封装的逻辑功能;return 返回值;}–权…

三级综合医院微信预约挂号系统源码,PC后台管理端+微信公众号+支付宝小程序全套源码

智慧医院预约挂号系统,微信医疗预约挂号小程序源码,实体医院预约挂号支付系统源码 本系统主要面向中大型的医疗机构,适用于各级公立和民营医院,可对接院内his、lis、pacs系统。 PC后台管理端微信公众号支付宝小程序 系统支持当日…

mac安装禅道

前提已安装:phpapacheMySQL mac安装 php7.1/apache-CSDN博客 安装MySQL 一、禅道下载 安装官方文档 源码包下载地址:禅道下载 - 禅道开源项目管理软件 。 1. 解压禅道源码包 2. 将解压后的文件复制到Apache访问目录下 (默认路径为 /Libra…

0510_IO5

练习题&#xff1a; #include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <pthread.h>#include <semaphore.h>#incl…

LED出海混战,雷曼光电“冲锋陷阵”的数智化暗线

2022年春天&#xff0c;在北京冬奥会开幕式上&#xff0c;晶莹剔透的“冰雪五环”从巨型冰块中徐徐升起&#xff0c;成为国人经典集体回忆。这个面积达134平方米、重约3吨的冰雪五环&#xff0c;是LED技术与光影艺术的完美融合。深圳LED上市公司雷曼光电参与“冰雪五环”异形屏…

车载电子电器架构 —— 应用软件开发(中)

车载电子电器架构 —— 应用软件开发(中) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

GPT+Python近红外光谱数据分析

原文链接&#xff1a;GPTPython近红外光谱数据分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603913&idx1&sn6eb8fd6f1abcdd8160815997a13eb03d&chksmfa82172ecdf59e389a860547a238bb86c7f38ae3baa14e97c7490a52ef2a2c206f88d503a5eb&token…

推荐几款国内的AI写作工具,好用免费还能在线生成AI文案

AI写作简介&#xff1a; 在专业领域中&#xff0c;人工智能技术的进步正以前所未有的速度推动着写作行业的革新。当前&#xff0c;我们见证了生成式人工智能&#xff08;AI&#xff09;在文本产生领域的广泛应用&#xff0c;其对提升创作效率和拓展创意边界的贡献是显著的。以…

Vue3知识总结-1

前面学习一段时间的前端&#xff0c;但是没有进行过太多的练习&#xff0c;并且对于里面一些重要的知识点也没有去着重的记忆&#xff0c;所以打算在学习Vue3的时候&#xff0c;做一些笔记&#xff0c;方便后面翻看。这个笔记会对于学习一些做一些&#xff0c;而不是一个整体的…

java中的oop(一)、概念

一、三大主线 &#xff08;非官方&#xff09; 成员&#xff1a;属性、方法、构造器、&#xff08;代码块&#xff0c;内部类&#xff09;&#xff1b; 特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;——三大特征&#xff1b; 关键字&#xff1a; this、…

免费软件不一定不好用,分享5个实用小工具

​ 今天继续分享5个超实用的小工具&#xff0c;都是非常小巧精致的免费软件。 1.广告拦截与隐私保护——AdGuard ​ AdGuard是一款跨平台广告拦截和隐私保护软件&#xff0c;支持Windows、MacOS、Android和iOS系统。它能有效屏蔽不必要的广告、弹窗和跟踪&#xff0c;同时抵御…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…