也不知道从何时起,也不知道是哪个"教授"还是"老师",将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翻译成"堆栈"实在是误人子弟的更多相关文章

  1. 【探索】机器指令翻译成 JavaScript

    前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...

  2. 机器指令翻译成 JavaScript —— No.2 跳转处理

    上一篇,我们发现大多数 6502 指令都可以直接 1:1 翻译成 JS 代码,但除了「跳转指令」. 跳转指令,分无条件跳转.条件跳转.从另一个角度,也可分: 静态跳转:目标地址已知 动态跳转:目标地址 ...

  3. 机器指令翻译成 JavaScript —— No.3 流程分割

    上一篇 我们讨论了跳转指令,并实现「正跳转」的翻译,但最终困在「负跳转」上.而且,由于线程模型的差异,我们不能 1:1 的翻译,必须对流程进行一些改造. 当初之所以选择翻译,而不是模拟,就是出于性能考 ...

  4. 机器指令翻译成 JavaScript —— No.4 动态跳转

    上一篇,我们用模拟流程的方式,解决了跳转问题. 不过静态跳转,好歹事先是知道来龙去脉的.而动态跳转,只有运行时才知道要去哪.既然流程都是未知的,翻译从何谈起? 动态跳转,平时出现的多吗?非常多!除了 ...

  5. 机器指令翻译成 JavaScript —— No.5 指令变化

    上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应 ...

  6. 机器指令翻译成 JavaScript —— No.6 深度优化

    第一篇 中我们曾提到,JavaScript 最终还得经过浏览器来解析.因此可以把一些优化工作,交给脚本引擎来完成. 现代浏览器的优化能力确实很强,但是,运行时的优化终归是有限的.如果能在事先实现,则可 ...

  7. 机器指令翻译成 JavaScript —— No.7 过渡语言

    上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 ...

  8. 机器指令翻译成 JavaScript —— 终极目标

    上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...

  9. EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!

    回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...

随机推荐

  1. Summation of Four Primes - PC110705

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10168.html 原创:Summ ...

  2. thinkphp空操作和配置文件实现简化路由

    1关于TP中空操作和路由问题 <?php function test(){ $content="test demo @云峰天下"; $pattern='/@(\S+)\s/' ...

  3. Using django model/authentication/authorization within Tornado

    There is a project which is deployed within django. So its authentication system is built from Djang ...

  4. 从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态

    一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...

  5. 深入浅出Mybatis-sql自动生成

    本文提供了一种自动生成sql语句的方法,它针对的对象是有主键或唯一索引的单表,提供的操作有增.删.改.查4种.理解本文和本文的提供的代码需要有java注解的知识,因为本文是基于注解生成sql的.本文适 ...

  6. orchard相关网址

    1.官网文档  http://docs.orchardproject.net/ 2.github  https://github.com/OrchardCMS/Orchard 3.stackoverf ...

  7. 从ASP.NET Web API 2 (C#)开始说起

    [译]Getting Started with ASP.NET Web API 2 (C#) 单击此处查看原文 HTTP不是单单为网页服务的,它更是一种用于构建API(用于暴露服务和数据)的强大平台. ...

  8. Java ArrayList、Vector和LinkedList等的差别与用法(转)

    Java ArrayList.Vector和LinkedList等的差别与用法(转) ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都 ...

  9. Highcharts中如何外部修改pointStart

    相信很多童鞋都在用Highcharts做图表,使用时当然就会产生各种各样的需求,今天遇到一个问题,搞了一上午才搞定:在服务端拼装好options的json串传到前段,但是有个问题,JSONObject ...

  10. SASS使用CSS3动画并使动画暂停和停止在最后一帧的简单例子

    今天在手机上试了试这个 css3 动画效果,可以把动画效果停留在最后一帧上,以及鼠标 :hover 暂停动画,比较实用的功能,不用 JS 也能实现这些效果了. 不过测试体验感觉手机上没有 jQuery ...