scriptc Typed IR 设计解析:泛型单态化与联合类型标签化如何实现(完整指南)
scriptc Typed IR 设计解析泛型单态化与联合类型标签化如何实现完整指南【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptcscriptc是一款把 TypeScript / JavaScript 直接编译为原生的编译器它先经 TypeScript 编译器完成解析与类型检查再产出一套类型化的中间表示Typed IR最终生成可读的 C 代码、LLVM IR、汇编、原生可执行文件和 WebAssembly。本文将带你读懂 scriptc 的 Typed IR 设计中最关键的两大机制——泛型单态化与联合类型标签化理解脚本语言的两个老大难类型特性是如何在原生代码里落地的。为什么需要 Typed IRscriptc 的编译流水线scriptc 的编译路径可以概括为一句话源码 → tsc 类型检查 →Typed IR→ C / LLVM IR / 汇编 / 原生可执行文件Typed IR 是整个编译器的交汇点前端负责把 TypeScript 的类型世界翻译成 IR 里的精确类型后端则从同一份 IR 生成 C 和 LLVM 两套产物从而保证两种产物在语义上逐条对齐。IR 的核心定义都在 packages/compiler/src/ir/ir.ts序列化与校验分别位于 packages/compiler/src/ir/serialize.ts 和 packages/compiler/src/ir/validate.ts。用--emitir就能直接看到产物输出为.scriptc/hello.ir.json这是观察 IR 最直观的方式$ scriptc build hello.ts --emitir泛型单态化让泛型在原生代码里消失原生代码没有运行时泛型的概念而 scriptc 的选择是monomorphization单态化泛型模板只在编译期存在每个具体调用点都会生成一份填好类型的实体化版本。前端类型层的单态化入口单态化的决策主要发生在前端类型映射阶段。在 packages/compiler/src/frontend/type-mapper.ts 中可以看到核心策略泛型函数体在内部仍按泛型处理checker 继续做类型推理但在对外边界上函数成员会monomorphize per call site——即按每个调用点的具体类型参数实体化。类似的按流单态化monomorphization by flow也用于程序泛型类例如 type-mapper.ts 中对 GENERIC 程序类的注释。举个直观的例子function firstT(items: T[]): T { return items[0]; }如果代码里既调用了first([1, 2])又调用了first([a])IR 层面最终会得到两个具体的函数版本——操作number[]的和操作string[]的而不是一个携带未知元素类型的模板。单态化的两条配套约定单态数组T[]被映射为元素类型确定的单态数组且递归成立number[][]也是单态的见 type-mapper.ts。这意味着数组在 IR 中永远是定长类型布局的原生数组而不是需要装箱的动态容器。结构化 record 内联化对象字面量 / interface / 类型别名统一映射为结构化的 record 形状前端按结构做去重shapeId 相同 ⇔ 形状相同后端再为每种形状生成一个真正的 C struct见 ir.ts 附近的record类型定义。 单态化的代价是代码膨胀收益是所有数组和结构体都能得到确定的内存布局后端可以生成真正高效的标量代码完全不需要 GC 或类型标签分派。联合类型标签化把A | B变成可运行的值TypeScript 的联合类型是静态特性原生代码里却没有对应物。scriptc 的答案是标签盒tagged box——每个联合值在运行时都是一个带标签的不可变堆对象。标签盒的内存布局IR 中的union类型定义ir.ts说明了表示方式联合值 堆上分配 引用计数 不可变的标签盒盒内只有两个部件运行时 tag该分支在规范排序分支列表中的下标一个 payload 槽联合本身按结构内联unionId相同 ⇔ 分支集合相同因此类型比较可以只比较 id所有联合定义登记在模块级的unions表中按首次出现顺序编号u0、u1…分支按 typeKey 排序后其下标就是运行时 tagir.ts。排序保证A | B与B | A是同一个联合——这是标签化能成立的关键前提。包装与解包unionWrap / unionNarrow标签化通过一对 IR 表达式完成闭环unionWrap包装当某个分支类型B的值流入A | B槽位时前端自动插入unionWrap——把值装进新分配的标签盒tag 取该分支的规范下标ir.ts。payload 的引用计数所有权直接移入盒中盒一旦构造即不可变。unionNarrow解包当控制流已经通过typeof/instanceof等判断证明分支后前端发出免检查的解包读取——因为 tsc 的收窄已经完成了证明运行时无需再判一次。这套包装必发生、解包免检查的设计让典型的switch (typeof v)分支模式在运行时只剩一次 tag 比较。union-retag避免反复装箱联合值在传递中经常遇到宽度变化——例如string | number流入更大的string | number | boolean槽位。scriptc 的 lowering 层有专门的 retag 处理packages/compiler/src/frontend/lowering/union-retag.ts与收窄辅助packages/compiler/src/frontend/lowering/union-narrow.ts尽量减少不必要的重新装箱判别符推导逻辑集中在 packages/compiler/src/frontend/union-discriminants.ts。如何验证你的理解跑一跑测试用例scriptc 仓库自带大量语料测试是理解这两套机制最好的活文档。推荐按顺序读主题测试语料泛型函数值tests/corpus/1950-generic-fn-values.ts泛型类基础tests/corpus/1951-generic-classes-basics.ts泛型方法tests/corpus/2000-generic-methods-basic.ts联合类型 retagtests/corpus/1556-union-retag-width-arms.ts联合字段共享读取tests/corpus/1532-union-shared-field-read.ts三元表达式数组 retagtests/corpus/2035-ternary-array-retag.cjs配合--emitir观察.scriptc/下的*.ir.json再对照 IR 校验器 packages/compiler/src/ir/validate.ts 的规则就能看到从源码到类型化 IR 的完整链路。延伸阅读从 IR 到原生IR 遍历与数据流分析packages/compiler/src/ir/analysis.tsC 后端从 IR 生成可读 Cpackages/compiler/src/backend/c/c-emitter.tsLLVM 后端packages/compiler/src/backend/llvm/emitter.ts项目总览与构建方式README.md总结scriptc 的 Typed IR 用两个决策解决了脚本类型系统在原生编译中的两大难题泛型 → 单态化模板留在编译期按调用点实体化换来确定性的原生内存布局联合类型 → 标签盒tag 单 payload 槽的不可变盒包装自动插入、解包免检查把静态收窄结论固化为一次廉价的运行时 tag 比较。理解这两套机制就掌握了阅读 scriptc 编译器前端type-mapper / lowering与后端C / LLVM emitter之间的通用语言。✅【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何构建一个分钟级行情数据采集程序?从定时请求到可恢复的数据管道

如何构建一个分钟级行情数据采集程序?从定时请求到可恢复的数据管道

一句话结论:分钟级行情采集真正难的不是“每分钟请求一次 API”,而是处理交易时间、重复数据、缺失数据、请求失败和数据落盘,让采集程序能够长期稳定运行。 摘要 分钟级行情数据是很多量化策略的基础,但一个能跑通的 Python 脚本…

2026/10/1 13:36:22 阅读更多 →
人脸识别考勤系统毕设实战:从MTCNN检测到Flask闭环

人脸识别考勤系统毕设实战:从MTCNN检测到Flask闭环

简介:面向计算机相关专业毕业设计的高分项目,以深度学习人脸识别考勤系统为核心,适合正在准备毕设、课程设计或期末大作业的学生使用。项目基于FaceNet算法提取人脸特征,覆盖人脸录入、人脸识别、考勤管理、课堂管理、班级管理、日…

2026/10/1 13:36:22 阅读更多 →
Ubuntu Vulkan安装失败原因与三层架构解析

Ubuntu Vulkan安装失败原因与三层架构解析

1. 为什么在Ubuntu上装Vulkan不是“装个驱动就完事”? 很多人第一次搜“Ubuntu安装vulkan”,点开教程照着敲几行 apt install 命令,终端回车一气呵成,然后兴冲冲跑个 vulkaninfo ——结果卡在 ERROR: [Loader Message] Code…

2026/10/1 13:36:22 阅读更多 →

最新新闻

按评分标准生成标书,别再“凭感觉”写了——这套流程帮你对齐每一个得分点

按评分标准生成标书,别再“凭感觉”写了——这套流程帮你对齐每一个得分点

做投标的朋友应该都有体会:一份标书拿在手里,最怕的是什么?不是内容写不够,而是明明写了,得分点却对不上。技术方案写得再漂亮,评委手里握着的评分表上,某一栏写的是“5分”,你写的是…

2026/10/1 14:19:45 阅读更多 →
爆炸图管理蓝图:PTC PLM落地中不可忽视的数据资产

爆炸图管理蓝图:PTC PLM落地中不可忽视的数据资产

简介:面向企业PLM实施团队及产品数据管理人员,这份PPT围绕PTC PLM项目中的爆炸图管理蓝图设计,针对订单爆炸图人工编制量大、BOM更新未联动图纸变更、图文档状态缺乏管理等典型痛点,给出从需求梳理到方案落地的完整规划。内容涵盖…

2026/10/1 14:19:45 阅读更多 →
脆性薄片搬运中途脆性薄片无征兆掉落,气路压力全部正常,排查方向从哪里入手?

脆性薄片搬运中途脆性薄片无征兆掉落,气路压力全部正常,排查方向从哪里入手?

摘要:脆性薄片多轴搬运专机在动态转运过程中出现无征兆掉片,根源往往不在真空压力读数本身,而是静态读数掩盖了动态工况下的瞬时扰动与间歇泄漏。本文从五个维度剖析隐性诱因:气路监测盲区(单点总管压力无法捕捉短时波…

2026/10/1 14:19:45 阅读更多 →
高速运动启停抖动,脆性薄片搬运碎片,机器人抑振参数怎么调试?

高速运动启停抖动,脆性薄片搬运碎片,机器人抑振参数怎么调试?

摘要:本文围绕脆性薄片多轴搬运设备在启停阶段因抖动导致薄片破碎的问题,系统梳理了抖动产生的底层成因、调试前需确认的硬件基础条件、核心抑振参数类别与调试逻辑,并给出分步实操调试流程与常见误区。文中重点介绍了谢客诚脆性薄片多轴搬运…

2026/10/1 14:19:45 阅读更多 →
汽车厂巡检怎么做?焊装、总装与动力电池车间三段

汽车厂巡检怎么做?焊装、总装与动力电池车间三段

汽车厂巡检怎么做?焊装、总装与动力电池车间三段 汽车厂的车间划分很清晰:焊装、涂装、总装,加上近些年独立出来的动力电池车间。自动化程度高不等于不需要巡检——恰恰相反,节拍越紧,单点异常造成的停线代价越大。下…

2026/10/1 14:19:45 阅读更多 →
线性回归预测青少年身高:可解释建模实战指南

线性回归预测青少年身高:可解释建模实战指南

简介:本资源是一份面向机器学习初学者与实践者的线性回归入门实战材料,聚焦身高预测这一典型连续值回归任务,帮助读者掌握从数据建模到评估落地的完整流程。压缩包共2个文件(1个Excel数据表、1个Python脚本)&#xff0…

2026/10/1 14:18:45 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →