将stack翻译成"堆栈"实在是误人子弟
也不知道从何时起,也不知道是哪个"教授"还是"老师",将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: 最近教育部门操操得正火的就是讲要把"八年抗战"改成"十四年抗战", 个人认为未必是正道。但是既然如此,请问高等教育部门和图书出版单位,当你们(还包括写书的人,审稿的人...)在再版相关的计算机教材和图书的时候,可否将"堆栈"改成"栈"?! 否则流毒至今,且不可断绝......
将stack翻译成"堆栈"实在是误人子弟的更多相关文章
- 【探索】机器指令翻译成 JavaScript
前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...
- 机器指令翻译成 JavaScript —— No.2 跳转处理
上一篇,我们发现大多数 6502 指令都可以直接 1:1 翻译成 JS 代码,但除了「跳转指令」. 跳转指令,分无条件跳转.条件跳转.从另一个角度,也可分: 静态跳转:目标地址已知 动态跳转:目标地址 ...
- 机器指令翻译成 JavaScript —— No.3 流程分割
上一篇 我们讨论了跳转指令,并实现「正跳转」的翻译,但最终困在「负跳转」上.而且,由于线程模型的差异,我们不能 1:1 的翻译,必须对流程进行一些改造. 当初之所以选择翻译,而不是模拟,就是出于性能考 ...
- 机器指令翻译成 JavaScript —— No.4 动态跳转
上一篇,我们用模拟流程的方式,解决了跳转问题. 不过静态跳转,好歹事先是知道来龙去脉的.而动态跳转,只有运行时才知道要去哪.既然流程都是未知的,翻译从何谈起? 动态跳转,平时出现的多吗?非常多!除了 ...
- 机器指令翻译成 JavaScript —— No.5 指令变化
上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应 ...
- 机器指令翻译成 JavaScript —— No.6 深度优化
第一篇 中我们曾提到,JavaScript 最终还得经过浏览器来解析.因此可以把一些优化工作,交给脚本引擎来完成. 现代浏览器的优化能力确实很强,但是,运行时的优化终归是有限的.如果能在事先实现,则可 ...
- 机器指令翻译成 JavaScript —— No.7 过渡语言
上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 ...
- 机器指令翻译成 JavaScript —— 终极目标
上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...
- EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!
回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...
随机推荐
- 用自己的话表达出来-Servlet
什么是Servlet Servlet就是工作在服务器端的类,该类可以处理用户传过来的请求,也可以通过响应向用户输送数据. 如何使用Servlet Servlet就是处理用户的HTTP请求,然后回送HT ...
- Xps实现文档显示、套打功能
wpf采用Xps实现文档显示.套打功能(原创) 近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的Documen ...
- General Structure of Quartz.NET and How To Implement It
General Structure of Quartz.NET and How To Implement It General Structure of Quartz.NET and How To ...
- C#单例模式的三种写法 以及 继承面试题
1.没有考虑线程安全 public class Singleton { private static Singleton _instance = null; private Singleton(){} ...
- IOS学习之路十九(JSON与Arrays 或者 Dictionaries相互转换)
今天写了个json与Arrays 或者 Dictionaries相互转换的例子很简单: 通过 NSJSONSerialization 这个类的 dataWithJSONObject: options: ...
- 学会Func
学会Func 前言 首先你要会最基本的委托的使用,如果不会,看起来可能会有难度.. 不过第一个例子将帮你复习一下委托delegate 接下来通过几个例子就会学会怎么灵活使用Func了 委托回顾(d ...
- [置顶] 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于 ...
- Hibernate3.0中的session.find()问题
我被Session.find()的方法困扰了好几天,今天才看到新的Hibernate里没有了Session.find()方法. 现在转载在此,方便你我. 查询性能往往是系统性能表现的一个重要方面,查询 ...
- thinkpad x230i U盘启动
现在的thinkpad的笔记本真麻烦,设置个U盘启动都不好使,网上找了好多都不管用,后来打电话问的售后电话才搞定,具体步骤如下: 按F1进bios的 [Security]中最下面Secure Boot ...
- Java(多)线程中注入Spring的Bean
问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...