“哇塞,怎么可能这么简单!”

当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨。

在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类指令:

数据传输类:

就是把数据从一个位置复制到另外一个位置,比如从内存到寄存器,或者从寄存器到内存, 或者从寄存器到寄存器。

算术和逻辑运算类:

无非就是加减乘除,AND, OR,  左移,右移

控制类:

比较两个值,跳转到某一个位置。

汇编老头儿非常地骄傲, 他经常嚣张地说:“别看我的指令这么简单,但是配合我的寄存器和内存, 却能完成你们这些所谓的高级语言的所有功能!”

这寄存器是什么鬼?C语言脑海中只有内存和指针,根本就没有什么寄存器的概念, 实际上,这是属于CPU阿甘的,容量有限,但是速度超级快的存储部件。

32位CPU寄存器

图片来源:http://pascalturbo.net/cpu-registers/

数组

C看着汇编这单薄的小身板,想到自己那优雅的if , 漂亮的while, for ,还有那极为重要的函数调用,心里不由得泛起嘀咕:我的程序怎么可能被编译成这么简单的汇编?

虽然心里有点瞧不上,但C小伙还是挺恭敬的:“前辈,在我这里有个数组的概念,编译成汇编是什么样?”

int num[10];

num[0] = 100;

num[1] = 200;

除了机器语言,那就属汇编最老,连C语言的第一个编译器都是用汇编写的,当之无愧的前辈。

汇编老头儿没想到C小伙儿连这个问题都没弄清楚,说道:“我这里只认寄存器和内存,你这所谓数组,就是内存的一段连续的空间嘛,我只要知道开始地址就可以了。”

C小伙儿一看,好家伙,连变量名num都不要了。不过说得也是, 汇编老头只要记住初始地址,顺着地址就能找到所有东西。

“咦,这个什么0x000083d0不就相当于我的指针么?”

“是啊,不过在我这里,都是地址,忘掉指针吧!”

条件分支

C小伙又想到了自己的if else,在汇编中该怎么处理?

汇编老头儿说:“你们这些高级语言啊,就爱搞复杂化,怎么不用goto呢?”

C小伙说:“goto 被迪杰斯特拉认为是有害的,会破坏结构化,不建议使用!”

“唉,简单就是美,你们这些高级语言懂不了,我这里很简单,就是比较和跳转指令,从一个地方跳到另外一个地方执行就行了。”

汇编老头儿一遍感慨,一遍写道:

我们假设

%eax 寄存器保存的是y的值,

%edx 寄存器保存的是x的值。

cmpl %eax, %edx ;  比较x和y

jge   .L1       ;  如果x >= y,跳转到.L1处去执行

subl  %edx,%eax ;  计算y-x,结果存到eax寄存器中

jmp  .done      ;  跳转到.done标签处

.L1:

subl %eax, %edx ;  计算 x-y

movl %edx, %eax ; 把结果存到eax寄存器中

.done:            ; 计算结束,结果保存在eax寄存器中

(码农翻身注:这个例子来源于《深入理解计算机系统》)

C小伙儿看了半天,终于搞明白了这段汇编程序的含义,这所谓的jge也就是做一个判断,然后跳转到特定位置去执行,就像是if 和 goto 的结合。

汇编老头儿看到C小伙儿懂了, 问道:“你想想你的while 循环,for 循环,是不是if 和 goto 的包装而已?”

C小伙儿想了一会:“确实是这样!”

“这不就结了,我的汇编看起来简单,但是却能表达你所有的流程控制语句,不管什么if else, while, for ,switch ,对吧?”

C小伙儿觉得汇编老头儿说的都是歪理:“这goto是简单,可是程序读起来就非常复杂了啊!”

汇编老头儿说:“你算是说道了点子上,所谓高级语言,主要是方便人类的编写和阅读的,是为了提升人类的效率。在我这里,主要是让CPU阿甘执行的,那傻小子,速度飞快,什么也不懂,你只要告诉它指令就行,越简单越好。”

没想到CPU阿甘听到了对它的嘲讽,不满地说:“老伙计,又在背后说我的坏话,我执行了亿万条指令以后,早就悟出了程序的局部性原理,这你懂不懂?”

函数调用

C小伙看到不能难倒汇编老头儿,想到了自己可以定义函数,精神一振,问道:“函数调用你怎么处理啊?”

int funcA(int a){
    ......
    funcB(10)
    ......
}

int funcB(int b){
    ......
    funcC();
    ......
}

看看,这funcA调用funcB, funcB又调用funcC,函数嵌套调用,你那简单的指令能处理?C小伙儿心里暗想。

汇编老头儿不慌不忙:“你可算是问了一个有价值的问题,不过这也难不倒我,我需要内存配合一下就行了。”

“看到里边的栈帧没有,每个栈帧都表示一个函数的调用!”

“那这栈帧中有什么东西?” C小伙儿问道。

“细节太复杂,给你画个示意图看看吧!”

“不对啊,你这栈帧中有输入参数,有返回值,可是没有函数代码啊?代码去哪儿了?”

“真是幼稚!这是运行时在内存中对函数的表达,那代码肯定是在代码段啊。” 汇编老头儿嘲讽道。

代码段的指令不断被CPU阿甘执行,遇到函数调用,就建立新的栈帧,函数调用结束,栈帧就会销毁,废弃。然后返回上一个栈帧。

C小伙儿意识到自己犯了一个大错误,他老是想着代码的静态结构,而忽略了运行时的表示。

编程语言的巅峰

他急于挽回面子,赶紧给C++打电话求援:“兄弟,快过来,治一下这个汇编老头儿!”

C++了解了事情的经过,说道:“兄弟,不行啊,别看我有class, 但是最终我也得变成过程化的程序,翻译成汇编,和你是一样一样的。”

(码农翻身注:参见《面向对象圣经》)

“那Python呢, Java 呢?”  C小伙儿有点气急败坏。

“他们更不行了,是虚拟机中的语言,他们连汇编老头儿的面儿都见不着,再说那虚拟机也是用你老兄C语言写的啊!”

C小伙呆住了,可不是,自己是很多系统级软件和编程语言的基础,已经非常贴近硬件了,自己治不了汇编老头儿,别人肯定也不行啊。

C小伙儿又想到了应用层那复杂的业务逻辑,他们都是由Python,Java, JavaScript等高级语言编写的,还用到了什么OOD,设计模式,函数式,响应式编程...... 但是它们都是一层层的抽象,帮助程序员更好地编写程序,在最底层,还是汇编啊。

他叹了一口气,对汇编老头说:“前辈,我服了,您可真是编程语言的巅峰啊。”

“不敢当,还有一个语言比我更厉害!”

“是谁?”

“机器语言!只有0和1!不信你看看这程序员专属的键盘。”

作者简介

刘欣

15年的软件行业从业经验,前IBM系统架构师,擅长企业应用架构和设计,领导过多个企业级应用架构设计和开发工作。

本书特色

  • 书中把计算机元素和行为用拟人手法编成一个个精彩纷呈的故事,绘声绘色且深入浅出地演绎晦涩枯燥的编程知识。

  • 编程初学者可以津津有味地学习,有经验的编程者也能饶有兴致地查漏补缺。

  • 学习优秀的架构师是如何思考、如何抽象、如何成长的,从操作系统、Java语言到Web技术,每个主题都深入浅出。

《码农翻身》不是一本编程的入门书,对编程一窍不通的“纯小白”可能看不明白,可能会失望。但稍有编程基础的读者读起来会非常畅快,读后会有一种“原来如此”的感觉。所以学习编程的你绝对可以入手一本,值得!

扫码或者点击阅读原文购买

购买前可以先领券哦

优惠券领取二维码

人工智能如何学?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

码书商店是CSDN专为我们的用户建立的一个商店,这里提供大量的技术书籍,除了书籍我们也提供生活类的相关产品,如耳机、键盘等,或者你们如果有需求也可以联系码书商店的客服或者在公众号下留言你们需要的产品,我们尽量满足大家需求哦。

作为码书商店的运营人员,诚邀你们进入我们的“CSDN码书福利群”,群里会不定时的给大家赠书书籍、优惠券等,有书籍推荐或者物流方面信息也可群里咨询~目前群已满100人,需要加群的请扫下方二维码添加微信,拉你入群哦~

码农翻身之编程语言的巅峰相关推荐

  1. 码农翻身讲网络5:从Web安全到HTTPS

    浏览器:一个家族的奋斗 浏览器家族的安全反击战 黑客三兄弟 黑客三兄弟(续) 一个故事讲完https 深入浅出HTTPS工作原理 原创: 刘欣 码农翻身 2017-12-12 我是你们每天都要使用的浏 ...

  2. 《码农翻身》总结整理

    最近突然想把自己读过的一些书总结一下,做个记录.<码农翻身>是我毕业之后认真读过的第一本书,从此之后一发不可收拾,上网买了一堆博客大神推荐的书,读完之后也有自己的一些总结,后面会陆续补上. ...

  3. 《码农翻身》之技术之路

    <码农翻身>读书笔记之技术之路 这是我的后端读书笔记系列文章的第四三篇,选取的是最近刚刚圈粉的知名博主刘欣创作的<码农翻身>.这篇文章只是最后一部分内容. 本文内容主要根据知名 ...

  4. 码农翻身全年文章精华

    在码农翻身公众号写了一年多, 最大的体会就是:原创真心不易! 每天思考的最大问题就是: 下一篇文章写啥? 在大家的支持和鼓励下,还是坚持了下来,  回头看看走过的路,这一年过得还算充实. 很快就要过年 ...

  5. 阅读源码的三种境界 (转自 码农翻身 微信公众号)

    刘欣 码农翻身 "没有经验的技术差底子薄的初级程序员,如何阅读项目源码? " "有人阅读过 mybatis 的源码吗 ?就看一个初始化过程就看的已经头晕眼花了,小伙伴们支 ...

  6. 从抄书到开源之巅:章亦春的程序人生(转载自微信公众号 -- 码农翻身)

    2018-04-08 章亦春 码农翻身 国人主导的开源软件能建立世界级影响力的不多,章奕春的OpenResty是其中之一. 让人没有想到的是,他的程序人生是从抄书开始的...... 本文转载自公众号& ...

  7. 码农翻身 各章节链接

    大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大 ...

  8. 跃迁:化学系女生的工程师之路(转载自微信公众号 -- 码农翻身)

    原创 2018-05-02 不要和我抢鸡腿 码农翻身 前言 这是一篇来自一位程序媛的投稿,记录了她从化学系转行进入IT业,制定计划学习,扎实执行,面试腾讯实习的经历.她展现出来的特质例如制定学习计划. ...

  9. 告别2017,码农翻身全年文章精华

    时间过得真快,转眼间2017年就结束了! 感谢大家一年来的陪伴.支持和鼓励! 这里是2017年全年码农翻身文章精华, 点击标题阅读, 欢迎转发分享. 如果觉得不过瘾的话,一定要逛逛<码农翻身20 ...

最新文章

  1. zabbix学习(四)IT_Service管理
  2. 在Salesforce中处理Email的发送
  3. express的app.js的详细配置说明
  4. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170408
  5. Qt 断言的使用 Q_ASSERT
  6. Java实现接收数组参数
  7. [JavaWeb-HTML]HTML标签(大部分常用标签介绍)
  8. android 退出多个activity,Android 中 退出多个activity的经典方法
  9. 在Windows 7中安装、配置和使用IIS7和ASP
  10. SharePoint2010 对象模型 关联列表
  11. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(2)签到题5题
  12. 狂雨小说(KYXS)CMS 代码审计
  13. 百度时间显示时间_百度SEO需要多长时间以及如何加快排名?
  14. JanusGraph配置
  15. 法国奢侈品牌VILEBREQUIN限时精品店登陆北京老佛爷百货
  16. 平方米用计算机怎么打,平方厘米用电脑怎么打
  17. 我们吵的百分之九十的架都是同一个原因
  18. raid卡的读写策略
  19. javascript英语单词音节拆分_英语连读时拆分中间单词吗?
  20. 时间单位:s cs ms us ns ps fs as zs js ys 普朗克

热门文章

  1. install常见问题
  2. c语言如何答应出数所在数组的下标_零基础学C语言——数组
  3. 命令窗口ping oracle,Oracle中tnsping命令解析
  4. darknet编译报错 error: ‘__fatBinC_Wrapper_t’ does not name a type
  5. 【QT】QT从零入门教程(十三):QT画笔工具QPainter (双缓冲绘图)
  6. 数据密集型应用系统设计--数据存储与检索
  7. 中国双门和多门冰箱市场趋势报告、技术动态创新及市场预测
  8. 2021-2025年中国伊维菌素原料药行业市场供需与战略研究报告
  9. 危险的转变:Python正在从简明转向臃肿,从实用转向媚俗
  10. 2020已过大半,量子计算机发展如何了?