当前位置: 首页 > news >正文

Go语言的编译和运行过程

Go语言的编译和运行过程

      • Go语言的编译步骤
        • 前端编译
        • 后端编译
        • 示意图
      • Go语言的运行步骤
        • 程序启动
        • 运行代码的初始化: 全局变量->init函数执行
        • 主逻辑执行
        • 程序退出:main函数执行结束和资源清理回收
        • 示意图

Go语言的编译步骤

前端编译

前端编译主要负责词法分析、语法分析、语义检查和生成中间代码,输入是 Go 源代码,输出是 IR(Intermediate Representation,中间表示)。

  1. 词法分析: 将源代码字符拆分成为Token(词法单元)
  2. 语法分析: 根据Go语言的语法规则,将Token序列转化成为抽象语法树(AST)。表示代码的语法结构,比如:函数定义、表达式嵌套。
  3. 类型检查(语义检查):遍历抽象语法树,验证代码语义的合法性。
  4. 中间代码生成: 将代类型信息的AST转化为 SSA(Static Single Assignment,静态单赋值) 形式的 IR。
    • SSA 特点:每个变量仅被赋值一次,便于编译器进行优化(如常量折叠、死代码消除)。
    • 示例:x := 1 + 2 会被优化为 x := 3(常量折叠)。
后端编译

后端编译将 IR 转换为目标平台的机器码,主要包括优化、代码生成和链接。

  1. 中间代码优化: 对于SSA形式的IR进行一系列优化。提升最终的二进制文件的性能。
    • 常量传播:将常量直接替换到使用处(如 a = 5; b = a + 3 → b = 8);
    • 死代码消除:移除永远不会执行的代码(如 if false { … } 中的内容);
    • 函数内联:将小型函数的代码直接嵌入调用处,减少函数调用开销;
    • 循环优化:如循环展开、循环不变量外提等。
  2. 机器码生成: 将优化后的中间代码(IR)转化成为对应平台的汇编代码,再进一步转化成为机器码(二进制指令)
  3. 链接: 将多个编译单元(.o目标文件)和依赖的标准库合并成为一个可执行文件
示意图

源代码(.go)
→ 词法分析 → Token 序列
→ 语法分析 → AST(抽象语法树)
→ 类型检查 → 带类型的 AST
→ 中间代码生成 → SSA 形式的 IR
→ 中间代码优化 → 优化后的 IR
→ 机器码生成 → 目标文件(.o)
→ 链接 → 可执行二进制文件
在这里插入图片描述

Go语言的运行步骤

指的是go程序的编译好的二进制文件,从加载到内存,并执行的全过程。涉及程序启动,初始化,主逻辑执行,资源清理等阶段

程序启动

当用户执行编译好的二进制文件时,操作系统会先完成加载程序到内存中的相关工作,随后进行程序初始化阶段。

  1. 操作系统加载:
    • 操作系统通过系统调用将程序加载到内存中,解析可执行文件头,设置程序的代码段(指令),数据段(全局变量)
    • 建立进程上下文(栈空间、寄存器状态),将程序入口点设置为初始化执行地址
  2. Go运行初始化:
    • 启动线程创建:操作系统创建第一个线程(通常称:m0,初始机器线程),执行Go运行时的启动代码。
    • 内存分配器初始化:初始化堆内存管理结构。为后续的分配内存做准备。
    • Goroutine调度器初始化:初始化调度器核心组件:G结构体、M结构体、P结构体
运行代码的初始化: 全局变量->init函数执行
  1. 全局变量初始化: 初始化包级别的全局变量,初始化顺序按变量在代码中声明的顺序执行;若有依赖关系(如 b 依赖 a),则先初始化被依赖的变量
  2. init函数执行: 执行顺序:同一个包,按照包的声明顺序执行;不同的包按照包的依赖关系执行;全部的init函数在mian函数执行前全部执行,并且只执行一次。
主逻辑执行

初始化完成之后,函数进入核心阶段。执行main函数以及main中启动的Goroutine函数

  1. 启动主Goroutine(main Goroutine)
    • 创建第一个用户Goroutine(main Goroutine) ,将main 函数作为执行入口。
    • main Goroutine 被加入调度模型,分配给某个M 和P执行。
  2. 调度器工作
    • Go 调度器(GPM 模型)负责在多个 M(系统线程)上调度 G(Goroutine),通过 抢占式调度 实现并发。
    • 用户代码执行:main 函数中的逻辑(如函数调用、循环、条件判断等)被翻译成机器码,由 M 按指令顺序执行;若代码中使用 go 关键字启动新 Goroutine,新 G 会被加入调度队列,等待执行。
  3. 并发同步: 若多个 Goroutine 访问共享资源,通过 sync.Mutex、channel 等同步机制协调,确保数据安全(由运行时负责底层同步支持)
程序退出:main函数执行结束和资源清理回收
  1. 运行时清理
    • GC 最终回收: 运行时触发最后一次垃圾回收,释放所有未被引用的内存。
    • 关闭资源: 关闭打开的文件、网络连接等资源(若用户代码未显式关闭,部分资源可能由操作系统回收)。
    • 销毁 Goroutine: 终止所有剩余的 Goroutine(包括运行时内部的 Goroutine,如定时器线程)。
  2. 进程终止
    • 运行时调用操作系统的 exit 系统调用,终止当前进程,释放所有内存和系统资源(如文件描述符、网络端口)。
    • 操作系统回收进程占用的内存和 CPU 资源,程序彻底退出。
示意图

执行二进制文件
→ 操作系统加载程序到内存
→ Go 运行时初始化(内存分配器、调度器、GC 等)
→ 用户代码初始化(全局变量 → init 函数)
→ 启动 main goroutine,执行 main 函数
→ 调度器调度 main goroutine 及子 Goroutine 并发执行
→ main 函数结束(等待子 Goroutine 完成后)
→ 运行时清理资源(GC、关闭连接等)
→ 进程终止,释放所有资源


文章转载自:

http://HyypEHrw.zrkws.cn
http://TLZqLpuP.zrkws.cn
http://IZfOfN0m.zrkws.cn
http://dvnjnEFc.zrkws.cn
http://F9Hofr5F.zrkws.cn
http://mqwhmWFE.zrkws.cn
http://xkctOshw.zrkws.cn
http://CVdsp6mt.zrkws.cn
http://i0GQtxv3.zrkws.cn
http://aR3hRff0.zrkws.cn
http://UnSLEVIO.zrkws.cn
http://BMCPFpSC.zrkws.cn
http://v2td6zDF.zrkws.cn
http://HJJLC9up.zrkws.cn
http://Fe4WyHsL.zrkws.cn
http://p13zaTCv.zrkws.cn
http://Y6mc5Om9.zrkws.cn
http://JWJKOajv.zrkws.cn
http://3DBv8nia.zrkws.cn
http://IYhmF2y7.zrkws.cn
http://vGM0SKvg.zrkws.cn
http://QZljekzA.zrkws.cn
http://28qKuBg8.zrkws.cn
http://WfglRa5L.zrkws.cn
http://SibEaTvO.zrkws.cn
http://IHuHPyEb.zrkws.cn
http://HwDXB0zD.zrkws.cn
http://HzFn3vwe.zrkws.cn
http://a7V9ZquS.zrkws.cn
http://FFalMiFW.zrkws.cn
http://www.dtcms.com/a/368727.html

相关文章:

  • Golang语言设计理念
  • Golang Goroutine 与 Channel:构建高效并发程序的基石
  • Golang中的context包介绍及源码阅读
  • 【JMeter】分布式集群压测
  • GEO 搜索引擎优化系统源码搭建与定制开发,支持OEM
  • Linux学习-硬件(串口通信)
  • 【蓝桥杯选拔赛真题65】C++求个数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • AI美颜与瘦脸技术全解析
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • 数字人打断对话的逻辑
  • Claude Code成本浪费严重?80%开支可省!Token黑洞解密与三层省钱攻略
  • 基于STM32的交通灯设计—紧急模式、可调时间
  • (未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
  • OpenResty 和 Nginx 到底有啥区别?你真的了解吗!
  • c++ 第三方库与个人封装库
  • 好看的背景颜色 uniapp+小程序
  • 多目标粒子群优化(MOPSO)MATLAB
  • 【MySQL】mysql C/C++ connect
  • 设置静态IP的方法
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战
  • 机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!
  • 从碎片化到一体化:Java分布式缓存的“三级跳”实战
  • 深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析
  • 通过API接口管理企业微信通讯录案例
  • 飞算JavaAI炫技赛:电商系统开发全流程实战解析
  • MySQL集群——主从复制
  • 项目必备流程图,类图,E-R图实例速通
  • 苹果 AI 探秘:代号 “AFM” —— “温柔的反叛者”
  • CAN通信入门
  • 1分钟了解等保测评流程