[{"data":1,"prerenderedAt":330},["ShallowReactive",2],{"page-\u002Fcpp\u002Fcpp编译器思考":3},{"id":4,"title":5,"body":6,"description":222,"extension":323,"meta":324,"navigation":325,"path":326,"seo":327,"stem":328,"__hash__":329},"content\u002Fcpp\u002FCpp编译器思考.md","Cpp编译器思考",{"type":7,"value":8,"toc":321},"minimark",[9,206,209,213,223,237,282,296,307,314,317],[10,11,12,31],"table",{},[13,14,15],"thead",{},[16,17,18,22,25,28],"tr",{},[19,20,21],"th",{},"概念",[19,23,24],{},"本质",[19,26,27],{},"核心职责",[19,29,30],{},"相互关系",[32,33,34,92,156],"tbody",{},[16,35,36,43,67,85],{},[37,38,39],"td",{},[40,41,42],"strong",{},"LLVM",[37,44,45,46,49,50,53,59,63],{},"一套",[40,47,48],{},"模块化的编译器基础设施","和",[40,51,52],{},"工具链集合",[54,55],"a",{"href":56,"rel":57},"https:\u002F\u002Fllvm.googlesource.com\u002Fllvm-project\u002F+\u002Ffde2aadb80020fe4a0fa887be5b6ca9d6df9564d",[58],"nofollow",[54,60],{"href":61,"rel":62},"https:\u002F\u002Fdeveloper.aliyun.com\u002Farticle\u002F1637972",[58],[54,64],{"href":65,"rel":66},"https:\u002F\u002Fdeveloper.baidu.com\u002Farticle\u002Fdetail.html?id=6878450",[58],[37,68,69,70,73,74,77,78,81,84],{},"提供一套",[40,71,72],{},"与具体语言和硬件无关的中间表示（IR）","，以及围绕它构建的",[40,75,76],{},"优化器、代码生成器","等后端工具",[54,79],{"href":61,"rel":80},[58],[54,82],{"href":65,"rel":83},[58],"。",[37,86,87,88,91],{},"为 Clang 等前端提供",[40,89,90],{},"后端支持","，是编译流程的下游。",[16,93,94,99,117,144],{},[37,95,96],{},[40,97,98],{},"Clang",[37,100,101,102,105,109,113],{},"是 LLVM 项目的一部分，一个",[40,103,104],{},"完整的编译器前端",[54,106],{"href":107,"rel":108},"https:\u002F\u002Fwww.ctyun.cn\u002Fdeveloper\u002Farticle\u002F561824833167429",[58],[54,110],{"href":111,"rel":112},"https:\u002F\u002Fclang.llvm.net.cn\u002F#blocks-in-protected-scope",[58],[54,114],{"href":115,"rel":116},"https:\u002F\u002Fzh.m.wikipedia.org\u002Fzh-my\u002FClang",[58],[37,118,119,120,123,124,127,130,131,134,137,141,84],{},"专门负责处理 ",[40,121,122],{},"C、C++、Objective-C"," 等语言",[54,125],{"href":111,"rel":126},[58],[54,128],{"href":115,"rel":129},[58],"。它会将源代码进行词法、语法分析，最终生成 ",[40,132,133],{},"LLVM IR",[54,135],{"href":107,"rel":136},[58],[54,138],{"href":139,"rel":140},"https:\u002F\u002Fcloud.tencent.com.cn\u002Fdeveloper\u002Farticle\u002F1810976?policyId=1003",[58],[54,142],{"href":115,"rel":143},[58],[37,145,146,147,149,150,153,84],{},"它依赖 ",[40,148,42],{}," 作为后端来生成最终的机器码",[54,151],{"href":107,"rel":152},[58],[54,154],{"href":115,"rel":155},[58],[16,157,158,163,177,199],{},[37,159,160],{},[40,161,162],{},"GCC",[37,164,45,165,168,169,173],{},[40,166,167],{},"完整的、独立的编译器集合","（GNU Compiler Collection）",[54,170],{"href":171,"rel":172},"https:\u002F\u002Fgcc.gnu.org\u002Fonlinedocs\u002Fgcc-4.9.1\u002Fgcc\u002FG_002b_002b-and-GCC.html#index-C_002b_002b-14",[58],[54,174],{"href":175,"rel":176},"https:\u002F\u002Fhpc.chd.edu.cn\u002F2019\u002F1212\u002Fc9975a212763\u002Fpage.htm",[58],[37,178,179,180,184,185,188,189,193,196,84],{},"它自带了多种语言的前端（如",[181,182,183],"code",{},"g++"," for C++）和",[40,186,187],{},"自己的后端","，能够直接将源代码编译成可执行文件",[54,190],{"href":191,"rel":192},"https:\u002F\u002Fraw.githubusercontent.com\u002Fenzohua\u002Falgo\u002F9f9fb329faaf7098ea1f55b58404205226c6af75\u002FSkill\u002FC%2B%2B\u002F1-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86\u002F0-GCC.md",[58],[54,194],{"href":171,"rel":195},[58],[54,197],{"href":175,"rel":198},[58],[37,200,201,202,205],{},"它是一个",[40,203,204],{},"独立的完整系统","，不依赖 LLVM\u002FClang。",[207,208],"hr",{},[210,211,212],"p",{},"我们可以直接使用clang + llvm来 尝试同一个前端，为不同的后端生成代码：",[214,215,220],"pre",{"className":216,"code":218,"language":219},[217],"language-text","# 同一个前端（Clang）可以为不同后端生成代码\nclang -S -emit-llvm main.c -o main.ll    # 生成 LLVM IR（与平台无关）\nclang -target x86_64-linux main.c        # 生成 x86_64 机器码\nclang -target arm64-apple-darwin main.c  # 生成 ARM64 机器码\n","text",[181,221,218],{"__ignoreMap":222},"",[210,224,225,226,229,232,233,236],{},"clang作为前端，本身是",[40,227,228],{},"不直接生成 x86 或 ARM 机器码，而是生成 LLVM IR；而 LLVM 后端则负责将这些 IR 转化为目标平台的机器码。",[181,230,231],{},"clang"," 命令之所以能直接输出可执行文件，是因为它",[40,234,235],{},"默认集成了 LLVM 后端","，并在背后自动完成整个编译流程，这一点要注意！",[214,238,242],{"className":239,"code":240,"language":241,"meta":222,"style":222},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n    A[源代码\u003Cbr>C\u002FC++] --> B[Clang 前端]\n    B --> C[LLVM IR\u003Cbr>（与平台无关）]\n    C --> D[x86 后端]\n    C --> E[ARM 后端]\n    C --> F[WASM 后端]\n","mermaid",[181,243,244,252,258,264,270,276],{"__ignoreMap":222},[245,246,249],"span",{"class":247,"line":248},"line",1,[245,250,251],{},"flowchart LR\n",[245,253,255],{"class":247,"line":254},2,[245,256,257],{},"    A[源代码\u003Cbr>C\u002FC++] --> B[Clang 前端]\n",[245,259,261],{"class":247,"line":260},3,[245,262,263],{},"    B --> C[LLVM IR\u003Cbr>（与平台无关）]\n",[245,265,267],{"class":247,"line":266},4,[245,268,269],{},"    C --> D[x86 后端]\n",[245,271,273],{"class":247,"line":272},5,[245,274,275],{},"    C --> E[ARM 后端]\n",[245,277,279],{"class":247,"line":278},6,[245,280,281],{},"    C --> F[WASM 后端]\n",[210,283,284,285,289,292,295],{},"GCC包含了经典的三段式结构，能够负责理解源代码。GCC 内置了 C、C++、Go、Fortran 等多种语言前端",[54,286],{"href":287,"rel":288},"https:\u002F\u002Fandroid.googlesource.com\u002Ftoolchain\u002Fgcc\u002F+\u002F430f43829fa42b459ccbb53b44843c54c8ba4550\u002Fgcc-4.8.3\u002Fgcc\u002Fdoc\u002Ffrontends.texi",[58],[54,290],{"href":171,"rel":291},[58],[54,293],{"href":175,"rel":294},[58],"。它对你的源代码进行语法、词法、语义分析，生成一种与语言相关的通用中间表示",[210,297,298,299,302,303,306],{},"中端来进行优化，负责与语言和平台无关的优化。它接收前端的 GENERIC，经过“gimplifier”处理，转化为更简单的 ",[40,300,301],{},"GIMPLE"," 形式，并进一步转换为 ",[40,304,305],{},"SSA (Static Single Assignment)"," 形式。所有与语言无关的核心优化（如死代码消除、内联等）都在这里完成。",[210,308,309,310,313],{},"后端生成目标平台机器码，它将优化后的 GIMPLE 转换为底层的 **RTL 形式，并进行寄存器分配、指令调度等平台相关的优化，最终生成具体的汇编代码，再交由汇编器 ",[181,311,312],{},"as"," 生成目标文件",[210,315,316],{},"GCC本身就是及核心，通常回合binutils二进制工具集，内含汇编器as、链接器ld等和glibc共同组成一个完整的GCC工具链，同于生成环境。我们在命令行里输入的gcc、g++，在gcc内部实际上是一个驱动程序，能够根据我们的参数，自动依次调用真正的编译器前端、优化器、后端和汇编器、链接器，最终输出我们想要的可执行文件。",[318,319,320],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":222,"searchDepth":254,"depth":254,"links":322},[],"md",{},true,"\u002Fcpp\u002Fcpp编译器思考",{"description":222},"cpp\u002FCpp编译器思考","I2LEKGGMaYad6LqkLSEeTymGKI7gDs_gUZ8U7anVoms",1791042461421]