惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
WordPress大学
WordPress大学
博客园_首页
罗磊的独立博客
D
Docker
N
Netflix TechBlog - Medium
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
I
InfoQ
L
LangChain Blog
GbyAI
GbyAI
V
V2EX
博客园 - 聂微东
P
Proofpoint News Feed
博客园 - 【当耐特】
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
U
Unit 42
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏

博客园 - 张善友

.NET 11 性能全解读:从 JIT 到基础库,这一版到底快了多少 .NET 11 性能深度解读:这一次,真的「到 11」了 把 LLM 密钥从环境变量里解放出来:OpenClaw.NET 迎来 Vault/OpenBao 密钥后端 RedNb.Nacos 2.0.0 正式发布:.NET 接入 Nacos 3.2.4,AI Registry 全能力落地 Rust 成为微软一线语言之后:谈谈 C# 与 Rust 的互补性 .NET 异常处理的"暗门":代码里写满 catch,你依然能抓住它——从一个 AI Agent 运行时的源码说起 写给 C++ 工程师的 OpenClaw.NET 上手指南:用你熟悉的 C++ 思维,跑起一个生产级 AI Agent .NET 11 RC1 发布:拿到"准生证",生产环境可以上了! 写给 PHP 工程师的 OpenClaw.NET 上手指南:用你熟悉的 PHP 思维,跑起一个生产级 AI Agent 写给 Rust 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Rust 思维,跑起一个生产级 AI Agent 从对标 Java 到对标 Go:Native AOT 的"无痛化"之路,走到哪一站了? NuGet 半年度总结:周下载量从 54 亿到 67 亿,.NET 生态的"新一轮增长期"实锤了 写给 Java 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Spring 思维,跑起一个生产级 AI Agent 写给 TypeScript 工程师的 OpenClaw.NET 上手指南:用你熟悉的 TS 思维,跑起一个生产级 AI Agent 写给 Python 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Python 思维,跑起一个生产级 AI Agent 写给 Golang 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Go 思维,跑起一个生产级 AI Agent MetaSkill 落地 .NET:当 Agent 从「调用工具」进化到「组织工具」 都是 AI 写代码,为什么 C# 比 Java 快半拍 MHS 三部曲(下):谁允许 AI 行动?——权力、合规与中国厂商的答卷 弱模型不能裸奔:Agent Harness 凭什么真实有效 MHS 三部曲(中):8 小时集成、六种被拦截的故障,和一次教科书级的翻车 TensorSharp 3.3.0.0 发布,视频生成、DFlash2 投机解码、安全加固一起来了 MHS 三部曲(上):别急着叫它「物理 MCP」——Anthropic 到底发布了什么 纯 .NET 手写 CUDA kernel,GLM-5.3-Flash decode 跑出 llama.cpp 的 2 倍 3 张卡到底能不能跑大模型推理?从 vLLM、llama.cpp 到 TensorSharp 的多卡真相 AI 编程时代,.NET 的机会在哪里? Vibe Coding 月提交量 29 亿次之后:GitHub 的危机、Azure 迁移,以及 .NET 的机会 从 PostgreSQL 到 Kubernetes:开源的护城河,从来不写在代码里 人工智能最先替代的,是人工智能学院自己 企业架构的六种场景:从"四大流派"到数字原生与 AI 原生
编程语言的「第三条道路」上,走得最远的其实是 C#
张善友 · 2026-08-30 · via 博客园 - 张善友

"测试只能证明 bug 的存在,却永远无法证明 bug 的缺席。"

—— Edsger Dijkstra

写在前面

最近读到一篇基于 OCaml 之父 Xavier Leroy 深度访谈的文章,标题叫《编程语言的"第三条道路"》[1]

Leroy 是法国科学院院士、法兰西公学院教授,1996 年创造了 OCaml,2024 年拿下了 ACM SIGPLAN 编程语言软件奖。这场近 90 分钟的访谈横跨了函数式编程、形式化验证、内存管理和生成式 AI——几乎每个话题,都能直接映射到 C# 的处境上。

读完后我有个越来越强烈的感受:

这篇文章讲的是"第三条道路",而 C# 是这条路上商业化最成功、却最少被这样叙述的语言。OCaml 证明了这条路可行,C# 证明了这条路能赢。

下面分五条线索,聊聊这篇访谈和 C# 之间的隔空对话。

1


一、混血语言:C# 才是「又纯又脏」路线的商业冠军

Leroy 对 OCaml 的定位很有意思:

"OCaml 是一种优秀的函数式语言……但它同时也是一门相当不错的系统编程语言。"

纯函数式语言(Haskell、Coq)活在学术象牙塔里,系统语言(C、C++)活在工程泥潭里。OCaml 不站队,两头都要,靠这种"不媚俗"的混血活了 30 年[1:1]

但说实话,这条混血路线走得最远的其实是 C#——只是它做得更隐蔽:

  • LINQ:Erik Meijer 把 Haskell 的 monad 和查询综合"偷运"进了主流语言;
  • records、模式匹配、switch 表达式、init-only:这些全是 ML 家族的家当,经由 F# 先在 .NET 里趟路,再反向输入给 C#;
  • async/await:原型是 F# 的 computation expressions——"学术成果经工业界放大"的教科书案例。

这里有个常被忽略的事实:F# 本身就是 OCaml 的直系兄弟(Don Syme 在微软剑桥研究院起家时,做的就是"OCaml for .NET")。

所以 .NET 生态其实是混血双轨制——F# 保留了纯血 ML 的完整类型推断和不可变默认,C# 负责把这些特性"平民化"。

比如 var:C# 只做局部类型推断,在 API 边界强制显式标注。这恰好踩中了 Leroy 说的权衡——全局推断固然优雅,但大规模项目需要显式签名充当文档[1:2]。C# 没有追求完整的 Hindley-Milner 推断,不是不能,而是判断了对工程团队的阅读成本不划算。

这是 C# 一以贯之的设计哲学:不求理论上最纯,只求工程上最优。


二、GC 之争:C# 给出了第三种答案

访谈里 Leroy 抛出了一个反直觉的观点:

"手动内存管理并不总是更快。或者你需要是一位非常优秀的程序员才能让它总是更快。"

他的论据很实在:GC 语言的对象分配是指针递增式的 bump-allocation,接近 O(1);共享结构不需要拷贝,而手动管理下"因为你不确定是不是唯一所有者,所以拷贝一份——但拷贝在时间和内存膨胀上都代价高昂"[1:3]

Jane Street 的案例最耐人寻味:高频交易领域每一微秒都是钱,他们却选了带 GC 的 OCaml 而不是 Rust——因为人为错误的成本远高于 GC 开销

面对"GC vs 手动"的站队题,C# 的回应比选边站更精明:

默认 GC,但系统性提供逃生舱。

  • Span<T> / Memory<T>:零分配地切片内存,不放弃 GC;
  • 值类型 + stackalloc + ArrayPool:覆盖高频热路径;
  • NativeAOT:把 GC 的存在感压到极低,打进嵌入式和 CLI 启动场景。

换句话说:OCaml 证明了"GC 语言可以做系统编程",C#/.NET 则进一步证明了"GC 语言可以按需在单个函数尺度上做手动内存决策"。

这比 Rust 的全局所有权纪律更符合 Leroy 那套"组织经济学"逻辑——团队里不是每个人都需要精通生命周期,但热路径上的那个人手里有工具。


三、并发哲学:Leroy 大概会更喜欢 Orleans

访谈里最生动的一段,是 Leroy 吐槽共享内存并发:

"共享内存并发就像你想和邻居交流,你破门而入,移动他们家的家具,等他们回来时会说'哦,有东西被移动了,大概是想告诉我什么'……也许你可以直接去你的邻居?——这就是消息传递。"

他推崇的是 Erlang 风格的 Actor 模型[1:4]

有意思的是,C# 主线走的是 async/await + 共享状态的老路,但 Orleans 的 Virtual Actor Model 就是 .NET 世界对消息传递的完整回答:grain 之间不可共享状态、只能收发消息,单机到集群共用同一套心智模型。

再加上:

  • System.Threading.Channels:标准的 CSP 管道;
  • TPL Dataflow:数据流网络;
  • async/await:任务并发。

C# 其实是把三种并发范式都摆上了货架。

这里有个颇具讽刺意味的对照:OCaml 5 为了 Jane Street 的需求在共享内存上做了妥协,而 C# 这个"共享内存出身"的语言,反而把 Actor 模型做成了工业级产品。


四、形式化验证:C# 是「轻验证」路线的极致

文章里有一张三种形式化方法的对比表[1:5]

方法 自动化程度 成本比(vs 写代码) 典型工具
类型系统 全自动 0.1x OCaml / TypeScript
静态分析 全自动 0.5x Infer, Astrée
程序证明 交互式 10–50x CompCert, seL4, Lean

C# 在"10–50x"那层基本缺席(Spec# 和 Code Contracts 都死在了沙滩上),但在 0.1x–0.5x 区间做到了极致:

可空引用类型(C# 8+)
本质上是把"十亿美元错误"变成编译期流分析问题。不用写一行证明,编译器替你盯着每一个可能为 null 的路径——这是向验证迈出的最实用一步。

Roslyn 编译器平台
Analyzer 和 Source Generator 让每个团队都能低成本编写自己的静态验证规则。等于把"静态分析"这一层民主化了。

Dafny
微软研究院真正做程序证明的语言,可以把 C# 作为编译目标之一。重验证的路线,微软也没完全放弃。

Leroy 花了大半辈子在 CompCert 上——一个携带数学证明、保证"编译器不会引入源程序中不存在的 bug"的 C 编译器,2026 年 3 月还帮空客 ATR 42/72 的航电系统拿下了 DO-178C 认证[1:6]

C# 走不了这条路,也不需要走。它的策略是:把验证的成本压到接近于零,让 99% 的普通项目也用得起。


五、AI 时代:C# 最大的隐藏优势

访谈最尖锐的部分是关于 LLM 的。Leroy 作为 OCaml 维护者,吐槽非常直接:

"我们收到了很多明显由 AI 生成的 issue。10 份报告里可能只有 1 份是好的。每份报告都有好几页——详细的解释、复现步骤——但最终什么也复现不了。"

"对我来说,每一行新代码都是负债。我不想要海量代码,我要的是 50 行经过多年打磨的代码。"[1:7]

他的核心警告是:AI 降低了"写代码"的成本,但没有(甚至提高了)"验证正确性"的成本。 程序员从"写代码者"变成"代码审查者",工作并没有变轻松,只是从一种认知负荷切换到另一种[1:8]

在这个语境下,C# 的位置其实相当好:

第一,强静态类型 + nullable 流分析 + 全套 Analyzer,构成了一道机器可自动检查的质量门槛。 AI 生成的 slop,在编译器这一关就会被过滤掉一大半。

第二,Roslyn 是 compiler-as-a-service。 Agent 可以程序化地调用编译、拿到结构化诊断、再迭代修正——C# 大概是主流语言里最适合做"LLM 生成 → 编译器反馈 → 自动修正"闭环的之一。

第三,Leroy 的愿景是"AI 生成代码的同时生成一份 Lean/Coq 证明"。 离 C# 最近的现实版是:AI 生成代码,同时生成 analyzer 规则和属性测试(Property-Based Testing)。证明不必是数学形式的,可执行的规约也是证明。

顺便说一句 DDD:C# 的 records、不可变值对象、模式匹配做领域建模已经很顺手,但真正完整的"用类型让非法状态不可表示"还得看 F# 的路数(Scott Wlaschin 的 Domain Modeling Made Functional 就是这套思路)。做领域对象投影、工作流 DAG 这类强结构化场景,F# 的判别联合 + 编译期完备性检查,比 C# 的 class 层级更贴合"建模即验证"。


结语:Leroy 的执念,C# 的回答

访谈结尾,Leroy 说了一段让我印象很深的话:

"写出代码从来不是终点。理解代码为什么正确,才是真正的编程能力。"

一个学术语言的守护者,用三十年证明"可靠性与工程实用可以共存"。

而 C# 用另一种方式回应了同样的命题:不必要求每个开发者都成为证明专家,而是把验证、内存安全、类型纪律,一层层织进语言和平台的基础设施里,让正确的代码成为默认路径。

OCaml 是第三条道路的宣言,C# 是第三条道路的基建。

Dijkstra 那句话放在今天依然紧迫:我们应该用自己完全理解的程序,去解决未知世界的问题——而不是反之。

只不过在 2026 年,帮你"理解程序"的,除了你的大脑,还多了一个编译器,和一个永远在生成"差不多正确"代码的 AI。

选一门能让编译器替你吵架的语言,可能是这个时代最务实的浪漫。


本文基于 Xavier Leroy 在 The Peterman Podcast(2026 年 7 月)访谈的解读文章展开,部分观点为作者延伸。


  1. https://zhuanlan.zhihu.com/p/2063254883969544605 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎