波 C 测量
“这套工具能把现有代码转成形式对象”——这句话如果不带数字,等于没说;如果带了数字但没说口径,比没说更糟。这一页记录的是口径。
语料
12 个仓库真实文件(每种语言 4 个)。每个文件的 sha256 前 16 位记入结果文件——测量与内容绑定,语料一变数字就作废。两臂是工具链的严格与宽松档,都确定性、可复现,不使用随机数。
两个比率,必须一起读
| 指标 | 定义 |
|---|---|
| 识别率 | 识别器看见的实体 ÷ 独立估计的实体数(宽松模式另算,用来暴露识别器自己的盲区) |
| 转换率 | 已转写实体 ÷ 识别到的实体 —— 注意分母,它是条件于识别的比率 |
这就是为什么必须一起读:
只看转换率会得到“C 语言 100%”这种读起来很漂亮的结论,但那个 100% 的分母只包含识别器看得见的签名。真正限制 C 的是 89.2% 的识别率。两个数字分开报,任何一个都会误导。
主表
| 语言 | 臂 | 实体 | 识别率 | 转换率 | 95% CI |
|---|---|---|---|---|---|
| Python | 严格 | 48 | 100.0% | 27.1% | [16.6, 41.0] |
| 宽松 | 48 | 100.0% | 93.8% | [83.2, 97.9] | |
| C | 严格 | 37 | 89.2% | 100.0% | [89.6, 100.0] |
| 宽松 | 37 | 89.2% | 100.0% | [89.6, 100.0] | |
| Rust | 严格 | 116 | 98.3% | 91.2% | [84.6, 95.2] |
| 宽松 | 116 | 98.3% | 98.2% | [93.8, 99.5] |
怎么读这张表
- Python 的瓶颈是注解质量 —— 严格臂 27.1%,主因是 list[str] / dict 这类没有 Potato 对应物的容器类型被跳过。这不算“缺注解”,而是“注解表达不了”。
- C 的瓶颈是识别器 —— 4 个多行 / 宏签名对正则不可见。这是工具的局限,不是语言的问题。
- Rust 最好转 —— 静态类型加显式切片;剩余跳过是常量长度数组、never 类型与元组返回。
- 对象合法率 100% —— 工具链宁可少转,也不乱转。
一处必须标注的边界
LLM 臂跑过了,但跑的是本地小模型。
2026-09-11 用本机 Ollama 上的 qwen3:4b 与 llama3.2:3b 跑了一轮:12 个文件 × 2 模型 = 24 行,工件 loment/build/wave-c-llm.json。所以「工具链 vs 宿主 LLM」这组对照有数据了——但它是 1.5–4B 的本地小模型,不是前沿 LLM 对照;要拿它当 A/B,得换前沿模型按同一协议重跑。另外,当前主表的“两臂”是工具链的严格 / 宽松两档,不得在论文中当作 LLM 对照。
另有一条样本量提醒:当前 n = 48 / 37 / 116,Wilson 区间在 n < 30 时明显偏宽。要把半宽压到 ±5% 以内,主表语料需要扩到每语言 ≥200 实体(约 15–20 个文件)。