将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 ...
随机推荐
- Essential C#读书笔记
Essential C#读书笔记 这是一个多变的时代,一次又一次的浪潮将不同的人推上了巅峰.新的人想搭上这一波,同时老的人也不想死在沙滩上.这些年新的浪潮又一次推开,历史不停地重复上演,那便是移动互联 ...
- 基于A2DFramework的事件机制实现
随笔- 102 文章- 3 评论- 476 发布订阅 - 基于A2DFramework的事件机制实现 SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework ...
- 【欧拉计划4】Largest palindrome product
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1371281760.html 原创:[欧 ...
- Linq无聊练习系列2--select/distinct练习
void dataBindByWhere() { /**************select/distinct 练习*******************/ //获 ...
- .NET平台技术体系
.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标 一 .NET平台技术体系梳理 .NET平台应用领域众多(桌面开发,web开发,移动开发),不断有新的编程爱好者开始学习或从其他平台转移到 ...
- c#QQ连连看辅助
近来无事,写个连连看辅助,下面先说下思路吧(口才不行,见谅哈) 游戏辅助有三种方法,一种是读内存,这个不知道怎么分析,还有一种是获取封包,这个分析起来复杂,最后一种是图片识别再分析,这里采用最后一种 ...
- Paint.NET
http://www.dotpdn.com/downloads/pdn.html Paint.NET To download, please click the Free Download Now l ...
- iOS关于RunLoop和Timer
RunLoop这个东西,其实我们一直在用,但一直没有很好地理解它,或者甚至没有知道它的存在.RunLoop可以说是每个线程都有的一个对象,是用来接受事件和分配任务的loop.永远不要手动创建一个run ...
- 用django创建一个简单的sns
用django创建一个简单的sns 1.首先创建一个工程newsns django-admin.py startproject newsns 在工程目录下新建一个文件夹templates,在该文件夹下 ...
- Remobjects使用经验
RemObjects RemObjects提示:我们相信本文是正确的,但我们不做任何保证.在此感谢Henrick 写的文章,很高兴在此发表. 介绍RemObjects是功能强大可扩展的远程框架;但是当 ...