c语言编译系统内部的工作原理

程序生命周期概述

一个程序的生命周期可以被分成四个部分:

  • 创建
  • 编译
  • 运行
  • 退出

以一个简单的 helloworld.c 程序为例:

#include<stdio.h>
int main()
{
printf("hello world!");
return 0;
}

编译的详细过程

通过这条命令

gcc -o helloworld helloworld.c

即可完成对 helloworld.c 的编译,生成可执行程序 hello

这是我们最常使用的编译手段(gcc)

看似很简单,一个命令就能把源码编译成了可执行程序。

实际上,编译的过程可以细分为四个步骤

  • 预处理(Pre-processor)(cpp)

  • 编译(Compiler)(ccl)

  • 汇编(Assembler)(as)

  • 链接(Linker)(ld)

预处理

预处理器会根据以#开头的代码段,来修改原始程序

如:helloworld.c 程序中引入头文件——stdio.h

预处理器会读取其中的内容,将其中的内容直接插入到源程序中,最终得到另外一个c程序

经过预处理器处理后得到的文件通常以 .i 结尾

编译

经过词法分析、语法分析、语义分析、优化等步骤,把c语言程序翻译成汇编程序

对于编译阶段,c语言文件 helloworld.i 经过编译得到输出文件 helloworld.s

汇编

汇编器根据指令集 将汇编程序 helloworld.s 翻译成机器指令,并且把这一系列的机器指令按照固定的规则进行打包

汇编语言文件 helloworld.s 经过汇编后得到 可重定位目标文件helloworld.o

此时,helloworld.o 虽然是一个二进制文件,但是还不能执行

链接

编译器负责把多个可重定位目标文件根据一定规则进行合并

在 helloworld.c 这个程序中,我们调用了 printf 函数(标准c库中的函数),这个 printf 函数在名为 printf.o 的文件中(一个提前编译好的目标文件)

链接器负责把 helloworld.o 和 printf.o 进行合并

最终,经过链接得到可执行文件 helloworld ,此时得到的 helloworld 文件就可以被加载到内存中去执行了

c语言编译系统工作原理的更多相关文章

  1. java复习要点(一)------- java语言的特点、java的工作原理、配置环境变量、java命令的使用

    一.java语言的特点: (1)简单并面向对象 (2)鲁棒并安全: java语言在编译及运行程序时,都要进行严格的检查,防止不匹配问题的发生.如果引用一个非法类型,或执行一个非法类型操作,java减肥 ...

  2. Java语言的特点与工作原理

    Java语言的特点 1.简单性 Java语言与我们常听到的C++语言很像,但是没有C++那么繁琐.因为Java就是在C++之上设计出来的,设计者把C++的一些特性去掉了,这些特性在实际开发中,程序员也 ...

  3. Servlet的生命周期及工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  4. 浏览器内部工作原理--作者:Tali Garsiel

    本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...

  5. HTTP协议请求响应过程和HTTPS工作原理

    HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...

  6. B/S工作原理

    B/S疑问 先对比C/S,在C/S中我们开发时怎么做的,是不是这样:拖控件,写方法,所有的功能基本就是这样,就像我们的机房收费系统,C/S学习完之后,我们开始B/S学习,这里我们接触的是ASP.NET ...

  7. Java中GC的工作原理

    转文: 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个 ...

  8. 轻松搞懂WebService工作原理

    用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...

  9. AJAX工作原理及其优缺点

    1.什么是AJAX?AJAX全称为"Asynchronous JavaScript and XML"(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它 ...

  10. PHP底层工作原理

    最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理: PHP底层工作原理 图1 php结构 从图上可以看出,php从下到上是一个 ...

随机推荐

  1. #trie#A 区间异或

    题目 给定一个长度为\(n\)的序列,询问有多少个\((l,r),1\leq l\leq r\leq n\)满足 \[xor_{l\leq j\leq r}a_j\geq k \] 分析 显然跑一次前 ...

  2. [AHOI2014/JSOI2014/一本通1722]骑士游戏 题解 (spfa做dp)

    题目描述 在游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻击.两种攻击方式都会消耗JYY一些体力.采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个 ...

  3. C 语言入门:如何编写 Hello World

    C 语言简介 C 语言是由 Dennis Ritchie 于 1972 年在贝尔实验室创建的一种通用编程语言.尽管年代久远,它仍然是一款非常流行的语言.它之所以受欢迎的主要原因是它是计算机科学领域的基 ...

  4. 【译】如何在 Visual Studio 中安装 GitHub Copilot

    GitHub Copilot 简介 GitHub Copilot 是一个新工具,可以帮助您在人工智能的帮助下更快,更智能地编写代码.它可以建议代码补全,生成代码片段,甚至为您编写整个函数.GitHub ...

  5. Mybatis总体框架设计

    Mybatis架构概览 Mybatis架构整体设计如下: 接口层和数据库交互的方式 Mybatis和数据库的交互方式有两种 使用传统的MyBatis提供的API: 使用Mapper接口 使用传统的My ...

  6. ChatGPT 背后的“功臣”——RLHF 技术详解 以强化学习方式依据人类反馈优化语言模型

    OpenAI 推出的 ChatGPT 对话模型掀起了新的 AI 热潮,它面对多种多样的问题对答如流,似乎已经打破了机器和人的边界.这一工作的背后是大型语言模型 (Large Language Mode ...

  7. docker 应用篇————日志、元数据、进程查看[五]

    前言 简单介绍一下dokcer的日志.元数据.进程查看 正文 查看日志命令: docker logs -f -t --tail 10 32ae 我这里的一个日志就是: 这个一直输出hello word ...

  8. golang开发 深入理解 context

    context的历史 context包在Go 1.7版本正式加入Go标准库.在加入之前我们看看Go团队核心成员Sameer Ajmani在2014年发表的一篇关于context介绍博客,地址:http ...

  9. 数据结构实验代码分享 - 5 (HashTable - 链接法)

    题目:通信录查询系统(查找应用) [问题描述] 设计散列表(哈希表)实现通讯录查找系统. (1) 设每个记录有下列数据项:电话号码.用户名.地址: (2) 从键盘输入各记录,分别以电话号码为关键字建立 ...

  10. flutter 移动应用程序中打开URL

    url_launcher: ^6.2.5   在Flutter中,url_launcher库是用于在移动应用程序中打开URL的常用工具.它允许你通过调用系统的浏览器或其他应用程序来打开指定的URL,比 ...