也不知道从何时起,也不知道是哪个"教授"还是"老师",将stack翻译成堆栈(据说*叫做"堆叠")。窃以为,这种翻译实在是误人子弟(题外话:the Milky Way曾经被误译为"牛奶路"),因为堆(heap)是堆, 栈(stack)是栈。只有堆(Heap)和栈(Stack),没有"堆栈"。 每次面试别人,尤其是当一个还没走出校园的学生,跟我很有自信地讲到C语言的局部变量是存在堆栈上的时候,我就忍不住想考据出始作俑者,可叹多次搜索无果,无可奈何。
之所以说将stack翻译成"堆栈"是误人子弟,是因为:
第一,在C程序之内存布局中,堆(heap)和栈(stack)完全是两个不同的区域,作用也完全不一样。
典型的C程序之内存布局看起来是这样子滴,【图片来源:http://www.slideshare.net/emersonferr/2-c-reviewi】
注:很多关于C程序内存布局的图都是把高地址画在上面,低地址画在下边。诚然,这符合人的思维习惯,但是我个人却钟意上面这张截图,因为我喜欢“像计算机一样思考”。有过debug经验的人都知道,用调试工具(e.g. debug.exe, gdb, mdb ...)dump某个内存地址里的数据的时候,总是首先显示低地址里的内容。
更多关于C程序的内存布局,请参见这里。
第二,在数据结构中,堆(heap)和栈(stack)是两种完全不同的结构。Heap(堆)是一个完全二叉树(分为大顶堆和小顶堆),Stack(栈)是一种先进后出的抽象数据类型。
o Heap(堆)看起来是这样子滴,【图片来源:https://en.wikipedia.org/wiki/Heap_(data_structure)】
o Stack(栈)看起来是这样子滴,【图片来源:https://en.wikipedia.org/wiki/Stack_(abstract_data_type)】
总结:将stack翻译成"堆栈"实在是误人子弟, 因为堆(heap)是堆, 栈(stack)是栈。
PS: 最近教育部门操操得正火的就是讲要把"八年抗战"改成"十四年抗战", 个人认为未必是正道。但是既然如此,请问高等教育部门和图书出版单位,当你们(还包括写书的人,审稿的人...)在再版相关的计算机教材和图书的时候,可否将"堆栈"改成"栈"?! 否则流毒至今,且不可断绝......