错误处理为何分裂五十年:从PL/I的ON语句到Rust的Result类型
1964年,IBM在设计PL/I语言时引入了一个被称为"ON语句"的构造。这个看似简单的语法元素,开创了编程语言中结构化错误处理的先河。六十年后,当Rust的?操作符和Go的显式错误检查成为现代语言的主流选择时,我们不禁要问:为什么错误处理这个问题困扰了语言设计者如此之久? ...
1964年,IBM在设计PL/I语言时引入了一个被称为"ON语句"的构造。这个看似简单的语法元素,开创了编程语言中结构化错误处理的先河。六十年后,当Rust的?操作符和Go的显式错误检查成为现代语言的主流选择时,我们不禁要问:为什么错误处理这个问题困扰了语言设计者如此之久? ...
Uber的调度系统曾经遇到过一个难以复现的诡异bug:location-service → driver-service → trip-service → location-service,形成了一个完美的循环调用链。这个bug只在特定条件下触发——当司机和乘客恰好处于同一个geohash网格中时。在测试环境中,这个条件几乎不可能被满足,因此问题长期潜伏。直到某次高峰期,大量用户在相同区域,循环依赖终于暴露,系统负载瞬间飙升。 ...
一段代码,在GCC下输出1 2,在Clang下输出2 1,在MSVC下又是另一种结果。这不是编译器的bug,而是C/C++语言规范有意为之的设计——或者说,是一个困扰了程序员三十多年的"特性"。 ...
一个看似简单的计数器,在多线程环境下却能暴露出计算机系统最深层的复杂性。当你写下x++这样的代码时,编译器可能将其重排序,CPU可能延迟写入,缓存一致性协议可能在不同核心间传递失效消息——这些操作并非恶意捣乱,而是现代处理器为了榨取每一分性能而精心设计的优化策略。 ...
1964年,Peter Landin在一篇题为《The Mechanical Evaluation of Expressions》的论文中首次提出了"闭包"(closure)的概念。他将闭包定义为一个包含λ表达式及其相关环境的"信息束"。六十年后,这个概念几乎出现在所有现代编程语言中——JavaScript、Python、Rust、Go、Swift、C++、Java——但每种语言的实现方式却大相径庭。 ...
2006年的一天,Graydon Hoare回到公寓,发现电梯又坏了。他住在21楼。 爬楼梯的时候,这位Mozilla的程序员越想越气。“我们这些搞计算机的,连个电梯软件都写不好?“他后来回忆道,“这太荒谬了。” ...
2017年,一位资深C++开发者在Stack Overflow上发帖求助:他的无锁队列在x86服务器上运行完美,但移植到ARM服务器后,偶尔会丢失数据。代码经过了多轮Code Review,逻辑无懈可击。最终,一位编译器开发者指出问题所在:缺少一条内存屏障。 ...