编程语言的「第三条道路」上,走得最远的其实是 C# - 张善友

编程语言的「第三条道路」上,走得最远的其实是 C# - 张善友

💡 原文中文,约3700字,阅读约需9分钟。
📝

内容提要

本文基于对OCaml之父Xavier Leroy的访谈,探讨编程语言的“第三条道路”:融合函数式与系统编程。作者认为C#是此路商业化最成功者,通过GC与手动内存管理结合、Actor模型、静态分析等,实现工程实用与可靠性共存。面对AI生成代码,C#以强类型和编译器反馈过滤错误,强调理解代码正确性才是核心能力。

🔎

延伸解读

C# 的“第三条道路”实践

文章指出,OCaml 证明了函数式与系统编程可以融合,而 C# 是这条路线商业化最成功的代表。C# 通过局部类型推断(var)、默认 GC 但提供 Span<T> 等手动内存管理工具,以及支持 Actor 模型(Orleans),在工程实用性与可靠性之间取得了平衡。这种设计哲学强调“不求理论上最纯,只求工程上最优”,为大型项目提供了务实的选择。

内存管理的务实折中

Leroy 认为手动内存管理并不总是更快,GC 语言在分配和共享结构上可能更高效。C# 的回应是默认使用 GC,同时提供 Span<T>、stackalloc 等逃生舱,允许在热路径上按需进行手动内存决策。这比 Rust 的全局所有权纪律更符合“组织经济学”,即团队中并非所有人都需要精通生命周期管理,但关键路径上的开发者有工具可用。

并发模型的多元选择

Leroy 推崇消息传递的 Actor 模型,而 C# 虽然主线是 async/await 加共享状态,但通过 Orleans 的 Virtual Actor Model 和 System.Threading.Channels,提供了完整的消息传递方案。这使得 C# 能够同时支持共享内存、异步和 Actor 三种并发范式,适应不同场景的需求,体现了其工程上的灵活性。

AI 时代的代码验证策略

面对 AI 生成代码的挑战,Leroy 强调验证正确性的成本并未降低。C# 通过强静态类型、可空引用类型和 Roslyn 分析器,构建了机器可自动检查的质量门槛,能过滤大量 AI 生成的错误代码。同时,Roslyn 的 compiler-as-a-service 特性支持程序化编译反馈,适合构建“LLM 生成 → 编译器反馈 → 自动修正”的闭环,为 AI 辅助编程提供了实用路径。

Q&A

编程语言的“第三条道路”指的是什么?

第三条道路指的是融合函数式编程与系统编程的语言设计路线,既保留函数式语言的表达力和安全性,又具备系统编程所需的性能和底层控制能力。OCaml是这条路的先驱,而C#是商业化最成功的代表。

为什么说C#是第三条道路上商业化最成功的语言?

因为C#在保持工程实用性的同时,通过GC与手动内存管理结合、Actor模型支持、静态分析工具等手段,实现了可靠性与实用性的共存,并且被广泛应用于工业界,证明了这条道路的商业可行性。

C#在内存管理方面如何平衡GC和手动控制?

C#默认使用垃圾回收(GC),但提供了Span<T>、Memory<T>、stackalloc、ArrayPool等工具,允许开发者在热路径上按需进行手动内存管理,从而在单个函数尺度上做出内存决策,兼顾安全与性能。

C#如何支持Actor模型?

C#通过Orleans框架实现了Virtual Actor模型,其中grain之间不可共享状态,只能通过消息传递进行通信,并且从单机到集群使用同一套心智模型。此外,System.Threading.Channels也提供了消息传递的支持。

C#在静态分析和验证方面有哪些实用工具?

C#通过可空引用类型(C# 8+)将空引用错误转化为编译期流分析问题;Roslyn编译器平台提供Analyzer和Source Generator,让团队可以自定义静态验证规则;此外,微软研究院的Dafny语言可以将C#作为编译目标,用于更严格的程序验证。

面对AI生成代码,C#有哪些优势?

C#的强静态类型、nullable流分析和全套Analyzer构成了一道机器可自动检查的质量门槛,能过滤掉大量AI生成的错误代码;Roslyn作为compiler-as-a-service,支持程序化调用编译和诊断,便于实现“LLM生成→编译器反馈→自动修正”的闭环;同时,AI生成代码时还可以附带属性测试等可执行规约,作为非数学形式的证明。

OCaml之父Xavier Leroy对AI生成代码持什么态度?

Leroy对AI生成的代码持谨慎态度,指出OCaml项目收到的AI生成的issue中只有十分之一是有用的,并强调每一行新代码都是负债,他更看重少量经过多年打磨的代码。他认为AI降低了写代码的成本,但并未降低验证正确性的成本,程序员的工作从写代码转变为审查代码,认知负荷并未减轻。

🏷️

标签

➡️

继续阅读