跳到正文
Hacker News· EGreg·· 5 天前AI 评分22

U 编程语言在 2026 年做出的设计取舍

The trade-offs that the U programming language made in 2026

AI 导读

U 编程语言在 50 个设计维度上做出取舍,其中 44 项被评为正确、5 项存疑、0 项错误。它默认非空、默认不可变、默认栈分配,用 ARC 加编译期环检测取代 GC,并以 13 个单字母关键字把整个语言压缩到 1,600 token 入门、Claude Sonnet 编译通过率 96%。

正文 · AI 翻译

每种语言都会在数十个设计维度上做出取舍。以下是 U 的取舍与最先进水平的对比——以及每一个取舍是否正确。

44正确 5有争议 0错误 共 50 个维度

安全默认值

1

空安全 正确

默认 -N,可选 +N。除非你主动要求,否则非空。

Kotlin、Swift、Rust 都是后来才补上的。U 从第一天就有。

2

可变性 正确

默认 -M。除非你要求 +M,否则一切都是只读的。

Rust 的 let 与 let mut 证明了这行得通。U 更进一步——不可变性会通过引用传播。

3

堆分配 正确

默认 -R(栈),可选 +R(带 ARC 的堆)。

大多数值不需要堆。让堆显式化是正确的默认。

4

垃圾回收 正确

无。ARC + 编译期循环预防。

没有 GC 停顿,确定性释放。Swift 也选择了 ARC,但需要运行时的循环收集器。

5

循环预防 正确

通过 Tarjan 的 SCC 在编译期完成。弱边用 +R(parent)。

新颖。Rust 使用运行时 Weak<T>。U 把循环变成编译错误。

6

错误处理 正确

签名中的 !,后缀处理器 x。没有 try/catch。

Java 的受检异常太啰嗦。Rust 的 Result<T,E> 可行,但 ? 会吞掉类型。U 的 x 按错误类型区分。

7

静默吞错 正确

不可能。没有 catch(Exception e) {}。

每个错误都必须被处理、传播或回退。

8

布尔强制转换 正确

没有真值/假值。L 就是 true 或 false。

每种语言对 0、""、[] 的真值判断都不同。U 要求显式布尔值。

类型系统

9

效应追踪 正确

签名中的 ±E。一个字符。

Haskell 证明了效应很重要。Koka 证明了效应可以被追踪。U 跳过了 monad 包装。

10

确定性追踪 正确

±D 独立于 ±E。

没有其他主流语言把“有副作用”和“非确定性”区分开来。

11

能力追踪 正确

+IO、+Net、+DB、+Crypto、+Exec、+Unsafe。

Pony 和 E 在学术上做过这件事。U 让它变得实用——通过调用链传播。

12

声明优于推断 正确

注解是意图的声明,而不是供编译器推断掉的噪音。

论文的核心洞见。推断恢复代码是什么;声明记录作者想表达什么。

13

泛型 正确

类型参数,单态化(像 Rust,而不是 Java 的类型擦除)。

没有运行时开销。没有类型擦除的意外。

14

修饰符组合 正确

a f = async,z f = 编译期,u f = AI 管理。可组合的前缀。

一个系统,而不是为每个特性新增关键字。

内存与并发

15

内存模型 正确

四层:栈 → 育幼区 → slab → arena。

为每种生命周期选择合适的分配方式。带分层位掩码的 slab 分配器是 O(1)。

16

复制语义 正确

c 显式浅拷贝(在 +R 处停止),c! 强制深拷贝。

Python 的隐式共享、JS 的展开、C++ 的隐式拷贝构造函数——都是 bug。U 让每次复制都可见。

17

并发 正确

通过 << 实现 MVCC。没有锁,没有死锁。

PostgreSQL 证明了 MVCC 可行。Clojure 的 STM 证明了它在语言中可行。U 把它变成原语。

18

异步模型 正确

没有染色。a 前缀,帧结构状态机。

Go 证明了无染色可行。Rust 证明了状态机可行。U 把两者结合起来。

19

异步可移植性 正确

堆分配的帧,而不是分段栈。

可在 WASM 上运行。没有特定于 ISA 的代码。Go 的 goroutine 需要栈复制。

20

闭包 正确

带 => 的 Lambda。捕获由修饰符系统管理。

+R 捕获在作用域结束后仍存活,-R 是栈局部的。没有 [weak self] 或 move。

安全性

21

注入防护 RIGHT

模板标签 — SQL`...`、HTML`...`。裸 S 是类型错误。

类型层面的过滤,而非运行时过滤。从结构上消除 OWASP Top 10 第 1 项。

22

包签名 RIGHT

从第一天起就是 M-of-N。不是事后加上的。

npm 的“谁有 token 谁说了算”是坏的。M-of-N 意味着单个被攻陷的维护者无法推送恶意软件。

23

能力审计 RIGHT

清单轨迹 + 版本差异比对。u audit。

一个在补丁版本中添加 +Net 的 JSON 解析器是可被机器检测的。没有其他包管理器做到这一点。

24

JIT 插件沙箱 RIGHT

带能力授权的 o()。执行前先做类型检查。

LLM 生成的插件在运行任何一行之前先被验证。不是运行时过滤器。

25

编译器作为红队 RIGHT

结构性 bug 是编译错误,不是警告。

警告会被忽略。错误会被修复。空值、注入、竞态、能力泄漏 — 全是错误。

AI 集成

26

AI 管理的函数 RIGHT

语法中的 u 关键字。契约指纹。

没有其他语言把人类/AI 的边界放进语法里。

27

LLM 可学习性 RIGHT

1,600 token 的入门材料。Claude Sonnet 的编译率 96%。

13 个关键字意味着整个语言只占上下文的 0.8%。无需微调。

28

双重受众 RIGHT

同时为人类和 LLM 设计。

这是核心论点。声明的注解同时服务两类受众 — 人类可读,机器可解析。

29

编译期求值 RIGHT

用于编译期函数的 z f。

类似 Zig 的 comptime。模板标签验证器、模式检查、正则编译 — 全都在构建时完成。

语法与人体工程学

30

关键字数量 DEBATABLE

13 个单字母关键字:f d r c e a o t z u w x none。

极小的语法 = LLM 瞬间学会。但对新手来说,阅读代码的头一个小时是不透明的。

31

return 关键字 DEBATABLE

用 r => 而不是 return。

避免了 Rust 的“意外的最后一个表达式”问题。但 r => 相比 return 只省了 2 个字符。

32

1 起始索引数组 DEBATABLE

数组从 1 开始,不是 0。

Lua 和 Julia 这么做。消除了人类推理中的差一错误。但 0 起始索引是普遍的肌肉记忆。

33

变量命名 DEBATABLE

最少 2 个字符。单字母保留给关键字。

防止与 f、d、r 等冲突。但禁止 i、x、n 对数学代码来说很烦人。

34

继承 DEBATABLE

单继承,d Child : Parent。

组合优于继承是现代共识。U 支持它但不强推。仅 trait(Rust)可能更大胆。

35

基于缩进的块 RIGHT

是的,像 Python。没有大括号。

强制一致的格式。没有大括号之争。Python 证明了它在规模上可行。

36

分号 RIGHT

没有。

Go、Python、Kotlin、Swift 都去掉了它们。

37

字符串模型 RIGHT

"..." 字面量,`...` 模板,'A' 字节。

清晰分离。没有“这是插值吗?”的歧义。模板标签自然扩展。

38

插值 RIGHT

模板中的 {{expr}}。

双大括号避免与 JS 模板字面量冲突。\{{ 转义干净。

39

字符串类型 RIGHT

S 是不可变 UTF-8。

不可变字符串消除别名 bug。UTF-8 是赢家,不是 UTF-16(Java、JS、C#)。

40

模式匹配 RIGHT

.on() 统一了迭代、匹配和分派。

一种机制而不是三种。穷尽性检查。没有遗漏的情况。

41

迭代 RIGHT

.on()、.map()、.filter()、.reduce()。没有 for i 循环。

没有会弄错的索引变量。差一错误在结构上不可能发生。

42

运算符重载 RIGHT

无(MVCC 除外,见 <<)。

C++ 证明了运算符重载是易读性陷阱。a + b 应始终表示加法。

43

作用域规则 RIGHT

词法作用域,块级作用域。

没有提升(JS),没有意外的作用域泄漏(Python 的 for 循环变量)。

工具与生态

44

编译目标:C RIGHT

编译为可移植的 C。GCC/Clang 生成二进制文件。

C 到处都能运行。没有运行时依赖。生成的二进制文件是自包含的。

45

WASM 目标 RIGHT

为 Web、边缘计算和插件沙箱生成 WAT。

对于 Safebox 中 JIT 加载的插件至关重要。

46

精确有理数 RIGHT

Q 类型。0.1 + 0.2 == 0.3 为真。

金融代码、加密、科学计算。在超越数处的边界在数学上是诚实的。

47

SIMD RIGHT

+V 修饰符,通过 .map() 自动向量化。

安全的代码同时也是快的。无需单独的 SIMD 内建函数。

48

构建系统 RIGHT

内置 u build / u run / u test。

Go 证明了内置构建系统是可行的。没有 Makefile,没有 CMake,没有 webpack。

49

转译器支持 RIGHT

PHP、JS、Python → U,带 V3 source map。

现有代码库的采用路径。无需重写即可分析 389K 行代码。

50

隐私/可见性 RIGHT

模块边界就是可见性边界。没有 public/private 关键字。

更简单。Go 做出了同样的选择。大型代码库最终可能想要字段级可见性。

模式

每个“正确”的调用都遵循同一原则:安全的是默认,危险的需要显式注解才能启用。-N 是默认;+N 需显式启用。-R 是默认;+R 需显式启用。-M 是默认;+M 需显式启用。-E 是默认;+E 需显式启用。

这五个“有争议”的调用都是内部一致性(单字母关键字匹配单字母修饰符;1 索引匹配数学惯例)与外部熟悉度(开发者期望 0 索引数组和多字符关键字)之间的权衡。没有一个是设计错误——它们都是有取舍的连贯选择。

零个“错误”调用才是有趣的部分。U 的默认值与所有现代语言趋同的方向一致,而新颖特性——能力追踪、u 关键字、MVCC、模板标签、M-of-N 签名——解决了主流中其他任何东西都未涉及的真实问题。

来源:Hacker News · ulanguage.org