文章来源:码农翻身

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

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

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

数据传输类:

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

算术和逻辑运算类:

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

控制类:

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

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

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

图片来源: http://pascalturbo.net/cpu-registers/
32位CPU寄存器

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程等待你来学习。完全免费哦! 需要软件及教程源码的请加我企鹅:2726811956)

数组

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

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

int num[10];num[0] = 100;num[1] = 200;

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

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

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

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

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

条件分支

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

if(x < y ){return y - x;
} else {return x -y ;
}

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

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

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

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

我们假设

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

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

 cmpl %eax, %edx ;  比较x和yjge   .L1       ;  如果x >= y,跳转到.L1处去执行subl  %edx,%eax ;  计算y-x,结果存到eax寄存器中jmp  .done      ;  跳转到.done标签处.L1:subl %eax, %edx ;  计算 x-ymovl %edx, %eax ; 把结果存到eax寄存器中.done:            ; 计算结束,结果保存在eax寄存器中

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

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

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

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

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

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

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

没想到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!不信你看看这程序员专属的键盘。”

编程语言的巅峰(嚯哈哈哈哈)相关推荐

  1. 码农翻身之编程语言的巅峰

    "哇塞,怎么可能这么简单!" 当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨. 在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类 ...

  2. Python凭啥这么受欢迎?

    **Python历史性登顶TIOBE排行榜(并在11月保持蝉联),20年来首次将C和Java挤下榜首.**这成为Python的光荣一役,也标志着一个编程语言的巅峰时刻.但是,Python惊人成功的背后 ...

  3. 编程fi什么意思_盲人程序员如何编程?全靠每分钟450个单词

    昨天有人给我发了一篇文章,我一看到图就觉得很奇怪,这个人坐在一个小隔间里,戴着耳机,敲着键盘,但是他的面前却没有屏幕, 他在干什么? 他叫Tuukka Ojala, 是一个Web开发程序员,他坐在那里 ...

  4. 红帽取代 Oracle,接管 OpenJDK 8 和 OpenJDK 11 | 极客头条

    作者 | Darryl K. Taft 译者 | 弯月 责编 | 沭七 出品 | CSDN(ID:CSDNnews) 红帽已经取代 Oracle,接管了 OpenJDK 8 和 OpenJDK 11 ...

  5. 我能够快速读书的秘密:主要靠“猜”!

    " 有很多人问我,平时是怎么看技术书的,我今天拿一个案例来讲一下,你会看到,我主要靠"猜",自己想想解决方案,然后到书中去验证.干货内容较多,建议静心慢慢看. 1 我知道 ...

  6. 被大公司“圈养”的年轻人

    吃喝拉撒都可以在公司解决.完备的体系让他们有很强的归属感,但也有人想要逃离.每种选择都有它的代价,重要的是诚实地生活. 作者丨刘心雨 编辑丨金世遗 来源丨微信公众号"谷雨工作室-腾讯新闻&q ...

  7. 上了公众号的“贼船”, 后悔吗?

    公众号真是一个让人又爱又恨的东西. 恨它是因为一旦上了贼船,你就很难下船了.爱他是因为它确实能给你带来很大的成就感. 1 和常规的博客不同,公众号的个人品牌属性更强, 而这种品牌是依靠持续不断地输出文 ...

  8. 为什么HikariCP是性能最好的数据库连接池?

    " 这世界上已经有了这么多的.开源的数据库连接池, 为什么要再写一个? 1 这位老兄叫做Brett Wooldridge, 1989年毕业于新奥尔良洛约拉大学,计算机学士(你没看错,确实是1 ...

  9. 在瑞典当码农 :在家上班?不加班?能干到60岁?

    作者:斯京小羊 来源:公众号"爱上瑞典" 写在前面 前段时间,国内IT公司996(朝九晚九一周六天)的上班制度成了人们热议的话题.很多朋友给我留言让我写写瑞典的IT公司工作情况. ...

最新文章

  1. Unity 3D学习视觉脚本无需编码即可创建高级游戏
  2. 把二元查找树转变成排序的双向链表
  3. 将windows 客户机加入msits.com域环境中
  4. oracle声明number变量,oracle – PL / SQL:如何声明会话变量?
  5. 【渝粤教育】 国家开放大学2020年春季 3956★汽车故障诊断技术 参考试题
  6. servlet ehcache beanfactroy c3p0 配置文件
  7. oracle用户有关操作,oracle用户会话操作
  8. java匿名内部类 内部类_java中的匿名内部类详细总结
  9. 【无标题】AMAZINGIC晶焱科技:预防TVS闩锁风险的方法与实际案例分析
  10. Linux系统:page fault
  11. windows10一右击就转圈圈,假死状态解决了
  12. 以太网电缆作为“传输天线”,黑客可从气隙系统窃取数据
  13. 绘图工具-PlantUML
  14. PHP手机版源码下载分期系统源码Thinkphp内核开发集成支付,短信功能,征信对接
  15. 仿支付宝钱包:带分割线的GridView
  16. LATEX编辑高数基础公式
  17. Armadillo配置
  18. Linux内核代码宏定义,Linux Kernel源代码中与段有关的重要宏定义
  19. openwrt路由 ssh后台测网速测速命令
  20. 基坑计算理论m法弹性支点法_基坑支护结构弹塑性计算方法与m法的对比分析

热门文章

  1. A Survey of Shape Feature Extraction Techniques中文翻译
  2. Microsoft 解决方案框架版本 3.0 概述
  3. 【JavaSE】IO流(下)
  4. Django富文本编辑——Ckeditor的配置、使用和踩坑(应该全)
  5. MySQL索引创建、删除及事务控制
  6. jzoj3395 Freda的传呼机
  7. 第二章第四题(将磅转换为千克)(convert pound to kilogram)
  8. fedora34 不显示桌面图标
  9. React Native学习资源汇总
  10. 一键解决2K分辨率下ubuntu图标及文字太小问题