purescript-native编译器原理(一):PureScript源码到corefn JSON再到IL中间语言的完整旅程
purescript-native编译器原理(一):PureScript源码到corefn JSON再到IL中间语言的完整旅程【免费下载链接】purescript-nativeA native compiler backend for PureScript (via C or Golang)项目地址: https://gitcode.com/gh_mirrors/pu/purescript-nativepurescript-native是一个PureScript 原生编译器后端它把 PureScript 编译出的 corefn JSON 进一步翻译成 C或 Go源码最终生成可调试、可移植的本地原生可执行文件。本文带你完整走一遍这条编译旅程——从 PureScript 源码出发经过corefn JSON 中间表示进入pscpp自研的IL中间语言再经多轮优化最终打印成 C 代码。一、为什么需要 PureScript 原生编译器PureScript 是类型安全的函数式语言官方默认目标是 JavaScript。但如果你想生成真正的本地二进制没有 JS 运行时开销用 C 的std::shared_ptr做自动内存管理拿到接近 C 的性能直接调用 C/C 库FFI 就是 C 函数生成健全、可调试的代码——每行都能对应回 PureScript 源码结构那么purescript-native就是答案。它的pscpp工具只依赖 C11 标准库无额外运行时。类型映射非常直接见 README-cpp.mdPureScript 类型C 实现IntintNumberdoubleBooleanboolString/Charstd::stringUTF-8Arraystd::vectorboxed对象 / 泛型值boxed智能指针 联合体二、编译管线总览五步走整条旅程可以概括为五步后三步全部发生在pscpp内部PureScript 源码 │ purs compile ▼ corefn JSON每个模块一个 .json 文件 │ pscppHaskell 编写的转译器 ▼ CoreFn AST ──► IL命令式中间语言──► 优化器多轮 Pass ──► C .h/.cpp 源码 │ makeC 编译器 ▼ 本地原生可执行文件入口逻辑在 app/Main.hspscpp接收一批 corefn JSON 文件先向输出目录写入运行时支撑文件writeRuntimeFiles 会输出runtime/下的 purescript.h、purescript.cpp 等 5 个文件再用Par.mapM并行转译每个模块。三、第一步purs 生成 corefn JSONcorefnCoreFn是 PureScript 官方定义的纯函数式中间表示经类型检查与类型类消解后产生并用 JSON 序列化——这正是pscpp的输入。这意味着purescript-native与 PureScript 编译器松耦合任何能产出 corefn 的工具链都可用JSON 形式便于检查、缓存pscpp会对比 JSON 文件与输出头文件的时间戳跳过未变更模块见 generateCode。四、第二步JSON 反序列化为 CoreFn 模块pscpp用 Aeson 把 JSON 解析为ValueparseJson再借助 PureScript 库自带的moduleFromJSON还原成带注释信息的Module AnnjsonToModule。这一步是纯数据还原真正的翻译从下面开始。五、第三步CoreFn → IL表达式变命令式IL 直接复用 PureScript 的CoreImp AST命令式 AST核心转换函数是 moduleToIL。它做的事情模块名去冲突renameImports给导入模块生成别名避免与声明名撞车src/CodeGen/IL.hs逐个声明转换bindToIL→ valueToIL 是翻译的核心逐条处理 CoreFn 表达式字面量 → IL 字面量LambdaAbs→ ILFunctionlambda 提升为一等值App应用 → 嵌套App节点模式匹配Case→ 一串IfElse分支bindersToIL构造子模式先判断InstanceOf标签再逐字段取属性代数数据构造子→ 返回对象字面量的函数对象里带一个类型标签字段如{Just: true, ...}newtype自动拆箱直接返回内部值所有值统一包成boxed类型——它在运行时 runtime/purescript.h 中是std::shared_ptrvoid加一个存放int/double/bool的联合体既支持引用计数又避免小值堆分配。命名规则由 src/CodeGen/IL/Common.hs 保证合法C 关键字会被加下划线后缀properToIL模块名中.替换为_运行时保留名box、unbox、dict等也不能占用ilLiterals。六、第四步优化器 Pass让 IL 又快又省未优化的 IL 只是能跑Optimizer.hs 中的 optimize 会按固定顺序跑多轮 Pass每轮用 untilFixedPoint 迭代到不动点Pass作用源码位置内联unsafeCoerce/unsafePartial消除零成本安全操作Inliner.hsmagicDo把Effect/ST/Eff的、pure、discard展开成顺序语句do 块变直线代码MagicDo.hsTCO 尾调用优化尾递归函数改写成while循环_tco_loop_/_tco_done_递归永不爆栈TCO.hs内联公共值/运算符识别类型类字典把Data.Semiring.semiringInt.add 1 2还原成原生1 2、、字符串拼接、位运算同理Inliner.hstidyUp折叠嵌套块/If、去尾部代码、eta 化、IIFE 求值、变量内联Optimizer.hs删除未用结果、合并变量声明清理垃圾语句Optimizer.hs正是这些 Pass 让最终的 C 既贴近手写风格、又可直接用 GDB 单步调试。七、第五步Printer 打印 C 源码Printer.hs 把优化后的 IL 漂亮地打印成 CFunction节点变成 lambda静态值提升为auto f() - const boxed {...}惰性初始化、IfElse/While/For直接对应 C 控制流、Indexer变成::()或[]访问Printer.hs。每个模块最终产出两个文件transpilesrc/Module.h—— 接口声明供其他模块#includesrc/Module.cpp—— 实现 模块头部的#include 尾部的 foreign 导入声明。若你的编译器不支持 Unicode 字面量如 gcc加--ucns选项会把非 ASCII 字符转为\UXXXXXXXX编码toUCN。八、关键源码地图 模块职责app/Main.hs命令行入口、JSON 读取、输出文件管理src/CodeGen/IL.hsCoreFn → IL 翻译核心src/CodeGen/IL/Common.hs标识符合法化、内置名表src/CodeGen/IL/Optimizer.hs优化 Pass 编排src/CodeGen/IL/Optimizer/TCO.hs尾递归 → 循环src/CodeGen/IL/Optimizer/MagicDo.hsdo 块脱糖src/CodeGen/IL/Optimizer/Inliner.hs类型类字典内联为原生运算符src/CodeGen/IL/Printer.hsIL → C 源码runtime/purescript.hboxed等运行时核心类型support/Makefile--makefile生成的构建模板九、如何上手体验安装 PureScript0.13与 C11 工具链clang 或 gccpscpp --makefile生成 GNU Makefile源码放src/C FFI 放ffi/然后make debug或make release多核可加-jN。细节可参阅 README-cpp.md 的 Getting Started 章节。十、小结这条PureScript 源码 → corefn JSON → IL → 优化 → C → 二进制的旅程体现了原生编译器后端设计的精髓用官方 JSON 中间表示解耦前端用命令式 IL 多轮 Pass 控制生成代码质量。理解了moduleToIL、optimize、prettyPrintIL这三个函数你就掌握了pscpp的全部骨架。下一期我们将深入boxed类型系统与 C FFI 的协作机制敬请期待【免费下载链接】purescript-nativeA native compiler backend for PureScript (via C or Golang)项目地址: https://gitcode.com/gh_mirrors/pu/purescript-native创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从初等数学到微分方程:数学建模核心思想与实战应用

从初等数学到微分方程:数学建模核心思想与实战应用

1. 从“板凳龙”到“微分方程”:初等数学建模的实战起点如果你最近关注过数学建模竞赛,可能会被“板凳龙闹元宵”这样的赛题吸引。这听起来像是一个充满民俗风情的文化问题,但本质上,它考察的是如何用数学语言描述一个动态、有约束…

2026/8/24 12:00:58 阅读更多 →
博弈论入门:从取石子游戏到必胜态分析,掌握算法竞赛核心思维

博弈论入门:从取石子游戏到必胜态分析,掌握算法竞赛核心思维

1. 项目概述:从一道竞赛题到策略思维的深度剖析“CF1558A Charmed by the Game” 这个标题,对于不熟悉Codeforces平台的朋友来说,可能有些不知所云。但如果你是一位算法竞赛的参与者,或者是对策略性思维游戏感兴趣的开发者&#x…

2026/8/24 12:00:58 阅读更多 →
如何用一条命令看穿文件身份:Detect It Easy 新手完整上手指南

如何用一条命令看穿文件身份:Detect It Easy 新手完整上手指南

如何用一条命令看穿文件身份:Detect It Easy 新手完整上手指南 【免费下载链接】Detect-It-Easy Program for determining types of files for Windows, Linux and MacOS. 项目地址: https://gitcode.com/gh_mirrors/de/Detect-It-Easy 拿到一个来路不明的可…

2026/8/25 13:57:25 阅读更多 →

最新新闻

【图论】Tarjan 缩点:解决有向图中环的问题

【图论】Tarjan 缩点:解决有向图中环的问题

题目链接:P3387 【模板】缩点 / 强连通分量 - 洛谷 有向无环图(DAG)具有很多很好用的性质,因为没有环而且有向无环图必定有一个点是入度为 0 也必定有个点是出度为 0 所以非常适合拓扑排序,也因为没有环,所…

2026/8/25 14:54:32 阅读更多 →
请求绑定 binding(binding/ 包)

请求绑定 binding(binding/ 包)

1.1 Binding 接口源码位置:binding/binding.go:30-35// Binding describes the interface which needs to be implemented for binding the // data present in the request such as JSON request body, query parameters or // the form POST. type Binding interface {Name()…

2026/8/25 14:54:32 阅读更多 →
多Agent系统中的子Agent通信机制:三大经典范式深度解析

多Agent系统中的子Agent通信机制:三大经典范式深度解析

多Agent系统中的子Agent通信机制:三大经典范式深度解析 一、引言 随着大语言模型(LLM)能力的飞速发展,单Agent系统在处理复杂任务时逐渐暴露出能力边界有限、鲁棒性不足等问题。多Agent系统应运而生,通过多个专业化Age…

2026/8/25 14:54:32 阅读更多 →
Hi9263实地150V 如何让32串BMS高压取电稳定可靠功耗低

Hi9263实地150V 如何让32串BMS高压取电稳定可靠功耗低

引言从高压动力电池母线直接取电、一步降压给 MCU / AFE / 通信模块供电——这颗 ESOP8 小封装芯片,正在成为 BMS 与众多高压系统的供电主力。01 为什么 BMS 需要一颗高压低功耗的 DCDC新能源浪潮下,电池管理系统(BMS)是电池组的「…

2026/8/25 14:54:32 阅读更多 →
2026体育单招1321个名额空出!为什么有证书依旧上不了本科

2026体育单招1321个名额空出!为什么有证书依旧上不了本科

2026体育单招1321个名额空出!为什么有证书依旧上不了本科?这绝对颠覆你对体育单招的认知。很多人以为有了二级证、有了专项成绩就稳了,结果连本科线都摸不到。我直接告诉你真相:这1321个名额根本不是"没人报"&#xff0…

2026/8/25 14:54:32 阅读更多 →
AI 玩具机芯打样流程——从需求确认到量产上市

AI 玩具机芯打样流程——从需求确认到量产上市

AI 玩具机芯打样流程——从需求确认到量产上市 从需求确认到量产上市,一颗 AI 玩具机芯要走多久?本文拆时间线,也拆每一段的钱花在哪,供工程与采购评估参考,同时把最容易超支的隐性成本单列出来,并给出一份…

2026/8/25 14:53:32 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →