Xavier Leroy on programming, languages and formal verification

Lobsters Hottest 新闻

摘要

OCaml 创建者 Xavier Leroy 在访谈中讨论了 OCaml 的设计优势、与 Rust 和 JavaScript 的对比、类型推断原理以及函数式编程的学习难度。

<p><a href="https://lobste.rs/s/oviysl/xavier_leroy_on_programming_languages">Comments</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/27 01:39

**TL;DR:** Xavier Leroy discusses OCaml’s strengths (functional, predictable, good GC), contrasts it with Rust and JavaScript, and explains type inference via constraint solving. ## 访谈背景 在这段访谈中,OCaml 编程语言的创建者 Xavier Leroy 分享了关于编程语言设计、形式化验证以及内存管理的观点。他回应了关于 Rust、JavaScript 以及函数式语言学习难度的问题,并深入解释了类型推断的工作原理。 ## OCaml 的设计哲学与优势 ### 函数式与系统编程的融合 OCaml 是一门优秀的函数式语言,支持归纳类型、模式匹配、高阶函数等特性,同时也是一门前瞻性的系统编程语言。它完全具备命令式编程能力,拥有异常、线程以及用户定义的效果处理器等控制结构。 ### 可预测的成本模型 Leroy 强调,OCaml 的成本模型和执行模型非常可预测:“当你写代码时,你很清楚什么会耗时,什么会快,什么会慢。” 相比之下,许多函数式语言在这方面表现不稳定。OCaml 的编译器生成高效代码,并配有低延迟的垃圾收集器(GC),适合网络编程等场景。 ### 来自系统的早期采用者 OCaml 最初用于定理证明和领域特定语言。后来,康奈尔大学的 Ensemble 项目(用于可靠多播的网络协议栈)将代码从 C 移植到 OCaml,结果代码更优雅、更易演进,性能与 C 相当。他们还利用数据包传输的空闲时间运行 GC,实现“零成本”回收。另一个重要用户是 Jane Street,他们用 OCaml 构建交易基础设施,看重其快速、可靠、无长停顿以及非程序员可读性。 ## Rust 与 OCaml 的分界线 ### 内存管理:自动 vs 手动 Leroy 指出,OCaml 与 Rust 的主要区别在于内存管理:OCaml 使用自动 GC,而 Rust 是手动内存管理语言。“据我所知,它是手动内存管理方面最优秀的语言。它通过借用等规则使其基本安全,并跟踪所有权等。但它仍然是需要自己分配和释放内存的语言。” 这使得编程更安全,但责任也更重。 ### 性能权衡并非绝对 虽然手动内存管理通常被认为更快,但 Leroy 补充道:“手动内存管理并不总是更快,或者你需要非常优秀的程序员才能始终更快。” 例如,C++ 中因不确定唯一拥有者而大量复制对象,导致时间和内存膨胀。GC 语言在共享数据结构时更有优势;而 Rust 的所有权规则可能迫使取消共享,占用更多内存。 ### “混合管理”的尝试 Jane Street 的 Oxidized OCaml 项目尝试将某些数据结构栈分配,以期结合手动与自动管理的优势。但 Leroy 的实验表明收益有限:短生命周期对象在 GC 下成本已经很低;而长生命周期对象才会承受更多扫描开销,栈分配对它们无效。 ## 对 JavaScript 的批评 Leroy 坦言自己不是 JavaScript 的粉丝。“它非常动态。类型检查完全是动态的,而且几乎一切都可以在运行时重新定义——包括方法调用的语义。” 这种极高的动态性使程序脆弱且存在安全风险。他认为 JavaScript 是“终极动态语言”,而 OCaml 则非常静态。 但他也承认 JavaScript 内部包含一个函数式内核(类似 Lisp),设计者 Brendan Eich 曾受 Lisp 影响。但他批评 JavaScript 的元对象协议(允许修改方法调用等基本操作的语义)是“安全噩梦”,且易被滥用。 ## 函数式语言的学习难度 Leroy 认为函数式编程本质上并不更难,尤其是对有数学背景的人。他引用 Rob Pike 的话,指出 Google 招聘大量刚毕业的工程师,因此选择更简单的语言。而像 Jane Street 这样的公司使用 OCaml 作为筛选标准,申请者背景更有趣。他还提到 Python 有 50% 是函数式语言,熟悉 Python 的人已经半只脚踏入函数式编程。 ## 类型推断:原理与实例 ### 核心思想 类型推断允许程序员省略大部分类型声明,因为编译器可以从使用方式中推断出类型。例如,`X = string length of S` 能推出 `S` 是字符串,`X` 是整数。 ### 编译器的工作方式 Leroy 解释,编译器会收集一组约束,然后求解。如果没有解则报类型错误;如果有多个解,则选择一种可预测的标准解。程序员仍可手动添加类型注解以增强文档和可读性。 ### 一个简单的例子(部分转录) 虽然转录在此中断,但 Leroy 开始举例:“假设有一个函数,两个参数 X 和 Y…” 类型推断正是通过分析类似表达式来生成并求解约束方程组。 --- **Source:** [Xavier Leroy on programming, languages and formal verification – YouTube](https://www.youtube.com/watch?v=9Cswiqrq6So)

相似文章

Syntax with Purpose in a Programming Language

Lobsters Hottest

这篇文章探讨了编程语言语法设计的重要性,认为语法应准确反映语言的计算模型和心智模型,而非为了熟悉感或简洁性随意拼凑。作者通过分析OCaml、Lisp/Clojure和JavaScript的语法设计,并介绍自己设计的语言Saul,强调了统一性和语义一致性。

为什么ML/OCaml适合编写编译器(1998)

Lobsters Hottest

这篇1998年的文章认为,ML和OCaml非常适合编写编译器,因为它们具有垃圾收集、尾递归优化以及带有模式匹配的代数数据类型等特性,这些特性简化了复杂编译器数据结构的处理。

为何Rocq在程序验证上优于Lean

Lobsters Hottest

一篇技术博文认为,由于Rocq(Coq)原生支持余归纳类型和cofixpoints,而Lean基于库的方法尚不成熟,因此Rocq在程序验证方面优于Lean。