首页 > 其他分享 >c语言编译系统工作原理

c语言编译系统工作原理

时间:2024-05-07 14:34:45浏览次数:22  
标签:文件 语言 程序 helloworld 编译 printf 原理 编译系统

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)

image-20240122121550283

预处理

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

如:helloworld.c 程序中引入头文件——stdio.h
预处理器会读取其中的内容,将其中的内容直接插入到源程序中,最终得到另外一个c程序

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

image-20240122114342882

编译

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

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

image-20240122115037257

汇编

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

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

image-20240122115938023

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

链接

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

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

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

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

image-20240122121211888

标签:文件,语言,程序,helloworld,编译,printf,原理,编译系统
From: https://www.cnblogs.com/endermanneer/p/18177161

相关文章

  • 多语言实现 - 世界语言对应的简写
    准备多语言文件:messages_en.properties、messages_zh.propertiesLocalelocale=newLocale("en","US");//设置语言为英文,地区为美国ResourceBundlebundle=ResourceBundle.getBundle("messages",locale);Stringmessage=bundle.getString(......
  • GPT3:使用大型语言模型构建创新的自然语言处理产品(一)
    GPT3:使用大型语言模型构建创新的自然语言处理产品(一)原文:zh.annas-archive.org/md5/2e1cd03e3bd6ec89040bbe656cecdba9译者:飞龙协议:CCBY-NC-SA4.0前言GPT-3,或称为生成式预训练转换器3,是由OpenAI开发的基于转换器的大型语言模型。它由惊人的1750亿参数组成。任何人都......
  • GPT3:使用大型语言模型构建创新的自然语言处理产品(二)
    GPT3:使用大型语言模型构建创新的自然语言处理产品(二)原文:zh.annas-archive.org/md5/2e1cd03e3bd6ec89040bbe656cecdba9译者:飞龙协议:CCBY-NC-SA4.0第六章:挑战、争议和缺陷每一次技术革命都带来争议。在本节中,我们重点关注GPT-3的三个最具争议性的方面:AI偏见被编码到模型......
  • 数据分享|广义线性模型beta二项分布的淋巴结疾病风险预测可视化R语言实现
    全文链接:https://tecdat.cn/?p=36112原文出处:拓端数据部落公众号淋巴结疾病作为一类复杂的健康问题,其风险预测一直是临床和公共卫生领域的研究热点。随着统计学的进步和计算能力的提升,广义线性模型(GLM)成为了分析这类数据的有力工具。特别是当数据呈现比例特性时,beta二项分布作为......
  • Meta公司的Llama3大语言模型
    Github地址:https://github.com/meta-llama/llama3官方介绍:https://ai.meta.com/blog/meta-llama-3/官方项目主页:https://llama.meta.com/llama3/使用说明:https://llama.meta.com/docs/get-started/HuggingFace上的介绍:https://huggingface.co/blog/zh/llama3......
  • 线程池核心原理浅析
    前言由于系统资源是有限的,为了降低资源消耗,提高系统的性能和稳定性,引入了线程池对线程进行统一的管理和监控,本文将详细讲解线程池的使用、原理。为什么使用线程池池化思想线程池主要用到了池化思想,池化思想在计算机领域十分常见,主要用于减少资源浪费、提高性能等。池化思想......
  • C语言常见错误
    C语言常见错误1、链式比较intmain(){inta=3;if(0<a<3)printf("%d\n",a);return0;}​ 在C语言中,条件表达式if(0<a<3)的写法并不会按预期的方式工作。这是因为C语言不支持链式比较(即,不支持a<b<c这样的表达式)。这样的表达式......
  • 《自动机理论、语言和计算导论》阅读笔记:p428-p525
    《自动机理论、语言和计算导论》学习第14天,p428-p525总结,总计98页。一、技术总结1.Kruskal'salgorithm(克鲁斯克尔算法)2.NP-CompleteProblemsp434,WesayLisNP-completeifthefollowingstatementsaretrueaboutL:(1)LisinNP。(2)ForeverylanguageL'......
  • 0506C语言练习:字符串A中删除字符串B中所有相同字母等
    字符串A中删除字符串B中所有相同字母(无论大小写)/***@func: 字符串A中删除字符串B中所有相同字母(无论大小写)*@date2024/05/06*@version1.0:版本*CopyRight(c)[email protected]*/voidrepeat(char*a,constchar*b){......
  • 高级C语言7
    预处理:程序员所编译C代码不能被直接编译,它需要一段程序把它先翻译一下,被翻译过程预处理,负责翻译的程序叫预处理器,被翻译的指令叫预处理指令,C代码中以#开头的都是预处理指令。gcc-Exxx.c查看C代码的预处理结果,显示在终端gcc-Exxx.c-oxxx.i把预处理的结果保存到文件中,以.......