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. JDK9的新特性:JPMS模块化

    目录 简介 JDK9中模块的实现 JDK中的module 创建自己的module 深入理解module-info transitive static exports to open pacakge p ...

  2. 一键部署openGauss2.0.1 CentOS 7.6

    一键部署 openGauss2.0.1[CentOS 7.6] 本文档目的是为了帮助高校学生提供基于 CentOS7.6 操作系统,实现 openGauss 数据库一键式安装的脚本. 该脚本执行成功后 ...

  3. openGauss数据库源码解析——慢SQL检测

    openGauss 数据库源码解析--慢 SQL 检测 慢 SQL 检测的定义: 基于历史 SQL 语句信息进行模型训练,并用训练好的模型进行 SQL 语句的预测,利用预测结果判断该 SQL 语句是否 ...

  4. openGauss社区入门(openGauss-常用数据类型)

    常用数据类型 数据类型 说明 布尔类型 boolean true/'1'/'yes' false/'0'/'no' 数值类型 smallint 两字节 int 4 字节 bigint 8 字节 dou ...

  5. CentOS 6.5 LAMP分主机平台的搭建及测试

    CentOS 6.5 LAMP分主机平台的搭建及测试 看似非常之完备,转来抽空测试学习 原文地址:http://www.it165.net/os/html/201403/7595.html 前言   ...

  6. 常用注解使用总结系列: @Order 注解

    @Order 注解 @Order注解主要用来控制配置类的加载顺序示例代码: package com.runlion.tms.admin.constant; public class AService ...

  7. 【ssm】极简的极省力的开发方式——针对简单型EasyUI的增删改查的后台管理

    需要具备技能点: ssm框架搭建,mybatis generator的熟练使用 1.控制器: import java.util.HashMap; import java.util.Map; impor ...

  8. k8s架构与原理介绍

    K8s概述 目录 K8s概述 1.什么是K8s 2.K8s 设计架构 3. k8s重要节点描述 4. 过程原理: 5. k8s的核心功能 6. k8s的历史 7. k8s的安装方式 8. k8s的应用 ...

  9. javascript:eval()的用法

    eval() 是 JavaScript 中的一个全局函数,它可以计算或执行参数.如果参数是表达式,则 eval() 计算表达式:如果参数是一个或多个 JavaScript 语句,则 eval() 执行 ...

  10. echarts使用与踩坑

    0.踩坑点 1.当图表不显示在页面(display:none)执行resize可能会导致图表样式混乱 1. 官网示例 import * as echarts from 'echarts'; // 基于 ...