跳到主要内容

Agili 的 Hacker Podcast 2026-08-15

今天的 Hacker Podcast 涵盖一个不存在的人如何让现实中的开发者被苹果封号、AI 在 14 天内把 GPU 内核提速 232 倍、浏览器里的鼓面模拟器、印尼 7.7 级地震、1962 年埃及导弹计划的悬案,以及新的曲线数学、微积分教学和 GCC 嵌套函数进展。

一个不存在的 Sean Byrne,让真实的 Sean Byrne 被封锁十六年

苹果冻结账号:与政府名单完全匹配

今年早些时候,苹果拒绝 Sean Joseph Byrne 访问 App Store Connect。苹果给出的理由是“你提供的信息与美国政府合并筛查名单(Consolidated Screening List)中的一个或多个受限制方完全匹配”。Byrne 提供了全名、驾驶证,并指出政府记录中的地址与他无关,他从未在那个地址住过。苹果没有回复。

合并筛查名单是商务部、国务院和财政部多个出口管制与制裁名单的汇总,本身不是制裁名单。Byrne 的名字出现在商务部工业与安全局(BIS)的实体名单上,条目信息只有一项:爱尔兰斯莱戈郡的一项地址。

名单上的人从未存在

这个条目来自 2009 年对爱尔兰飞机零件公司 Mac Aviation 的起诉。美国司法部当时把 Sean Byrne 描述为 Mac Aviation 的商业经理,指控他和 Thomas 与 Sean McGuinn 父子向伊朗非法出口美国飞机设备。实际上,Mac Aviation 是两个男人在农舍里经营的作坊。为了让公司看起来规模更大,他们用假名签署文件,Sean Byrne 是其中一个化名。据《星期日泰晤士报》报道,这个名字出现在太多公司文件上,美国当局“开始确信 Byrne 是真实存在的人,并试图起诉他”。

2010 年,司法部提交替代起诉书,Sean Byrne 不再是被告。替代起诉书超过十五次把 Sean Byrne 描述为一个或多个同谋使用的化名。美国政府后来已经弄清楚这个人不存在,但实体名单上的条目保留了下来。十六年后,条目里仍只有名字和地址,没有出生日期、护照号码或中间名。

误报的成本由被误报的人承担

这不是 Byrne 第一次被拦下。几年前他卖股票时,纳斯达克因背景调查阻止交易,他提交额外材料后通过。后来他从加州订购 Starlink 支架,DHL 因制裁名单匹配要求他提供护照。DHL 甚至拒绝把一顶帽子从美国转寄到爱尔兰,除非他提供护照复印件。

纳斯达克和货运商产生的误报都能解决,苹果是异类。苹果持有他的护照,收到驾驶证和详细解释,仍坚持“完全”匹配。HN 评论区有人提到类似的经历:认识的爱尔兰人在贝鲁特机场被拘留后消失在黎巴嫩监狱系统,因为名字与 Interpol 名单上的人匹配。

法律上有过先例。2005 年 Sandra Cortez 买车时被拒,因为信用机构 TransUnion 只比较名和姓,不比较出生日期,把她和一个晚出生 27 年的制裁名单人士匹配上了。陪审团判给她赔偿,第三巡回上诉法院维持原判。2011 年 Sergio Ramirez 遇到类似问题,案子 2021 年打到最高法院。但 Byrne 面对的情况不同:名单上没有出生日期和中间名可以比较,因为那个人不存在。评论中有人提出国家身份号码能解决这类问题,但其他人反驳说,名单上是虚假人物,没有号码可比较;护照号码也解决不了,因为护照换发时序列号会变。

自动筛查正在扩大应用范围

远程招聘领域正在建立新的身份欺诈防范系统,针对朝鲜 IT 员工用偷来的身份远程受雇美国公司的问题,FBI 已发出警告,司法部起诉过的计划把工人安置进了 100 多家美国公司。招聘产品 Tofu 在简历被查看前筛查所有申请人,明确说“如果被筛查的申请人触发制裁匹配,信号直接进入合规审查”,一个客户标记的候选人会在整个客户网络中被标记。Brainner 也有类似做法。

这些系统在人工介入前运行,结果在雇主之间传播,被误报的人甚至不知道发生了什么。Byrne 联系了 BIS 的最终用户审查委员会,请求审查原始条目。标准程序是为被列入名单的人申请移除而设计的,但他不是被列入名单的那个 Sean Byrne,现有证据显示那个人可能从未存在过。

用 Codex 自动优化 GPU 内核:14 天提交 1500 次,提速 232 倍

比赛与结果

GPU Mode 与 Core Automation 联合举办了自动研究主题比赛,题目是批量实现方形矩阵的 compact-Householder QR 分解(把矩阵分解为正交矩阵与上三角矩阵乘积的算法)。输入是一批 FP32 CUDA 矩阵,输出与 torch.geqrf(A) 相同的紧凑表示,检查器重建 Q 并验证 A≈QR、QᵀQ≈I、QᵀA≈R。

作者 Sankalp 有约一年 GPU 内核优化经验,主要是 Triton 开发。他在 14 天里用 Codex(GPT-5.5)提交了 1500 多次,最终成绩 1,805 微秒,比 419,000 微秒的基准快 232 倍,排在第 12 名(共 183 人)。他上一位是 NVIDIA 的 principal engineer。

从串行反射器到批量矩阵乘

Householder QR 的核心是反射器,像镜子一样把某一列的下半部分一次性清零。但逐列处理时,后一个反射器依赖前一个更新后的矩阵,属于串行计算,张量核心(tensor cores)会闲置。blocked Householder 算法把串行工作限制在一个窄面板内,再用 WY 表示把面板内的反射器压缩成一次 rank-b 更新,对剩余矩阵做三次矩阵乘。串行工作只剩面板内的一小块,其余全变成 GEMM(通用矩阵乘)。

作者先通过与 Claude 对话、看 YouTube 视频把数学弄懂,因为他认为越懂越能提示 AI,能把未知的未知变成已知的未知。

人与 AI 的协作方式

作者选 Codex 的理由是:ChatGPT Pro 订阅额度更大、OpenAI 模型更擅长 Triton、compaction 功能好用。工作区里维护 problem_statement.md、AGENTS.md 和 log.md 做账本,每次提交的状态和耗时都留档。用 /goal 下达可量化目标后,Codex 能连续循环一天多,作者每 2-3 小时输入方向,偶尔整夜无人监督。他还给了 Codex Modal 的 profiling 权限,用 torch profiling、nsys、NCU 分析瓶颈。

内核结构经历了多次演变:全形状用 torch.geqrf → n=512 上做 blocked WY → 所有形状统一 blocked 路线 → Triton 面板加分组 WY 更新 → n=4096 走 Cholesky-ORHR → CUDA graph replay 消掉启动开销 → 融合 V/T 布局组装 → 固定形状内核特化 → 组合超面板加自定义 Cholesky。

3000 微秒到 1800 微秒区间,模型陷入局部最优,表现为无休止调参数和重复同一想法的微小变体。作者的应对:维护 3-5 个候选的束,因为结构性新想法一开始通常比当前最优慢,单一最优的爬山法会过早杀掉它们;让模型 headless 调用更强的顾问模型获取多样化想法;用子 agent 并行尝试不同候选;定期清上下文、归档旧文件。

通用性之争

复盘时作者承认与前 10 名有差距:更快的内核写了数据检测器,利用稠密、聚类、低秩、混合等输入分布特性;第 2 名和第 5 名用自定义三角求逆替代 PyTorch 的 triangular solve,更激进地移除库函数;他没把 trailing matrix 常驻 FP16,也用不上 Blackwell 的 tcgen05 指令。

HN 上一位参与者指出,前十名里有 8 个自动优化方案换到比赛之外的输入就完全跑不动,没跑坏的只有懂 GPU 编程、没有写出 25,000 行 CUDA 的专家方案。这类方法本质是求解特定性,对固定模型形状的推理服务商是好事,对开源库维护者没什么用。作者承认这个说法,补充说后续 Cholesky 分解比赛中,多数顶尖方案 8 题只对 4 题。

其他同类实践包括:用 DeepSeek 新模型在 benchmark → profile → verify → research → improve 循环里几小时写出 SSE 和 AVX 实现,单核性能几乎翻倍;用 Opus 在树莓派 4 上实现 4K 10-bit HEVC 实时转码;让 Claude 对比 C# 与 C++ 的 protobuf 实现,发现 C# 版本缺了已有优化;用数千个测试用例当护栏,把 JSONLogic 引擎从 1.6 秒优化到 200 毫秒。

也有人提醒,每个步骤都要有明确的验证者,否则 agent 会把没做完的事报成完成。作者回应说,在 3000 微秒之后他必须更频繁地介入。被问到 AI 实验室是否因此没那么强时,作者说实验室有更多推理容量和领域专家,会形成自我递归的改进循环。还有人泼冷水:硬件有 roofline 上限(理论性能天花板),递归自我改进不可能带来指数增长。作者回复:说得对。

Eigendrum:在浏览器里画出任意形状,听它作为鼓的声音

画一个形状,敲响它

Eigendrum 是完全运行在浏览器里的鼓面模拟器,开发者是 Basel Ashraf。这个项目有两个 HN 提交,第一篇用一句话介绍了玩法,第二篇详细说明了背后的物理。手绘任意闭合轮廓,按空格键或点击屏幕,就能听到这个形状作为一面鼓的声音。方向键可以移动敲击点,测试同一面鼓不同位置的声音差异。

边缘固定的鼓面只允许某些驻波模式存在,对应频率来自特征值问题 −∇²u = λu(边缘处 u = 0)的解。求解器把形状划分成三角形网格,构造有限元法的刚度矩阵和质量矩阵,再算出最小的几个特征值。

极少有形状能写出解析解,但求解器用圆和矩形做校验:圆的频率对应贝塞尔函数零点,矩形对应 π²(m²/a² + n²/b²),误差都低于 0.1%。由于采用协调有限元法,结果保证只会轻微高估、不会低估。Rayleigh 阻尼让损失随频率平方上升,高频泛音先消失,鼓声随余音变暗。

影响声音的物理

默认的圆最低模式是 130 Hz(C3 偏低 10 音分),第二个模式是它的 1.594 倍,不构成和谐音程,所以听起来是“咚”的一声而不是有音高的音符。金属棒和锣类乐器的泛音结构不和谐,因此有自己的音阶体系。

击打位置会影响声音。每个模式都是驻波,如果敲在某个模式的节线上,那个模式就不会被激发。所以同一面鼓在不同位置敲击声音不同。模式列表里单独播放某个模式,是任何鼓槌都做不到的。

改变材料不会改变泛音之间的比例 λ₂/λ₁、λ₃/λ₁,只会整体拉伸或压缩频谱。Eigendrum 提供 ring-out 和 mallet 两个滑块,它们决定一次敲击能激发多少模式,但不会改变任何模式的频率。

形状的数学与同谱鼓

形状可以手绘,也可以用方程描述。极坐标方程 r(t) = 1 + 0.3cos(5t) 生成五瓣花;参数方程能画出极坐标画不出的曲线,比如肾形线或蛋形。所有形状缩放到相同面积,只有形状本身影响基频偏移。方程直接存在 URL 里,可以在地址栏编辑。

1966 年 Mark Kac 问过:“能听出鼓的形状吗?”1992 年,Carolyn Gordon、David Webb 和 Scott Wolpert 的答案是“不能”:他们用同样的 7 个三角形拼出两个不同形状,面积、周长完全相同,每个频率也相同。Eigendrum 把这对“同谱鼓”放在表单里,切换时能看到轮廓明显不同,声音却完全一样。

社区试玩与隐私风波

有用户画了一个四个相连区域、各自音高不同的鼓,发现换位置敲声音还会变,意识到自己造了个手碟。有人提出把它做成 VST/CLAP 插件用于音乐制作。

隐私方面的批评最集中:不少用户看到同意弹窗列出了数千个数据合作伙伴,默认勾选“合法利益”,没有一键全部拒绝,于是直接关掉页面。开发者随后道歉,解释当天早上已移除广告,但 Google AdSense 的同意横幅残留,现已删除。项目没有后端,形状数据存在 URL 的 # 后面,浏览器不会发给服务器;源代码在 GitHub 上。移动端 Safari 需要手动关闭静音模式才有声音。也有评论质疑项目文案和代码由 AI 生成,另一些用户反驳说这无关紧要,工具本身足够出色。

印度尼西亚弗洛勒斯海发生 7.7 级地震

地震信息与风险评估

8月14日21:58:21 UTC,印度尼西亚弗洛勒斯海发生 7.7 级地震,震中位于 Ende 西北 68 公里,震源深度 10 公里。美国地质调查局(USGS)评估认为,此次地震可能造成重大人员伤亡,约 200 万人暴露于强烈至剧烈摇晃(修订麦加利烈度 VI 至 IX)。USGS 预测未来一周内发生 6 级以上余震的概率为 55%,5 级以上概率超过 99%。

地震发生在澳大利亚板块与巽他板块汇聚的活跃地带,属于浅源逆冲型破裂。两个板块以每年约 69 毫米的速度相对运动,巽他海沟位于震中以南约 350 公里。这类规模的逆冲地震,破裂面通常约 90 公里长、45 公里宽。

区域历史与社区反应

这一区域地震频发。自 1950 年以来,震中 250 公里范围内发生过 37 次 6 级以上地震,其中 5 次 7 级以上。1992 年,同一区域东南 63 公里处发生 7.8 级地震,引发的海啸摧毁数万栋房屋,至少 2500 人遇难。

印尼气象、气候和地球物理局(BMKG)的公报显示,此次地震引发了一些波浪,最大观测波高 94 厘米,多数低于 50 厘米,已宣布事件结束。HN 上的讨论集中在海啸风险和渡轮安全。有网友当时正打算从龙目岛乘渡轮去巴厘岛。其他网友解释,开阔海域的渡轮在海啸期间相对安全,海啸不是冲浪式的巨浪,而是水位逐渐上升。

有网友觉得今年大地震很多。USGS 的常见问题页面指出,长期记录每年平均约 16 次大地震,包括 15 次 7 级和 1 次 8 级及以上;过去 40 至 50 年间约 12 年超过长期平均值。2020 年以来地震总数看似增多,是因为新增了大量地震台站,能探测到更小的地震。一位住在巴厘岛 Bukit 的网友说,他从 LastQuake 应用看到警报,但当地没有震感。

1962 年埃及导弹计划:关键科学家人间蒸发

纳赛尔的导弹梦想

1962 年 7 月 21 日,埃及总统纳赛尔在沙漠中向记者展示四枚地对地火箭,火箭相继升空落入地中海。埃及官方电台宣布国家进入“导弹时代”,开罗上空有飞机撒糖果庆祝。这场表演让中东力量对比一夜改变,也暴露出一张由前纳粹情报官和火箭技术专家组成的暗网。

纳赛尔想要导弹,但美国、苏联都不愿帮他。根据欧文·西尔斯在《纳赛尔与中东导弹时代》中的记述,纳赛尔通过西德冷战时期间谍头子赖因哈德·盖伦找到奥托·斯科尔兹内,即二战时救出墨索里尼的奥地利突击队员。之后,一群不愿为同盟国或苏联工作的前纳粹火箭科学家在 1960 年代初抵达埃及,其中包括参与设计 V-1 飞弹的沃尔夫冈·皮尔茨、火箭推进工程师欧根·桑格尔,以及汉斯·克莱因瓦赫特等人。

关键人物是海因茨·克鲁格,桑格尔的同事。1958 年起他在斯图加特喷气推进物理研究所当经理,1960 年成了与埃及战争部有联系的壳公司 INTRA 商业公司的前台人物,在慕尼黑办公室为埃及采购、运输导弹零部件。到 1961 年,这些科学家已在开罗附近的工厂 333 测试原型。1962 年纳赛尔在开罗游行展示 20 枚导弹,以色列感到威胁,让纳赛尔更加多疑。

摩萨德的“达摩克利斯行动”

以色列施压西德,要求制止这些德国科学家。情报历史学者认为,西德情报机构可能直接协助了摩萨德。1962 年摩萨德发起“达摩克利斯行动”,第一个目标是克鲁格,导弹生产协调的关键人物。那年 9 月 11 日,一个自称“萨利赫先生”的年轻人到克鲁格办公室聊了半小时,随后两人开克鲁格的车一起离开。克鲁格再也没回来。警方在慕尼黑南郊索尔恩找到他的车,车上满是泥。之后有一条匿名电话说克鲁格已死。他妻子对警方说:“我丈夫被人带走了,他没有理由自愿消失。”

接下来,更多科学家遭殃。皮尔茨的秘书被信件炸弹炸瞎双眼,次日另一枚炸弹炸死五名埃及人。克莱因瓦赫特 1963 年在巴伐利亚躲过三名摩萨德特工的枪击,子弹穿透了他脖子上的围巾。到 1964 年,大多数科学家要么离开,要么带着枪生活、逐一检查邮件。有评论者指出,一个依赖关键科学家的项目本身就不健康,克鲁格的消失确实让埃及导弹计划元气大伤。

下落成谜

克鲁格的下落至今没有答案。有人说他被带往奥地利改名换姓度过余生;也有说法称摩萨德杀手将他射杀后埋在森林里;甚至有人指控斯科尔兹内被摩萨德要挟,亲手处决了克鲁格。作者西尔斯认为斯科尔兹内不太可能是凶手。

评论区指出索尔恩这个地点的讽刺意义:它离盖伦组织总部所在地普拉赫很近。读者还补充了类似的冷战交易案例:以色列与伊朗国王的合作,据称以色列计划只向伊朗提供导弹的过时版本,用伊朗的钱给自己造新一代武器;德国公司 OTRAG 在扎伊尔和利比亚的活动,比 SpaceX 早约三十年;加拿大工程师杰拉尔德·布尔因帮萨达姆·侯赛因建造“巴比伦大炮”而于 1990 年被暗杀,评论者强调那是谋杀,不是“干预”。

Hyperbezier 曲线:挑战三次 Bézier 的新曲线族

从三次 Bézier 的痛点出发

Raph Levien 在博客中提出了一族新曲线,称作 hyperbezier 曲线,用来替代 2D 矢量图形设计中的三次 Bézier 曲线。他研究这个问题数十年,最终承认三次 Bézier 的强项是通用性:既能表达曲率平滑变化的形状,也能表达曲率集中、张力较高的区域。他博士论文研究的 Spiro 曲线无法覆盖大曲率变化。

这条曲线用 Cesàro 方程定义,即曲率是弧长的函数:κ(s)=as+b(cs²+ds+1)^1.5。在端点的小角度偏转下,它和三次 Bézier 的行为非常接近,但角度变大时差别变明显:它的曲率变化更平滑,也更可能保持单调。作者提供了交互式工具,把三次 Bézier 的控制点映射到 hyperbezier 参数。

精确的解析曲线

曲线族包含一些精确的解析曲线。令 c=d=0 得到 Euler 螺旋,它是 Minimum Variation Curve 问题的解。令 a=0 得到精确圆弧,而三次 Bézier 只能近似圆弧。参数空间里还藏着几种 log-aesthetic 曲线,曲率是弧长的幂,可达指数包括 -3、-2、-1.5 和 -0.5。

双曲线是另一类基本曲线,转弯处圆滑,曲率逐渐衰减,两侧趋于线性渐近线。三次 Bézier 拟合不好,也无法表现渐近行为。Hyperbezier 则天然贴合双曲线,精度很高。名字来源于 hyperbola 和 Bézier 的融合。

弹性的 elastica 曲线也有上百年的数学史。它是 Minimal Energy Curve 问题的精确解,既能平滑也能在张力下产生大的曲率变化。Spiro 无法近似它,hyperbezier 的近似效果合理,视觉上相当接近,但不是精确拟合。

数学性质与限制

Cesàro 方程容易积分成 Whewell 方程,分母的二次多项式保持不变。曲率极值点只需解二次方程。因为分母为正,曲线在至多一个点有拐点,所以无法精确逼近所有三次 Bézier,后者可以有两个拐点。作者说实际设计中带两个拐点的三次 Bézier 很少见。

作者也试过其他指数。指数 1 更简单,但无法数值稳定地表达高张力曲线。指数 2 积分不干净。指数 1.5 刚好与参数曲线曲率公式 κ=x′×x″/(x′·x′)^1.5 相似。未来工作包括把曲线接入样条系统,让样条通过构造实现 G2 连续,以及曲线拟合,尤其是手写笔和触摸数据。

有读者在交互演示中发现,hyperbezier 的控制手柄行为有些反直觉:有些区域曲线会很快“跳变”到另一种形态,另一些区域则对控制柄的变化饱和、不再移动,而标准 Bézier 没有这两种现象。

与 AI 协作更像领导而不是编程

从确定性到协作

作者在文中回忆,编程生涯里代码曾给他确定性:程序按指令运行,同样的输入得到同样结果。但与人协作时,他常常发现,解释了任务后得到的不是自己预期的结果,有时更好,有时暴露出自己本来就没说清楚。他现在觉得,用 AI 工作更接近第二种体验:同一个请求可能给出不同答案,既能做出有用联想,也会漏掉明显错误,偶尔拿出他没想过的方案。

把 AI 当编译器时,这个过程让人沮丧;把互动看作协作时,就变得更有用。他并不打算把 AI 当人,关键是练习表达意图:给出背景、说明期望结果、设定边界,用例子和纠错不断对齐。

“领导力”还是“管理”

HN 上有不少评论者反对“领导力”这个词,认为更准确的说法是“管理”。有用户批评这篇文章像 LinkedIn 上的空话,结论自相矛盾:既然作者承认 AI 没有生活经验、没有人的判断力,那管理 AI 的技能应该是一套新技能,而不是把旧的领导经验套上去。也有人指出,AI 管理是最低成本的版本,不需要关心动机和士气,做错了就清空重来。一位用户总结道:“你可以管理东西,但只能领导人。”

但也有大量评论印证了作者的观察。一位有过六年管理经验的工程师说,他回到个人贡献者岗位后,发现用 AI 的方式和过去带团队很像:把任务交给对方,接受结果可能和自己想象的不同,然后评估。他不需要等几天才看到产出,AI 的理解能力通常比普通工程师更好。另一条评论提到,Anthropic 等公司雇了不少前 CTO、CEO 来做普通工程师岗位,正因为这些人的领导经验能迁移到和 AI 代理协作上。还有人把 AI 比作水,会按容器的形状流动,但容器得自己造。

失败案例与边界

讨论中也有失败案例。有人分享,一位没有编码经验的技术主管在 3 周内用 AI 写出 6 万行代码,却无法让系统正常工作,项目拖延了 3 个月,面对愤怒的利益相关者时,他让初级工程师去顶罪。另一个案例里,设计师出身的老板在成熟产品的代码库里用 AI 连续上线功能,半年后系统开始崩溃。评论者提醒,AI 能快速生成代码,但如果使用者不理解架构、不建立验证机制,产出的只是技术债。有人因此坚持把 AI 控制在单个函数或单个类,自己写核心部分,只让 AI 做 scaffolding,严格审查,小步提交。

一位评论者引用 Venkat Rao 的观点:那些在 ChatGPT 帮助下表现糟糕的研究对象,不是被 AI 变笨了,而是他们根本没有管理能力,却被要求完成需要委派、质量把关和异常处理的任务。无论把这种能力叫作管理、领导还是表达意图,它都在变得越来越重要。作者说,技术是新的,领导技能不是。

简化初级微积分:用微分代替导数,把极限留到最后

论文主张

2018 年 11 月,Jonathan Bartlett 把论文《简化与重构初级微积分》提交到 arXiv,2019 年发表在 Communications of the Blyth Institute。Bartlett 常年在家教育合作社教高中生微积分,自己写了《Calculus from the Ground Up》,论文是写书时遵循的原则说明。

论文的批评对象是标准微积分入门课:学生要记住一堆本质上处理同一件事的不同流程。Bartlett 主张用微分(differential)而不是导数来组织课程,把求导的各种规则统一成少数几个可以按代数操作的步骤,让学生已有的代数能力直接迁移过来。极限的严格定义(epsilon-delta,用任意小误差刻画极限的语言)挪到课程末尾,先让直觉建立起来再补形式证明。

微分能不能当作数除

HN 上争论最激烈的问题是“微分能不能当数除”。有评论者追溯莱布尼茨的原意:dy/dx 确实是两个非零无穷小量的商。以 y = x² 为例,y + dy = (x + dx)² = x² + 2x·dx + (dx)²,减去原式得 dy = 2x·dx + (dx)²,除以 dx 得 dy/dx = 2x + dx,再把 dx 扔掉。这种“需要时非零、不要时归零”的做法当时就招来批评,Berkeley 主教 1734 年嘲讽无穷小是“已消失量的幽灵”。此后一个多世纪,Riemann、Cauchy、Weierstrass 用极限为微积分重新奠基。

另一派主张回到莱布尼茨:Robinson 在 1960 年代用超实数(hyperreal numbers,在实数之外加入大于零但小于一切正实数的无穷小)给无穷小建立了严格基础,极限只是历史上第一个严格化方案。反对者说超实数丢掉了阿基米德性质(任意实数都能被某个有限自然数超过),直觉成本太高。还有评论提到光滑无穷小分析和二元数等替代路径,以及 Knuth 用大 O 记号(描述函数增长上界的记号)教微积分的建议。

先直觉还是先严格

教学顺序的争论同样分散。有人反对“先直觉后证明”,认为把严格证明推迟一年是毁掉数学。另一派反驳说“数学不应该容易”的说法多半是 gatekeeping,工具好用是优点,微积分本身在历史上长期缺乏坚实基础。一位自称当过物理助教的评论者提出更具体的批评:极限比导数难,导数 1600 年代就出现,严格的极限定义 1800 年代才成形。他建议高中课程改成两年代数与几何、一年微积分、一年统计,把统计作为导数理论的应用场景。

怎么教也有分歧。有人主张视觉化、可测量的体验式教学,推荐 3Blue1Brown、Khan Academy 等资源。反对者说视觉只是分散注意力的消遣,理解之后还是需要参考材料、例题和反复练习。还有评论者提到语言门槛:这类资源基本只有英语,德语环境很难找到同等水平的内容。也有人质疑论文的前提:求导并不需要背很多东西,真正难的是符号积分,而论文没碰。

实践反馈

论文发表近八年后,有用户问这套方法实践得怎么样。Bartlett 回答:他每年只教 2 到 10 个学生,没有学校采用他的书。面对“学生也不喜欢代数,把微积分变成代数能解决什么”的质疑,他回应说,真正的问题是很多成年人上了四学期微积分仍不知道它在讲什么,而工程师对代数极为熟练,把两者连接起来是可行的路。他以《绿野仙踪》作比:前期适当含糊其辞,等学生意识到概念的力量,再告诉他们红宝石鞋一直在脚上。另有评论者提到,Bartlett 的出版经历还包括编程书和创造论视角的演化生物学文章。也有评论为现行教材辩护,说 Stewart 的《Calculus》已经很好。

GCC 嵌套函数的新进展:告别可执行栈

trampoline 的安全与性能代价

当 GCC 的嵌套函数地址被取时,程序会在运行时创建一个 trampoline,也就是一段临时生成的机器码,先调整寄存器,再跳转到嵌套函数的实际代码。这段代码通常被放在栈上,导致栈必须可执行,削弱了栈不可执行的安全防护。GCC 后来支持把 trampoline 放到堆上,但堆分配成本更高,使用 longjmp 时还可能泄漏。

GCC 16:无捕获嵌套函数不再需要 trampoline

作者马丁·于克(Martin Uecker)之前提出用宽指针类型避免这个问题,最近给出两个进展。第一个来自 GCC 16:从这一版本开始,GCC 保证不访问父函数局部变量的嵌套函数不需要 trampoline。即使关闭优化,这个保证也成立,且已写入文档。这类“无捕获”的嵌套函数仍可访问静态变量、命名常量和类型,适合写回调函数,也可以安全地返回这类函数指针。

GCC 17:宽指针与静态链

第二个进展针对真正捕获了父函数上下文的嵌套函数。GCC 17 开发分支合并了作者提交的补丁,新增两个内置函数,与已有的 __builtin_call_with_static_chain 配合使用,可以彻底摆脱 trampoline。通过 __builtin_call_code_address(worker) 获得函数代码地址,用 __builtin_call_static_chain(worker) 获得父函数上下文指针。编译器会把代码自动转换成一个显式传递数据指针的版本,数据指针通过一个专用寄存器传递。这个寄存器在 ABI 中本来就为 Pascal 风格的静态链保留,不额外占用调用约定。

作者还给出了用宏封装的泛型宽指针类型,写起来更简洁。处理一个捕获了 k 的嵌套函数时,GCC 能把它优化成一条 lea eax, [rdi+rdi*2] 指令,也就是乘 3 的汇编实现。

有 HN 读者问嵌套函数到底有什么用。有人回答说,它能给一段代码命名,同时不污染外层命名空间。关于旧方案,作者 2018 年的补丁曾被拒绝,原因是它依赖函数指针对齐,评审者担心对齐假设。作者说他更喜欢新方法,因为不对指针做标记,就没有检查 tag 的运行时开销。未来他打算讨论如何在 clang 和 GCC 之间移植嵌套函数用法,以及如何通过一个小技巧在更老的 GCC 版本上避免 trampoline。

播客全文

男:嗯,这个事我从头到尾看了。 Sean Byrne 是个爱尔兰人,不算什么名人。今年早些时候他想登 App Store Connect,苹果直接告诉他不行,理由是他提供的信息和美国政府的合并筛查名单“完全匹配”。合并筛查名单不是制裁名单,是商务部、国务院和财政部的出口管制和制裁名单揉在一起的一个筛查工具。苹果说他的信息和一个受限制方完全匹配,他就去查,结果还真有一条,在商务部的实体名单上,名字就是 Sean Byrne,地址在爱尔兰斯莱戈郡。他看着就很困惑,因为他从来没在那条地址住过。

女:所以是搞错了?这种错也太离谱了吧。苹果这么大公司,怎么会拿一个假信息去冻结一个真实用户的账号。

男:关键点在于,这个 Sean Byrne 很可能本来就是一个不存在的人。那份名单上的条目来自 2009 年美国司法部对一个爱尔兰飞机零件公司 Mac Aviation 的起诉。那家公司实际上是两个男人在农舍里经营的作坊,为了让公司看起来规模大,他们用假名签文件,Sean Byrne 就是其中一个假名。据《星期日泰晤士报》报道,这个名字出现在太多公司文件上,美国当局都开始确信他是真实存在的人,还试图起诉他。后来司法部提交了替代起诉书,Sean Byrne 不再是被告,替代起诉书里明确说这是化名。但实体名单上的条目一直留着,十六年了,没有出生日期,没有护照号,只有一个常见的爱尔兰名字和地址。

女:也就是说,美国政府自己都知道这个人是假的,但名单上还留着一条幽灵条目。

男:对。而且这个条目本身就是误导性的。地址是 Mac Aviation 那个老板 Thomas McGuinn 的家,但苹果不会管这些,你就匹配上了。Sean Byrne 不是第一次遇到这种事。之前他通过要约收购卖股票,纳斯达克背景调查后阻止了交易,人家直接问他 Mac Aviation 的事;后来从加州买 Starlink 支架,DHL 告诉他问题出在限制名单匹配上,要求提供护照;有次 DHL 甚至拒绝把一顶帽子从美国转寄到爱尔兰,除非他出示护照。一个虚构的人和伊朗直升机发动机、战斗机零件的非法出口有关,而真实的 Sean Byrne 得拿护照才能收到一顶帽子。

女:这听起来像荒诞小说。纳斯达克和 DHL 后来都解决了??

男:对。纳斯达克和货运商都产生误报,但拿到他护照照片、额外材料后都放行了。苹果不一样。苹果已经持有他的护照,收到了驾驶证和详细解释,仍然说他“完全”匹配一个受限制方。苹果一直没回复他。

女:所以他就是被卡死了,对不对?一个真实的人被一个不存在的幽灵卡死了。

男:不是个例。有人讲过类似经历,有个爱尔兰人在贝鲁特机场被拘留后消失在黎巴嫩监狱系统,原因只是他的名字和 Interpol 名单上某个人匹配。还一个例子,有个人因为模糊匹配被论坛封禁。这类误报的问题在于,成本全部由被误报的人承担,而修正错误的成本由机构承担,机构没有任何动力去改。

女:那像这种怎么可能不改?它不是还有法律风险吗?

男:有先例。2005 年有个女性在科罗拉多买车受阻,因为信用机构只比较名和姓,不比较出生日期,把她和一个比她晚出生 27 年的制裁名单上的女性匹配上了。陪审团判了赔偿,法院也说这是“应受谴责的”。2011 年又有类似案子上到最高法院。但 Sean Byrne 的情况不同:名单上根本没有出生日期、没有中间名、没有任何个人信息可以比照,因为那个人根本不存在。就算筛查系统执行得完美无缺,还是会永远标记他。

女:所以系统是公正的,系统里的数据是假的,那怎么办?

男:有人提出用国家身份号码来解决,但评论里马上有人反驳说,爱尔兰也有 PPS 号,问题是名单上的人不存在,没有号码可以比。护照号码也解决不了,因为护照序列号换发会变。还有人指出一个更让人担忧的趋势:远程招聘领域正在建立一套新的身份筛查系统,应对朝鲜 IT 员工用偷来的身份远程受雇美国公司的真实问题。新的招聘产品比如 Tofu,在简历被查看之前就筛查所有申请人,还说一个客户标记的候选人会在整个客户网络里被标记。

女:这意味着一个人如果被误标,可能根本不知道自己被标了,就被整个行业排除在外。

男:对,而且是在人工介入之前就发生了。美国人 Byrne 还在申诉,他联系了商务部工业与安全局的最终用户审查委员会,要求审查原始条目。他不知道会不会有结果。标准程序是为被列入名单的人申请移除设计的,但他不是被列入的那个 Sean Byrne——而且那个人可能从来就不存在。

女:你刚才说 AI 工具能自己写代码、自己优化内核,那个人类工程师还在干什么?

男:这就是有趣的地方。比赛是 GPU Mode 和 Core Automation 联合办的自动研究比赛,题目是实现方形矩阵的 compact-Householder QR 分解,输入是一批 batch x n x n 的 FP32 CUDA 矩阵,输出要和 PyTorch 的 torch.geqrf 一致。检查器会用 torch.linalg.householder_product 重建 Q,验证 A 和 QR 的误差。有个参赛者叫 Sankalp,用 Codex 在 14 天里提交了 1500 多次,最终成绩是一个比基准快 232 倍的内核。基准路径要 419,000 微秒,他的最终版本只要 1,805 微秒。排在他上一位的是 NVIDIA 的 principal engineer,而他自己只有一年 GPU 内核优化经验。

女:有点夸张。他是在给 AI 当项目经理吗?

男:他是这么描述的。他先用 ChatGPT Pro,因为额度大,OpenAI 模型更擅长 Triton。他在工作区里维护 problem_statement.md、AGENTS.md 和 log.md,每次提交的状态和分形状耗时都留档,这样后续的 agent 会话能查证某个想法是否试过。用 /goal 下可量化目标后,Codex 能连续循环一天多,他每 2 到 3 小时输入方向,偶尔整夜无人监督。还给模型 Modal 的 profiling 权限,用 torch profiling、nsys、NCU 分析瓶颈。他反复追问模型的问题包括:哪些步骤能融合、哪些运行时信号能变成编译期静态信号、能不能看 Triton 生成的编译产物、有没有数值技巧可以利用精度余量。

女:这听起来像是带了个很聪明的实习生。你说他最终比基准快 232 倍,那他是怎么做到的?

男:核心是 blocked Householder 算法。Householder QR 本身是逐列反射,第 j+1 个反射器依赖第 j 个更新后的矩阵,天然串行。blocked 算法把串行工作限制在一个窄面板内,用 WY 表示把面板内的反射器压缩成一次 rank-b 更新,剩余的大矩阵全变成 GEMM。他的内核结构演变大致是:全形状用 torch.geqrf 起步,然后 n=512 上用 blocked WY,再统一所有形状走 blocked 路线,后来加 Triton 面板和分组 WY 更新,n=4096 走 Cholesky-ORHR 替代路径,再用 CUDA graph replay 消掉启动开销,融合 V/T 布局组装,最后固定形状内核特化加上自定义 Cholesky。整个过程启动开销和面板开销是主要瓶颈,内存或计算带宽很少成为瓶颈。

女:那 AI 有没有遇到怎么都过不去的坎?

男:当然有。3000 微秒到 1800 微秒这个区间,模型陷入局部最优,表现为无休止调参数和重复同一想法的微小变体。作者的应对方法是维护 3 到 5 个候选的束,因为结构性新想法一开始通常比当前最优慢,单一最优的爬山法会过早杀掉它们;人类介入给方向;明确鼓励模型冒险;让模型 headless 调用更强的顾问模型获取多样化想法;还用子 agent 并行尝试不同候选。作者说强的顾问模型策略会成为自动研究流程的标准做法。

女:那这个比赛的后续呢?AI 真的这么强,AI 实验室是不是也没那么强了?

男:作者自己的回应很诚实。他承认跟前十名有差距:更快的内核写了数据检测器,去利用测试里的分布特性,比如低秩输入有大量零;第二名和第五名用自定义三角求逆替代 PyTorch 的 triangular solve,更激进地移除库函数。他自己在 PyTorch 和 Triton 之间反复切换,没把 trailing matrix 常驻 FP16 而是反复转换精度。还在用 Blackwell 的 tcgen05 指令上有差距。他把这些差距归因于领域知识不足,后来比赛里随知识增长,引导质量明显提高了。他还承认和 AI 的不确定性协作更像和人协作,而不是编译。

女:我觉得你说的那个更像人和人协作。你解释一个任务,对方给的结果不是你预期的,有时更好,有时暴露出你自己没说清楚。

男:对,原文里也是这么说的。作者最初的编程生涯里,代码给他确定性,同样的输入必然给出同样结果。但和 AI 一起工作,同一个请求可能给出不同答案,既会做出有用的联想,也会漏掉明显错误,偶尔还能拿出他没想到的方案。当他把它当编译器时很沮丧,当互动看作协作时就有用。他并不打算把 AI 当人,关键是练习表达意图:给出背景、说明期望结果、设定边界,用例子和纠错不断对齐。

女:那这种技能到底叫什么?团队管理?领导力?

男:这个话题在 HN 上吵得厉害。有人反对“领导力”这个词,说更准确的说法是“管理”,因为 AI 不需要关心动机和士气,做错了就清空重来,无需承担解雇的成本。也有人说“你可以管理东西,但只能领导人;AI 是一个自认为自己是人的东西。”还有人把这种体验比喻成带实习生:实习生会飞快写代码,但抓不住微妙之处,指错后会坚持自己没错,或者自信地改错。

女:那有没有人同意原作者的??

男:很多。有位有六年管理经验的工程师回到个人贡献者岗位,发现用 AI 的方式和过去带团队很像:把任务交给对方,接受结果可能和想象不同,然后评估。他不需要等几天才看到产出,AI 的理解能力通常比普通工程师更好,被误解的次数反而更少。还有人提到 Anthropic 等公司雇了不少前 CTO 和 CEO 来做普通工程师岗位,正因为这些人的领导经验能迁移到和 AI 代理的协作上。也有个比喻很形象:AI 像水,按容器形状流动,但容器得自己造;如果本来就不会设计系统,AI 只会放大混乱。

女:那反面案例呢??

男:有。有人说一位没有编码经验的技术主管用 AI 写出 6 万行代码,却无法让系统正常工作,项目拖延了 3 个月,面对愤怒的利益相关者时他让初级工程师顶罪。另一个案例里,设计师出身的老板在成熟产品代码库里连续用 AI 上线功能,半年后系统开始崩溃。最后的结论都一样:AI 能生成代码,但如果你不理解架构、不建立验证机制,产出的只是技术债。有人就坚持把 AI 控制在单个函数或单个类,核心部分自己写,AI 只做周边,还要严格审查小步提交。

女:所以核心是沟通和验证,而不是输出内容。我想到以前你提过那个鼓面模拟器,能把任意形状变成一面鼓,听着特别神奇。你玩过吗?

男:玩过,这种物理模拟玩具很难不沉迷。它叫 Eigendrum,纯浏览器运行,你画一个闭合轮廓,按空格键就能听到这个形状作为鼓面的声音。背后的原理是求解特征值问题 −∇²u = λu,边界 u = 0,也就是鼓面振动的驻波模式,用有限元方法把它离散成三角形网格,构造刚度矩阵和质量矩阵,算最小的几个特征值。极少有形状能写出解析解,但圆的频率对应贝塞尔函数零点,矩形的对应 π²(m²/a² + n²/b²),这两者误差都小于千分之一。它用的协调有限元法保证结果只会轻微高估,不会低估。

女:那鼓声是什么样的?它和真鼓的声音有什么不同?

男:默认的圆最低模式是 130 Hz,约等于 C3 低 10 音分。第二个模式是它的 1.594 倍,不构成和谐音程,所以你听到的是“咚”的一声,不是有音高的“音符”。

女:我的理解是,不同形状的鼓面,低频和高频泛音的比例不一样,所以声音的“色彩”不同。

男:对。Eigendrum 的每个模式都是驻波,有固定的节线。如果你敲在某个模式的节线上,那个模式就不会被激发。所以同一面鼓在不同位置敲击声音不同。模式列表里还可以单独播放某个模式,那是什么鼓槌都做不到的,是唯一能听到单个频率真实声音的方式。

女:这太有意思了。我猜你可以用极坐标方程画一些奇怪的形状?

男:可以。极坐标方程 r(t) = 1 + 0.3cos(5t) 生成一朵五瓣花;参数方程能画出肾形线或蛋形。所有形状都缩放到相同面积,所以只有形状本身影响基频的偏移。方程直接存在 URL 里,你可以在地址栏直接编辑。太薄、无法可靠剖分的形状会被拒绝,而不是返回一个错误答案。

女:那这个工具是不是回答了那个经典问题——能不能听出鼓的形状?我记得有一个著名的定理。

男:你记得很清楚。Mark Kac 在 1966 年提出了这个问题,1992 年 Carolyn Gordon、David Webb 和 Scott Wolpert 给出了否定答案:他们用同样的 7 个三角形拼出两个不同形状,面积、周长完全一样,每个频率也完全相同。Eigendrum 把这一对“同谱鼓”放在表单里,切换时轮廓明显不同,声音却完全一样。Kac 这个名字也特别有意思,卡茨在数学上有个卡茨-穆迪代数。当然这是另一个话题了。

女:诶,你刚才说“鼓的数学”,那我想起一个新鲜话题——有个人写了篇文章,说初级微积分课程的结构有问题,应该重新编排,还发在什么布莱斯研究所的刊物上。这是怎么回事?

男:这是一篇 2019 年的论文,作者 Jonathan Bartlett。他在家教育合作社教高中生微积分,自己写了本教材。论文批评标准微积分入门课让学生背一堆本质上处理同一件事的不同流程。他主张用微分而不是导数来组织课程,把求导的各种规则统一成少数几个可以按代数操作的步骤,让学生已有的代数能力直接迁移过来。他还建议把极限的严格定义“epsilon-delta”挪到课程末尾,等直觉建立起来再补形式证明。

女:这个主张听起来挺合理。那评论区有没有吵起来?

男:吵得很厉害。争议焦点在于“微分能不能当数除”。有评论追溯到莱布尼茨的原意:dy/dx 确实是两个非零无穷小量的商。以 y = x² 为例,y + dy = (x + dx)² = x² + 2x·dx + (dx)²,减去原式得 dy = 2x·dx + (dx)²,除以 dx 得 dy/dx = 2x + dx,再把 dx 扔掉。这种“需要时非零、不要时归零”的做法当时就招来批评,Berkeley 主教在 1734 年嘲讽无穷小是“已消失量的幽灵”。此后一个多世纪,Riemann、Cauchy、Weierstrass 用极限为微积分重新奠基。另一派人主张回到莱布尼茨:Robinson 在 1960 年代用超实数给无穷小建立了严格基础,极限只是历史上第一个严格化方案,不该垄断教学。还有人说用大 O 记号教微积分,可以得到最接近 18 世纪风格且完全严格的推导。

女:那教学顺序上的争论呢?

男:有人反对“先直觉后证明”,认为把严格证明推迟一年是毁掉数学。也有人反驳说“数学不应该容易”的说法多半是 gatekeeping,工具好用是优点,而且微积分在历史上长期缺乏坚实基础。还有一位当过物理助教的说,极限比导数难,导数 1600 年代就出现,严格极限定义到 1800 年代才成形;入门课还塞进多元微积分和繁琐求导技巧,方向不对。他建议高中课程改成两年代数几何、一年微积分、一年统计。

女:那有没有人质疑这个主张的前提?比如“学生也不喜欢代数,把微积分变成代数能解决什么”?

男:作者回应了。他说真正的问题是很多成年人上了四学期微积分仍不知道它在讲什么,而工程师对代数极为熟练,把两者连接起来是可行的路。他用《绿野仙踪》作比:前期适当含糊其辞,等学生意识到概念的力量,再告诉他们红宝石鞋一直在脚上。他还引用研究说学生普遍记不住极限概念,尤其是 epsilon-delta 证明。但有人也指出他的出版经历包括创造论视角的演化生物学文章,这为讨论增加了一点题外背景。

女:那如果有人想尝试这套方法,有什么资源吗?

男:他 2018 年就写好了书,叫《Calculus from the Ground Up》,论文是写书时遵循的原则说明。他每年只教 2 到 10 个学生,没有任何学校采用他的书。有评论者说 3Blue1Brown 和 Khan Academy 的视觉化教学已经很好了,另一些人则认为视觉化只是分散注意力的消遣,理解后还是需要参考材料和反复练习。还有个德语用户提到语言门槛,说 3Blue1Brown 这类资源基本只有英语。

女:我突然想到,你说“曲线”的时候,我记起曲率这个概念。你上次聊到有个人研究了很多年,要找到一种更好的曲线来代替 Bézier 曲线。那是你在说什么?

男:那是 Raph Levien 提出的一族新曲线,叫 hyperbezier,要替代 2D 矢量图形设计里的三次 Bézier 曲线。三次 Bézier 有两个强项:表达曲率平滑变化的形状,以及表达曲率集中、张力较高的区域。他博士论文研究的 Spiro 曲线做不到后者,因为它的曲率变化被限制住了。所以 Levien 回来找到了一个新的曲线族,用曲率是弧长的函数来定义。这个定义可以看成是 κ(s) = as + b(cs² + ds + 1)^1.5,是曲率沿弧长的演化方程。它是一个相当一致的体系,包含了 Euler 螺旋、圆弧、双曲线等经典曲线非常自然的特例。

女:听你这么说,它是那种“曲率匀称变化”的曲线?那听起来像是对三次 Bézier 的改进。它有什么实际优势?

男:比如圆弧。三次 Bézier 只能近似圆弧,但 hyperbezier 参数空间里就包含精确圆弧。对超椭圆形状,三次 Bézier 逼近时会先长出多余拐点,而 hyperbezier 能一直逼近尖角,视觉上很接近超椭圆。它也能天然贴合双曲线,精度很高,因为两条曲线在渐近处的曲率都以 κ≈s^-3 衰减。名字 hyperbezier 就是 hyperbola 和 Bézier 的融合,因为它能从欧拉螺旋平滑地过渡到双曲线。作者还提到它和“log-aesthetic 曲线”有交集,后者是工业设计里用来建模汽车表面和船体的曲线族,曲率是弧长的幂函数。

女:那数学性质上有什么不完美的地方吗?

男:有。因为曲率的定义中分母恒正,所以曲线最多只能有一个拐点。这意味着它无法精确逼近所有三次 Bézier,因为后者可以有拐点。但作者说实际设计里带两个拐点的三次 Bézier 很少见,所以这个局限不算致命。他特别提到弹性的 elastica 曲线,那是 Minimal Energy Curve 问题的精确解,既能平滑也能在张力下产生大的曲率变化。Spiro 曲线根本无法近似它,hyperbezier 则近似得不错,视觉上相当接近,但不是精确拟合。

女:那这玩意儿在吗?有人用过吗?

男:他的论文和实现都放在官网上了。社区有人试了交互工具,说控制手柄的行为有些反直觉:有些区域曲线会很快“跳变”到另一种形态,有些区域对控制柄的变化饱和、不再移动,标准 Bézier 没有这两种现象。作者自己也承认映射只是可用初稿,不够直觉,交互编辑时只要微调控制点就能得到想要形状。他现在重心放在拟合手写笔数据上。

女:那曲线设计的范围还挺广。我们刚才聊了很多数学和计算,但我一直记挂着你之前说的编译器里的 trampoline 问题。怎么回事?

男:GCC 里有一个机制叫 trampoline,是嵌套函数取地址时在运行时生成的临时机器码。它调整寄存器后跳转到嵌套函数的实际代码。这个代码通常放在栈上,导致栈必须可执行,削弱了栈不可执行的安全防护。GCC 后来支持把 trampoline 放到堆上,但堆分配成本高,使用 longjmp 时还可能泄漏。

女:那这个问题的解决方案是什么?

男:Martin Uecker 一直在推动解决。第一个进展来自 GCC 16:从这一版本开始,GCC 保证不访问父函数局部变量的嵌套函数不需要 trampoline,即使关闭优化也成立,并写进了文档。也就是说你可以安全地返回这类函数指针;如果试图返回一个确实捕获了父函数上下文的嵌套函数,编译器会给出警告。第二个进展是在 GCC 17 开发分支上,作者提交的补丁新增了两个内置函数,与已有的 __builtin_call_with_static_chain 配合使用,可以彻底摆脱 trampoline。通过 __builtin_call_code_address 获得函数代码地址,用 __builtin_call_static_chain 获得父函数上下文指针,传给一个接受宽指针的回调。编译器能自动转换成一个显式传递数据指针的版本,数据指针通过寄存器传递,这个寄存器在 ABI 中本来就为其他语言预留,不用额外占用调用约定。有人问嵌套函数到底有什么用,回答是能给一段代码命名,同时不污染外层命名空间,写回调函数时特别方便。

女:这听起来很优雅。你还真懂底层的东西。说回真实的物理世界,我想起我们有一位听众在做印尼地震监测。你关注了 8 月中旬弗洛勒斯海地震吗?

男:关注了。8 月 14 日 21:58:21 UTC,印尼弗洛勒斯海发生 7.7 级地震,震中在 Ende 西北 68 公里,震源深度 10 公里。USGS 评估可能造成重大伤亡,约 200 万人暴露于强烈至剧烈摇晃,烈度 VI 到 IX。这个区域地震频发,自 1950 年以来震中 250 公里范围内发生过 5 次 7 级以上地震。1992 年同一区域有 7.8 级地震,引发海啸导致至少 2500 人遇难。

女:那这次呢?有海啸风险吗?

男:印尼洋气象和地球物理局 BMKG 的公报显示,此次地震引发了一些波浪,最大观测波高 94 厘米,多数低于 50 厘米,已宣布事件结束。USGS 预测未来一周内发生 6 级以上余震的概率为 55%。论坛上有人正打算从龙目岛乘渡轮去巴厘岛,担心海啸。其他网友解释说开阔海域的渡轮在海啸期间相对安全,海啸不是冲浪式巨浪,而是水位逐渐上升。但也有人说如果是滑坡引发海啸就另当别论,比如加那利群岛上拉帕尔马岛的大规模滑坡风险模型,不过这类事件概率极低,可能每 10 万年不足一次。

女:也有人觉得今年大地震特别多?

男:对。但 USGS 的常见问题页面指出,长期记录自 1900 年以来每年平均约 16 次大地震,包括 15 次 7 级和 1 次 8 级及以上。过去 40 到 50 年间,约 12 年超过了长期平均值。还有网友指出地震总数看似增多,是因为全球新增了大量地震台站,能探测到更小的地震;1 级以上地震的发生率基本不变。

女:这种信息最有价值的地方在于平时没有任何用处,但偶尔能救命。

男:对。地震本身很突然,但历史告诉我们,这种突然性往往是人类自己制造的。你知道 1962 年埃及总统纳赛尔在沙漠中向记者展示四枚火箭的事吗?那场表演让中东力量对比一夜改变,也暴露出一张由前纳粹情报官和火箭技术专家组成的暗网。他们正把自己的技术卖给最高出价者。

女:我想起来了,纳赛尔想造导弹,但美国、苏联都不帮他,所以他去找了德国人。

男:当时有一群不愿为同盟国或苏联工作的前纳粹火箭科学家在 1960 年代初抵达埃及,包括参与设计 V-1 飞弹的沃尔夫冈·皮尔茨、火箭推进工程师欧根·桑格尔,还有海因茨·克鲁格。克鲁格是桑格尔的同事,1958 年起在斯图加特喷气推进物理研究所当经理,1960 年成了一家名为 INTRA 商业公司的前台人物,在慕尼黑的办公室为埃及采购、运输导弹零部件。这些科学家为纳赛尔启动了两种地对地导弹项目,射程和载荷足以打击以色列。1962 年纳赛尔在开罗游行展示 20 枚导弹,以色列开始感到威胁。

女:那以色列是怎么应对的?

男:以色列情报机构摩萨德发起了一项被称为“达摩克利斯行动”的行动。第一个目标就是克鲁格,因为他是导弹生产协调的关键人物。1962 年 9 月 11 日,一个自称“萨利赫先生”的年轻人到克鲁格办公室聊了半小时,两人开着克鲁格的车一起离开,克鲁格再也没回来。警方在慕尼黑南郊索尔恩找到他的车,车上满是泥。之后有一个匿名电话说他已经死了。他的妻子对警方说:“我丈夫被人带走了,他没有理由自愿消失。”

女:这个“达摩克利斯行动”听起来挺成功的。但他们对付科学家还挺狠的?

男:接下来更多人遭殃。皮尔茨的秘书被信件炸弹炸瞎双眼,次日另一枚炸弹炸死五名埃及人。克莱因瓦赫特 1963 年在巴伐利亚躲过三名摩萨德特工的枪击,子弹打穿了他脖子上的围巾。他公开指责西德政府故意不保护他。到 1964 年,大多数科学家要么离开,要么带着枪生活、逐一检查邮件。但克鲁格的下落至今成谜。有人说他被带往奥地利改名换姓度过余生;也有说法称摩萨德杀手将他射杀后埋在森林里;甚至有人指控斯科尔兹内被摩萨德要挟,亲手处决了克鲁格。

女:斯科尔兹内?奥托·斯科尔兹内?那个二战时救出墨索里尼的奥地利突击队员?

男:对。纳赛尔最初找到西德冷战时期间谍头子赖因哈德·盖伦,盖伦把他引荐给斯科尔兹内,斯科尔兹内帮纳赛尔训练了大约一年突击队员,然后离开。作者欧文·西尔斯认为斯科尔兹内不太可能是凶手,但评论区里有个人指出一个讽刺的细节:索尔恩离盖伦组织总部所在地普拉赫很近。如果你想让一个人消失,那里正合适,因为那个地方本身就是一个情报枢纽。

女:所以那个年代的导弹竞赛不只是数学和曲线,还是真实的政治杀戮。

男:对。评论区里还有人补充了类似的冷战导弹交易案例,比如以色列曾与伊朗国王合作导弹项目,有报道称以色列计划在联合项目中只向伊朗提供过时版本,用伊朗的钱给自己造新一代武器。还有德国奥特拉格公司,在 SpaceX 之前约三十年出现的第一家私人商业航天公司,在扎伊尔和利比亚的活动。以及加拿大工程师杰拉尔德·布尔,他帮萨达姆·侯赛因建造“巴比伦大炮”,1990 年被暗杀。评论者强调那是一次谋杀,不是“干预”或“暗杀行动”这种委婉词。

女:我们今天聊了很多。从苹果账号冻结的荒诞,到 AI 写代码、鼓的数学、地震的自然力量,再到冷战黑历史。什么东西让你印象最深?

男:对 AI 优化 GPU 内核那个,有个评论说得很准:这类方法本质是求解特定性。比赛里前十名有 8 个自动优化方案换到比赛之外的输入就完全跑不动,没跑坏的只有那些懂 GPU 编程、没有写出 25,000 行 CUDA 的专家方案。对固定模型形状的推理服务商是好事,对开源库维护者没什么用。作者自己也承认,后来 Cholesky 分解比赛中,组织者用小型训练任务验证数值稳定性,多数顶尖方案 8 题只对 4 题。这说明 AI 自动优化目前还是窄面性的,不是通用的。

女:那你还记得那个鼓面模拟器里,有人画了一个四个相连区域、各自音高不同的鼓,发现每个区域内换位置敲声音还会变,最后意识到自己造了个手碟。

男:这种时刻特别美好。Mark Kac 1966 年问“能听出鼓的形状吗”,1992 年 Gordon 他们给出否定答案,但 Eigendrum 让你真的用耳朵去感受同谱鼓的相似与差异。它就放在那里,任何人有浏览器就能玩,不需要数学学位。

女:最后提醒一下,如果你用的是泛用型播客客户端,可以直接在里面搜索订阅这档节目,这样你就不会错过我们下一次聊这些边缘话题的更新了。

男:对,欢迎在各个泛用型播客客户端里搜我们的节目,也可以写信来分享你的想法和有趣的故事。今天先到这里。

女:大家好,我是莓莓,这也是 Agili 的 Hacker Podcast。我们下次见。

男:阿迪,下期再见。

参考链接