返回

文章详情

统一IR for Julia

Hacker News2026年7月18日 21:28

统一IR是一种旨在跨越编译器管道和外部编译器的IR数据结构(设计规范详见UnifiedIR/docs/design.md):一个包含混合区域的平坦语句表,基于共享存储核心(AttrGraph:种类列 + 打包的双模式操作数字 + 一个标记的操作数池 + 开放属性列宇宙),布局状态(构建/密集/可编辑/浮动),恰好有两个重命名点,具有静态保留方言ID的命名空间种类注册表,用于引导堆栈,一个通用树表面(Tree/NodeList游标,构建,mapchildren/copy_ast,沿图形合格的:source链的来源遍历),紧凑化!-作为GC(compact_graph!/collect_syntax!),验证器,打印机/解析器,以及参考解释器。零依赖。接线:统一IR连接到TOP_LEVEL_PKGS(符号链接到JULIA共享目录),在JuliaSyntax(base/Base.jl)之前立即引导到Base — JuliaSyntax的SyntaxGraph在该基础上运行 — 其源代码连接到COMPILER_FRONTEND_SRCS,因此在更改时sysbase会重构。Base烘焙实例保持其种类注册表干净,没有测试方言(注册限制为包模式)。 共同作者:Claude Fable 5 <noreply@anthropic.com> 一个存储核心:SyntaxGraph包裹了UnifiedIR.AttrGraph — 种类是一个真实的核心列(:kind属性是其字典形状视图),子项是在通过打包范围字寻址的共享操作数池中的STMT标记字,并且历史边缘范围/边缘/属性属性完全保留(身份稳定视图;保持is_compatible_graph语义)。 compact_graph!提供GC所期望的对语法图的降级。 一个表面:SyntaxTree{Attrs} = UnifiedIR.Tree{SyntaxGraph{Attrs}}和SyntaxList = UnifiedIR.NodeList — 子项索引、属性属性、新节点/新叶/创建节点/创建叶/创建树、copy_attrs!/mapchildren/copy_ast、来源遍历、结构相似和打印都是UnifiedIR通用的;JuliaSyntax仅保留真正的与语法相关的部分(种类注册表包装器、SourceRef/源文本机制、叶负载约定、解析器集成、修剪/去别名/@stm)。 一个种类注册表:历史模块ID机制通过register_kinds!重新接入共享UnifiedIR注册表 — 种类模块成为声明连续操作码块的方言(范围谓词和BEGIN_/END_标记被保留),引导堆栈声明静态保留的方言ID(JuliaSyntax=1, JuliaLowering=2, formatter=3; core=0),因此K"..."字面量保持编译时常数,语法K"call"和核心K"call"是共享一个编号空间的不同种类。 种类在__init__中重新注册(注册表是UnifiedIR会话状态);编号是确定性的,保持烘焙常数有效。 双模式:引导到Base后,它绑定到Base.UnifiedIR(在它之前包含);作为一个包,它依赖于UnifiedIR包。 共同作者:Claude Fable 5 <noreply@anthropic.com> JuliaLowering.UnifiedBackend(附加;对现有源代码没有更改):重用前半部分不变 — 宏展开、去糖、范围分析、闭包转换 — 并直接发出结构化的UnifiedIR区域形式(if/loop/try区域操作,帧变量的单元,封闭的退出终结器),而不是goto线性IR,带有图形合格的来源:每个发出的语句都携带一个:source列条目,持有源语法树游标,因此通用来源遍历可以从优化的IR语句交叉回到表面文本(可高亮的诊断),并且collect_syntax!可以在活动IR中GC降级图。 纯定义;引导期间没有调用它,并且它在可选的sys-JL sysimage阶段中干净烘焙。 绑定通过封闭的JuliaLowering解析(在Base烘焙和包模式中相同的JuliaSyntax,因此相同的UnifiedIR实例)。 共同作者:Claude Fable 5 <noreply@anthropic.com> ……关于统一IR 基础设施的提供方(仅限包模式;sysimage引导永远不会看到它):CodeInfo <-> UnifiedIR边界转换器(cfg-wrap条目包括异常处理程序;带有phi合成的goto/类型退出),在UnifiedIR上本地运行的推理端口(在会话MethodInstances上以100%相等或更好返回类型进行差异验证),优化器传递(SROA,通过splice_body!内联,ADCE,结构化,单元提升),Queries API,以及通过普通编译器替换机制(Core.OptimizedGenerics.CompilerPlugins.typeinf所有者钩子 + with_unified_compiler)激活,所有缓存结果都通过经过验证的UnifiedIR阴影回调。 加载:Compiler.load_unified!()按需将端口包含到一个以Main为根的承载模块中,并将其绑定为Compiler.Unified。 根据需求,因为stdlib存根快速路径在包与sysimage副本匹配时绕过模块评估;以Main为根,因为该baremodule将getproperty重新绑定为原始getfield以用于其嵌套树。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡