函数内联:编译器如何决定把代码复制到哪里

1972年,David Gries在《Compiler Construction for Digital Computers》中描述了一个看似简单的优化:把被调用函数的代码直接复制到调用点。五十年后,这个"复制粘贴"技术仍然是编译器优化中最关键、最复杂,也最容易被误解的一环。 ...

15 min · 7142 words

为什么内存安全成为现代软件工程的圣杯?从手动管理到所有权系统的五十年技术突围

2019年,微软安全响应中心公布了一组令人震惊的数据:从2006年到2018年,微软产品中约70%的安全漏洞源自内存安全问题。这并非孤例——Chrome团队的数据同样显示,其高危安全漏洞中超过三分之根植于内存安全缺陷。Google的研究人员指出,这一比例在C/C++代码库中呈现出惊人的稳定性。 ...

13 min · 6072 words
Blog Cover

原型链查找一次属性需要遍历多少对象:从 JavaScript 设计哲学到 V8 引擎优化

1995 年 5 月,Brendan Eich 在网景公司的十天内完成了 JavaScript 的设计与实现。他面临一个关键决策:采用传统的类继承模型,还是更灵活的原型继承模型?最终,他选择了后者——受 Self 语言启发的原型继承机制。这个决定深刻影响了此后三十年 JavaScript 的演进轨迹。 ...

9 min · 4299 words

SQL查询入门:从SELECT语句到多表关联的完整技术指南

当你在应用中需要存储用户信息、记录交易数据、查询商品列表时,背后都离不开数据库。而与数据库对话的语言,就是SQL。无论是后端开发、数据分析还是运维管理,SQL都是一项必备技能。理解SQL,是理解数据如何存储、查询和管理的起点。 ...

12 min · 5734 words

一行看不见的字符如何让编译器背叛你:从Unicode双向文本到Trojan Source的供应链暗战

2021年10月,剑桥大学的两位研究员向19家科技公司发送了一份措辞谨慎的安全报告。报告中包含一段C代码,看起来简单到不值一提:检查用户是否为管理员,如果不是就什么都不做。然而,编译运行后,程序却打印出了"You are an admin." ...

12 min · 5866 words

哈希表的七十年演进:从链表法到Swiss Table的工程智慧

1953年1月,IBM研究员Hans Peter Luhn在一篇内部备忘录中提出了一个看似简单的想法:把数据放进"桶"里以加速查找。他当时的目的是解决一个日益紧迫的问题——科学文献的数量正以指数级增长,人工索引已经跟不上节奏。Luhn可能没想到,这个为了信息检索而设计的"桶"方案,会在七十年后成为计算机科学中最核心的数据结构之一。 ...

12 min · 5841 words

JIT编译如何让解释型语言跑出编译型语言的速度?

同一个Python程序,在标准CPython解释器下运行需要47秒,换成PyPy只需要2秒。代码完全相同,没有改动任何一行,性能却提升了23倍。这不是魔法,而是即时编译器(JIT)的功劳。 ...

12 min · 5962 words