首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >hello程序是如何被编译出来的?

hello程序是如何被编译出来的?

作者头像
编程珠玑
发布于 2019-09-03 03:46:08
发布于 2019-09-03 03:46:08
79500
代码可运行
举报
文章被收录于专栏:编程珠玑编程珠玑
运行总次数:0
代码可运行

前言

hello程序几乎是我们每个人学习C语言写的第一个程序,但是它是如何从.c文本变成可以打印出”hello world“的可执行文件的呢?本文将简单介绍其过程。

Hello World

hello world程序我们再熟悉不过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*include head file*/
#include<stdio.h>
/*the main function*/
int main(int argc,char *argv[])
{
    printf("Hello World!\n");
    return 0 ;
}

编译并运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 gcc -o helloWorld helloWorld.c 
 ./helloWorld
 Hello World!

整个过程一气呵成,但是实际上上面的过程并非像看起来那么简单。它可以大体分为4个步骤:预处理,编译,汇编,链接。接下来我们一一简单介绍这四个步骤做了什么。

预处理

预处理主要是处理源代码中以#开头的指令(#pragma 除外),例如本文hello world程序中的#include,预处理之后会将stdio.h的内容插入到预处理指令的位置。 想要只生成预处理之后的内容,可以使用下面的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -E -o helloWorld.i helloWorld.c #-E参数表示只进行预处理

生成的helloWorld.i即为预处理之后的内容,有兴趣的可以打开文件查看里面的内容,会发现stdio.h的位置被其实际内容所替代。预处理之后,注释内容也会被删除,宏定义会被展开。

编译

预处理之后就需要对生成的预处理文件进行词法分析,语法分析,语义分析,最终产生汇编代码文件,说白点可以简单理解为将C代码“翻译”成汇编代码。该过程是核心同时也是较复杂的一个过程。我们可以通过命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -S -o helloWorld.s helloWorld.c #-S参数表示只到生成汇编为止
cat helloWorld.s
    .file   "helloWorld.c"
    .section    .rodata
.LC0:
    .string "Hello World!"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    %edi, -4(%rbp)
    movq    %rsi, -16(%rbp)
    movl    $.LC0, %edi
    call    puts
    movl    $0, %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609"
    .section    .note.GNU-stack,"",@progbits

上面的内容即为编译之后得到的汇编代码。

汇编

汇编是将汇编代码翻译成机器可执行的指令,生成目标文件。整个过程较为简单,几乎只是按照汇编指令和机器指令进行一一翻译。我们可以用下面的命令获得汇编后的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc  -o  helloWorld.o   -c helloWorld.c
od helloWorld.o  #查看二进制内容
0000000 042577 043114 000402 000001 000000 000000 000000 000000
0000020 000001 000076 000001 000000 000000 000000 000000 000000
0000040 000000 000000 000000 000000 001260 000000 000000 000000
0000060 000000 000000 000100 000000 000000 000100 000015 000012
0000100 044125 162611 101510 010354 076611 044374 072611 137760
(其他内容未显示)

链接

链接是以某种方式将各个目标文件整个在一起,生成最后的可执行文件。我们的hello程序中调用了printf函数,但是并不存在于helloWorld.o中,而是存在于libc.so或libc.a中,因此我们需要通过链接将它们融合在一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -o helloWorld helloWorld.c

执行上面的命令之后,就得到了我们的helloWorld程序了,在linux下,它是一种ELF格式的文件,后面的文章我们会更多地介绍到。 我们通过ldd命令看到helloWorld程序链接了系统的库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ldd helloWorld
    linux-vdso.so.1 =>  (0x00007ffe9ef11000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d9f038000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0d9f402000)

有兴趣的也可以尝试一下,如果删除系统中的libc.so库(记得事先备份),发现能够编译过,却在最后链接失败。

总结

  • 我们总结整个编译过程大致如下:

而正是由于整个编译过程分阶段进行,我们可以看到不同类型的问题在不同阶段出现并且有先后顺序。正因如此,链接问题在编译的最后阶段才会出现。

  • gcc编译系统本身调用了很多其他相关工具,可以加上--verbose观察其详细编译过程,发现gcc命令调用了预处理器,编译器,汇编器,链接器等命令。

本文只是粗略介绍其整个过程,更多地了解编译过程能够帮助我们优化代码、处理令人困扰的链接问题或避免安全漏洞,本文不展开介绍具体的编译过程,有兴趣的同学可以阅读《编译原理》。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
开源大模型与闭源大模型
开源大模型是指开发者将模型的代码和训练数据公开,使得任何人都可以访问、修改和使用这些资源。代表性的开源大模型包括Hugging Face的Transformers库和Meta的LLaMA(Large Language Model Meta AI)。
用户11305458
2024/10/09
7010
CloudBluePrint-Chapter 1.9 : 云上应用技术架构-拥抱生成式AI
在科技的快速发展中,生成式AI(Generative AI)逐渐成为创新的重要驱动力。它通过学习大量数据来生成新内容,应用广泛,包括文本生成、图像生成、音乐创作和代码生成。各大云厂商都提供了丰富的AI服务,使企业和开发者能够更方便地构建和部署生成式AI应用。本文将详细对比AWS、GCP、Azure、阿里云和腾讯云在生成式AI方面的云服务。
行者深蓝
2024/05/31
2980
开源语言大模型演进史:早期革新
尽管业内最初强调专有模型,但随着GPT-3等流行语言模型的发布,LLM研究社区开始发布相关开源变体。最早的开源语言模型在性能上落后于最佳的专有模型,不过,它们为提升LLM的研究透明度奠定了基础,并促进了后续LLaMA-2等强大模型的开发。
用户9861443
2023/11/01
6120
开源语言大模型演进史:早期革新
2022 年中回顾|大模型技术最新进展
本文回顾了过去 12 个月以来,国内外大模型的发展趋势,包括百花齐放的国产大模型、新秀不断涌现的多模态模型、萌芽中的通用能力模型等等,并对大模型新应用、预训练框架等方面的进展进行了总结。
澜舟科技
2022/07/25
3.4K1
2022 年中回顾|大模型技术最新进展
常见大语言模型解析:技术细节、应用与挑战
文章链接:https://cloud.tencent.com/developer/article/2467252
小说男主
2024/11/21
2530
常见大语言模型解析:技术细节、应用与挑战
AI 大模型开源之困:垄断、围墙与算力之殇
从新兴技术转变为AI基础设施,大模型开源很重要,但也很难。 作者|李梅 编辑|陈彩娴 2020年6月,OpenAI发布GPT-3,其千亿参数的规模和惊人的语言处理能力曾给国内AI界带来极大的震动。但由于GPT-3未对国内开放,一批提供文本生成服务的商业公司在海外诞生时,我们只能望洋兴叹。 今年8月,伦敦的开源公司Stability AI发布文生图模型Stable Diffusion,并免费开源了模型的权重和代码,这迅速引发了AI作画应用在全球范围内的爆炸式增长。 可以说,今年下半年的AIGC热潮,开源起到了
AI科技评论
2023/04/12
5470
AI 大模型开源之困:垄断、围墙与算力之殇
DeepSeek 的开源优势:为什么选择它而不是其他闭源模型?
开源 是 DeepSeek 最显著的优势之一。与闭源模型不同,DeepSeek 的代码完全公开,开发者可以根据自己的需求进行定制和优化。这种灵活性不仅允许开发者根据具体应用场景调整模型,还促进了社区的创新和协作。例如,开发者可以在 DeepSeek 的基础上开发专用模型,如 DeepSeek Coder(用于代码生成和补全)或 DeepSeek Translator(用于多语言翻译),从而满足特定领域的复杂需求。
用户11396661
2025/02/17
6420
开源大模型与闭源大模型,你更看好哪一方?
简介:评价一个AI模型“好不好”“有没有发展”,首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径,你更看好哪一种呢?
正在走向自律
2024/12/18
3590
开源大模型与闭源大模型,你更看好哪一方?
介绍10款ChatGPT替代产品
ChatGPT 引领着聊天 AI 的世界,许多人已经开始在日常生活中使用它。OpenAI 的 GPT-3 语言模型是聊天机器人的基础,它使得用户能够通过回答问题与 AI 进行交互。
架构狂人
2023/08/16
2.8K0
介绍10款ChatGPT替代产品
开源大型语言模型(llm)总结
大型语言模型(LLM)是人工智能领域中的一个重要研究方向,在ChatGPT之后,它经历了快速的发展。这些发展主要涉及以下几个方面:
deephub
2023/08/30
5280
开源大型语言模型(llm)总结
开源框架与闭源框架的深度解析
开源框架与闭源框架的本质区别在于代码的开放性与控制权。开源框架(如Meta的Llama 3.1、DeepSeek-R1)通过公开源代码、模型参数及训练数据,允许开发者自由修改和商业化使用。这种开放模式使得Meta的Llama 3.1在22个月内将性能差距从闭源模型的22个月缩短至16个月,部分任务甚至接近GPT-4水平。而闭源框架(如OpenAI的GPT系列)则通过代码封闭保护核心技术,以付费API或企业解决方案盈利,其研发依赖内部专业团队集中投入资源,例如OpenAI的GPT-4在复杂推理任务中仍保持领先。
用户2755790
2025/04/13
1790
📝《开源vs闭源:大模型时代的技术伦理之争》
2023年全球大模型参数量突破万亿级,GPT-4、LLaMA等模型推动AI进入“工业化生产”阶段。开源社区(如Hugging Face)与闭源巨头(如OpenAI、Google)形成两大阵营:
Jimaks
2025/03/24
4441
大模型评测指南:从理论到实践
大模型能够协助我们完成各种任务,改变我们的生产和生活的方式,提高生产力,为我们带来便利,但同时使用过程中也伴随着诸多风险与挑战,如泄露隐私数据,生成带有偏见、暴力、歧视、违反基本道德和法律法规的内容,传播虚假信息等。
测试开发技术
2025/06/25
3530
大模型评测指南:从理论到实践
大模型发展历程:技术演进与趋势洞察
本文系统梳理了 2017 年至 2025 年间,大语言模型(LLM)领域的关键进展、技术演进和代表模型。从 Transformer 架构的革命性突破,到 GPT-3 的规模化成功,再到多模态模型的兴起,大模型技术正在重塑人工智能产业格局。
磊叔的技术博客
2025/06/08
1.3K0
大模型发展历程:技术演进与趋势洞察
Transformers回顾 :从BERT到GPT4
人工智能已成为近年来最受关注的话题之一,由于神经网络的发展,曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成,人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得了重大进展。一个关键的突破是引入了“自注意力”和用于序列处理的Transformers架构,这使得之前主导该领域的几个关键问题得以解决。
deephub
2023/08/28
4600
Transformers回顾 :从BERT到GPT4
《深度剖析:开源与闭源模型,AI舞台上的不同角色》
在人工智能蓬勃发展的当下,模型的选择如同为一场战役挑选合适的武器,至关重要。开源模型与闭源模型作为AI领域的两大阵营,在性能和应用场景上展现出显著差异,深刻影响着开发者、企业以及整个行业的走向。
程序员阿伟
2025/05/21
1860
Hugging Face最受欢迎15大AI机构出炉!清华第五,OpenAI第十,冠军竟是它?
2022年AI大爆炸的两个标志性事件,一个是ChatGPT,一个就是Stable Diffusion。
新智元
2023/11/24
4440
Hugging Face最受欢迎15大AI机构出炉!清华第五,OpenAI第十,冠军竟是它?
用GPT4进行指令微调
代码:https://instruction-tuning-with-gpt-4.github.io/
西西嘛呦
2023/04/08
1.5K0
用GPT4进行指令微调
他们开源了GitHub上最火的双语对话模型,还说AI胡说八道不需要被纠正
衡宇 发自 凹非寺 量子位 | 公众号 QbitAI 国产对话机器人ChatGLM,和GPT-4诞生于同一天。 由智谱AI和清华大学KEG实验室联合推出,开启alpha内测版。 这个巧合让智谱AI创始人兼CEO张鹏有一种说不清的复杂感觉。但看到技术被OpenAI做到这么牛,这名被AI新进展轰炸麻了的技术老兵又猛然亢奋起来。 特别是在追GPT-4发布会直播时,他看一下屏幕里的画面,就埋头笑一阵,再看一段,又咧嘴笑一会儿。 从成立起,张鹏带队的智谱AI就是大模型领域的一员,定下“让机器像人一样思考”的愿景。
量子位
2023/04/06
6610
他们开源了GitHub上最火的双语对话模型,还说AI胡说八道不需要被纠正
一文读懂 LLaMa 2 开源 LLM
自从 Transformers 问世以来,LLM (大型语言模型)以及更广泛的生成式人工智能技术呈现出爆炸式的增长趋势。同时,随着 ChatGPT 等免费版本的推出,世界各地的企业和科技爱好者开始意识到生成式人工智能的巨大潜力。
Luga Lee
2023/12/04
2K1
一文读懂 LLaMa 2 开源 LLM
推荐阅读
相关推荐
开源大模型与闭源大模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验