Ocamlpro

OCamlPro,通过形式化方法解决复杂软件设计挑战的专业公司,推动 OCaml 与 Rust 在安全关键系统中的应用。

OCaml 入门:Dune 构建系统介绍

面向 OCaml 新手的 Dune 构建系统实战入门教程。从 dune-project 元数据文件和 dune 构建规范文件讲起,手把手演示如何定义 library(库)、executable(可执行文件)和 test(测试)三种核心构建目标,附带每个配置块的完整代码示例和实际命令行输出。文章还介绍了 dune build、dune exec、dune runtest 等日常命令的用法,以及 cram 测试这种无需外部依赖、直接基于命令行会话快照做校验的测试方式。基于 OCamlPro 的 helloer 示例项目展开,适合刚接触 OCaml 工具链、想快速理解 dune 如何组织项目的开发者参考。内容偏教程文档风格,实用性强但缺少个人观点或讨论入口。
评论点赞收藏72 天前

OCamlPro 发布 Opam 2.3.0

Opam 2.3.0 正式发布,这是 OCaml 包管理器切换为 6 个月时间驱动发布周期后的首个版本。关键变化包括:packages 的 files/ 目录中未在 extra-files 字段声明的文件将被忽略(breaking change),需用 opam admin update-extrafiles 修复;不再支持旧版 opam 的包会被标记为 unavailable 而非报错,方便仓库平滑升级;新增 --latests-only 筛选最新包、--deps-only 仅安装依赖、--verbose-on 按包名开启详细日志等选项;内置 0install 求解器大幅改进,可作为默认选项;修复了 git 子模块更新失败时从警告改为报错、32 位系统 arch 变量取值错误等多个问题。Linux/riscv64 和 NetBSD/x86_64 新增预编译二进制支持。
评论点赞收藏624 天前

Flambda2 系列第三篇:投机性内联(Speculative Inlining)

OCamlPro 团队一线开发者深入解析 Flambda2 优化编译器中的投机性内联策略。内联是函数式语言编译优化的关键环节,但盲目内联会导致代码体积指数级膨胀。本文用具体 OCaml 代码示例展示了内联如何为后续优化(如常量传播)打开大门,同时揭示了核心权衡:减少执行指令 vs 控制代码尺寸。Flambda2 的创新在于将内联、优化和回溯三者结合——先假设内联某函数并评估优化后的收益,得不偿失则撤销。文中通过高阶函数条件分支的 case study 演示了这一过程,并解释了为什么传统启发式方法难以维护:因为需要跨多层函数调用的上下文信息才能做出正确决策。对于 OCaml 编译器或函数式语言优化感兴趣的读者,这是来自实际实现团队的第一手技术详解,含完整代码示例和参考资料。
评论点赞收藏709 天前

OCaml 中那些你不该手动做的优化

核心看点:一位 OCaml 编译器核心开发者以亲身经验告诉你,不要替编译器做优化工作——写可读代码,让编译器变聪明。文章以 OCaml 内联(inlining)优化为切入点,深入解释编译器在闭包转换、值分析、常量折叠、直接调用特化等环节的工作原理,并展示了 flambda 新中间表示如何通过拆分优化 pass、多次应用来生成更优代码。作者给出了大量代码示例,说明手动内联、手动消除闭包分配等"优化"会让代码更丑且无必要,编译器完全可以自动处理。同时也诚实指出当前 inliner 的局限(递归函数复制与调用消除未分离、结构化常量/局部函数阻止内联),并预告了未来方向:未用参数消除、lambda lifting、公共子表达式消除、浮点数提早拆箱。文章不搞花哨性能图表,强调"演示 pass 目前甚至可能比现编译器差",态度诚恳实在。适合对 OCaml 或函数式语言编译器实现感兴趣的中高级读者深入阅读。
评论点赞收藏744 天前

Flambda2 系列第二篇:将尾递归函数转换为循环

深入讲解 OCaml Flambda2 编译器中 Loopify 优化的原理与实现。文章从尾调用优化(TCO)的历史背景讲起,用图示清晰解释了非尾递归、带 TCO 与不带 TCO 的尾递归在栈内存分配上的差异。核心问题在于:OCaml 中纯函数式尾递归代码可能因浮点数装箱导致额外内存分配,开发者被迫手写基于可变引用的命令式循环来榨取性能。Loopify 的解决方案是自动将纯尾递归函数转换为非递归函数内的一个循环(continuation 调用),让编译器能进一步应用浮点拆箱等优化,从而让优雅的函数式代码跑出命令式代码的性能。文章还通过 iter_with_log 的完整编译变换示例,展示了 [@@loop] 属性在函数非纯尾递归但经内联后变成纯尾递归场景下的使用方式。真正的技术干货,适合对 OCaml 编译器后端或函数式语言优化感兴趣的读者。
评论点赞收藏786 天前

Flambda2 中的 CPS 表示与基础设计决策

OCamlPro 团队详解 Flambda2 优化编译器为何选择 CPS(续延传递风格)作为核心 IR 表示。文章通过具体代码示例,对比了一等 CPS 与二等 CPS 的区别,展示如何将 CPS 转化为显式控制流图,并利用图压缩实现死代码消除、常量传播等优化。引入双管 CPS(Double-Barreled CPS)来处理正常返回和异常两条控制路径,将 IR 构造子从 Clambda 的 20 个和 Flambda 的 15 个精简到仅 6 类。后续优化管道包括 CPS 转换、闭包转换、单趟 Simplify 遍历(向下分析+向上重建),再到 CMM IR 输出。适合对 OCaml 编译后端、函数式编译优化或编译器 IR 设计感兴趣的读者,内容扎实、有第一手工程经验。
评论点赞收藏786 天前

Flambda2 短文系列(零):开篇介绍

OCamlPro 团队推出 Flambda2 编译优化系列博客的首篇(第 0 集),面向对 OCaml 编译器实现感兴趣的高阶开发者。文章梳理了 OCaml 编译流水线中 Lambda → Clambda → CMM 的经典路径,解释了早期 Closure 与 Flambda 两种后端的共存原因(编译速度 vs 优化强度),并引出新一代优化后端 Flambda2 的设计动机:绕过 Clambda 中间表示直接翻译到 CMM,解除旧架构对优化空间的限制。文中也预告了后续各集主题,包括 CPS 表示设计、尾递归循环优化、推测性内联等。由 Jane Street 资助合作开发,内容来自该项目的核心工程师团队,具备一手技术深度和工程判断。非营销软文,有实质技术信息含量。
评论点赞收藏879 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。