# 1. LLVM IR 的 SSA 结构以基本块与指令为单位,phi 节点如何表达控制流汇聚处的值选择? A phi 节点根据当前基本块是从哪个前驱进入的,选择对应的操作数值 ✓ 正确答案 B phi 节点只能在函数末尾出现一次 C phi 节点根据当前指令的算数结果选择值 D phi 节点是运行时真实执行的机器指令
# 2. LLVM 新旧 Pass Manager 在 analysis invalidation 与调度上的差异是什么? A 每次运行任何 Pass 都会使所有 analysis 失效 B analysis 从不缓存,总是重新计算 C 新 Pass Manager 通过 AnalysisManager 缓存结果,并由 Pass 声明 PreservedAnalyses 来精确失效相关分析 ✓ 正确答案 D 失效只发生在 module 级别,function 级别不受影响
# 3. LLVM 的 SelectionDAG/GlobalISel 指令选择与 TableGen 描述的后端,如何降低新增一个目标架构的成本? A 每次新增架构都要重写整个优化器 B 新架构必须完全手工编写指令选择器 C TableGen 描述目标指令并自动生成代码,SelectionDAG/GlobalISel 提供通用选择框架 ✓ 正确答案 D 指令选择与架构无关,无需任何后端工作
# 4. DWARF 调试信息与 debug metadata 在优化变换中如何被保留,丢失会导致什么调试问题? A 程序运行速度变慢 B 程序无法编译 C 变量被报告为 optimized out、断点与源码行号错位 ✓ 正确答案 D 二进制体积必然缩小
# 5. LLVM IR 中 undef 与 poison 值的语义差异,为什么 poison 能让更多变换保持正确性,freeze 指令的作用是什么? A 两者完全相同,是同一语义的两种写法 B freeze 会让 poison 变成任意真值 C undef 会传播,poison 不会 D poison 值参与运算会传播毒化,而 freeze 可将其定格为具体值 ✓ 正确答案
# 6. WebAssembly 的线性内存、表(table)与全局变量如何在运行时做边界检查,从而保证沙箱内的内存安全? A 允许任意指针算术逃逸到宿主内存 B 只有由编译器生成的代码才检查内存 C 内存完全无界,无法检查 D 线性内存访问带边界检查,越界即 trap,间接调用也检查表索引 ✓ 正确答案
# 7. Cranelift 作为快速 JIT 后端,其 IR 设计与优化取舍如何服务于低延迟编译而非极致峰值性能? A 它追求极致峰值性能,不惜延长编译时间 B 它用简单 IR 与少量优化换取低延迟编译,适合 JIT 场景 ✓ 正确答案 C 它不做任何代码生成 D 它只能用于解释器,不能 JIT
# 8. SelectionDAG 与 GlobalISel 两种指令选择框架在覆盖范围与可维护性上有何取舍? A SelectionDAG 更可维护,GlobalISel 更成熟 B SelectionDAG 成熟覆盖广,GlobalISel 分阶段可增量、更易维护 ✓ 正确答案 C 两者完全相同 D GlobalISel 无法处理任何指令
# 9. Cilium 用 eBPF 在内核数据面实现 L3/L4/L7 策略与负载均衡,Hubble 如何复用这些 eBPF 数据路径导出 flow 实现可观测性? A Hubble 独立抓包,与 eBPF 数据路径无关 B Hubble 需要暂停数据面才能观测 C Hubble 只做 L3 策略,不做观测 D Hubble 复用 eBPF 数据路径通过 ring buffer 导出的事件,关联 Kubernetes 元数据形成 flow ✓ 正确答案
# 10. Hubble 的 flow log 相比传统抓包,在关联 Kubernetes 身份(pod/namespace/label)上有何优势? A 能捕获更多原始字节 B 不需要运行内核程序 C 直接携带 pod/namespace/label 等 Kubernetes 身份及命中的策略信息 ✓ 正确答案 D 只能用于 TCP 流量
# 11. SSA 形式与支配树中,为什么优化器使用 SSA? A SSA 允许一个变量多次赋值以跟踪不同值 B SSA 中每个变量只有唯一定义点,配合支配树可简化 def-use 分析与优化 ✓ 正确答案 C SSA 无法处理有循环的程序 D SSA 只用于解释执行
# 12. 别名分析(alias analysis)如何支撑 Load 消除与访存重排序,为什么保守的 may-alias 会损失优化机会? A 别名分析对优化无影响 B 别名分析只影响调试 C may-alias 反而能消除更多 load D 证明 no-alias 可启用 load 消除与重排,保守的 may-alias 会损失优化机会 ✓ 正确答案
# 13. LLVM 函数属性(nocapture、readonly、noundef)如何让优化器做更多假设,错误标注会引入什么正确性风险? A 属性只是文档,不影响代码生成 B 属性只在调试时生效 C 任何属性都可安全忽略 D 正确标注可让优化器做更强假设,错误标注会导致编译后程序行为与真实语义不符 ✓ 正确答案
# 14. LLVM 如何通过与目标无关的 IR 和 TargetMachine/后端接口,把同一份优化流水线复用到 NVPTX、AMDGPU、RISC-V 等多个后端? A 目标无关 IR 与通用优化 Pass 复用,后端专属部分通过 TargetMachine/接口实现 ✓ 正确答案 B 每个后端必须重写全部优化 C 优化与后端完全无关 D 只有 RISC-V 能复用
# 15. WASI 的能力(capability)模型如何以 fd 与权限授予取代全局环境,实现按最小权限的沙箱访问? A 模块默认拥有全部文件系统权限 B 模块只能通过宿主显式授予的 fd 及其权限访问资源,实现最小权限 ✓ 正确答案 C 能力由环境变量全局控制 D WASI 不支持 fd 概念
# 16. Component Model 与 WASI Preview2 相比 Preview1 在接口类型(WIT)与跨语言组合上做了哪些改进? A 与 Preview1 完全一致 B 只支持整数类型 C 用 WIT 描述结构化接口与资源,支持跨语言组件组合 ✓ 正确答案 D 组件不能互相调用
# 17. LLVM IR 的 Module/Function/BasicBlock/Instruction 层级如何组织? A Module 是最小的指令单元 B BasicBlock 没有终结指令 C Module 是顶层容器,其下为 Function、BasicBlock、Instruction ✓ 正确答案 D Instruction 包含多个函数
# 18. LLVM Pass 与优化管线中,函数内联与循环优化如何执行? A 内联总是无代价地提升性能 B 内联由代价模型驱动权衡代码膨胀与收益,循环优化针对循环结构做 LICM、展开等变换 ✓ 正确答案 C 循环优化与内联无关 D 内联会破坏所有优化