子函数演变历程:从织布机到Excel VBA的参数传递艺术
一、二进制打孔时代(1805-1940s):世界上最早的”代码复用”
1805年,法国人Jacquard发明的织布机用打孔卡片控制花纹——这可能是人类历史上最早的”子程序”。每张卡片相当于一个”函数”,孔洞的位置就是”参数”,而织布机的经线就是”返回值”。
程序员的祖先们面临的终极难题:
-
· 没有版本控制,改代码得用剪刀剪卡片 -
· 调试全靠肉眼比对孔洞,比找bug还痛苦 -
· 最惨的是没有Ctrl+Z,删错一行就得重打一整张
二、汇编语言阶段(1940s-1970s):寄存器里的参数传递密码
当ENIAC计算机用汇编指令实现跳转时,程序员终于不用插拔电线了。x86架构的栈帧就像个快递柜:
-
· push指令把参数一个个塞进柜子(从右向左) -
· ebp寄存器当”柜门钥匙”,通过[ebp+8]取第一个参数 -
· ret指令相当于”取件码”,告诉CPU该回到哪里继续干活
汇编程序员的浪漫:
用push ebp和mov ebp, esp写情书,每个寄存器都是爱的密码——可惜现在的程序员只能看懂printf("I love you")。
三、C语言革命(1970s-至今):从K&R风格到ANSI标准
1978年K&R出版《C程序设计语言》时,函数长这样:
// K&R风格:参数类型在括号外声明
int add(a, b)
int a, b; {
return a + b;
}
直到ANSI C标准化,才变成我们熟悉的样子:
// ANSI C风格:参数类型内联声明
int add(int a, int b) {

return a + b;
}
参数传递的外卖哲学:
-
· ByVal传值:像点外卖时给商家地址,商家改不了你家地址 -
· ByRef传址:相当于把家门钥匙给外卖小哥,他可能顺手帮你把冰箱清空
四、VBA阶段(1990s-至今):Office里的参数传递魔法
在Excel VBA里,参数传递成了”办公室政治”:
-
· ByVal(传值):老板让你复印文件,改了复印件不影响原件 -
· ByRef(传址):直接把老板电脑里的文件改了,后果自负
经典场景再现:
Function 涨工资(ByRef 工资 As Integer)
工资 = 工资 * 2 ' 老板看到会疯的ByRef用法
End Function
子函数进化树(参数传递方式对比)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
历史的玩笑:19世纪的织布工绝不会想到,他们打孔的卡片,五十年后会变成程序员手里的”函数参数”;而今天的VBA程序员,可能也想不到自己每天用的ByRef,其祖师爷竟然是一台织布机。
为什么参数传递是编程史上的革命性突破?
一、没有参数的函数就像没有口袋的衣服
早期计算机(如ENIAC)的子程序没有参数概念,每次调用都要重新接线——这相当于每次出门都得缝一件新衣服,因为旧衣服没有口袋装东西。1945年冯·诺依曼在《EDVAC报告》中首次提出”参数传递”思想,他比喻道:”函数如果不能带参数,就像信件没有信封——内容暴露在外,谁都能篡改。”
二、参数化如何拯救程序员的发际线?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
历史案例:1950年代MIT的Whirlwind计算机,因缺乏参数传递机制,一个简单的三角函数库需要2000行代码;引入参数化后,相同功能仅需150行——相当于拯救了程序员的1850根头发。
三、每个参数都是一次逻辑抽象的胜利
-
1. 物理抽象:Jacquard织布机的孔洞位置→参数值
(没有参数:每种花纹需单独打孔;有参数:同一张卡片通过孔洞位置变化控制不同花纹) -
2. 内存抽象:汇编栈帧的 [ebp+8]→参数访问
(没有参数:直接操作内存地址导致冲突;有参数:栈帧隔离实现安全访问) -
3. 类型抽象:ANSI C的 int add(int a, int b)→接口契约
(没有类型声明:K&R风格导致参数类型错误;有类型声明:编译器自动检查类型匹配) -
4. 语义抽象:VBA的ByVal/ByRef→意图表达
(没有语义控制:无法区分”临时使用”与”永久修改”;有语义控制:参数传递方式即程序员意图)
程序员的顿悟:1972年Dennis Ritchie在设计C语言时说:”参数不是函数的附属品,而是函数的灵魂。没有参数的函数只是一段代码,有参数的函数才是一个概念。”
四、参数传递的哲学:从”我要什么”到”我给什么”
-
· 无参数时代:函数说”我需要A、B、C变量”(索取式编程) -
· 有参数时代:调用者说”给你A、B、C,帮我处理”(契约式编程)
这种转变催生了模块化开发、面向接口编程,甚至微服务架构。今天的API设计(如RESTful接口),本质上是参数传递思想的终极体现——而这一切,都始于Jacquard织布机上那一个个不起眼的孔洞。