- 大话编程
- 一个故事讲完 https
- C 老头和 Java 小子的硬盘夜话
- 我是一个函数
- 操作系统是个大骗子?
- 90 后 老头儿 和 00 后 Go 小子的硬盘夜话
- 爱炫耀的数据库老头儿
- 浏览器:一个家族的奋斗
- 浏览器家族的安全反击战
- 黑客三兄弟
- 从读写分离到 CQRS,张大胖是如何解决性能问题的?
- 两个程序的爱情故事
- 两个程序的爱情故事(续)
- 烂代码传奇
- 机房夜话
- 干掉状态:从 session 到 token
- 张大胖的 docker 之路
- 从 SOA 到微服务
- XML 的传奇人生
- 从密码到 token, 一个授权的故事
- 编程世界的那把锁
- 加锁还是不加锁,这是一个问题
- 这个动物园, 两年也逛不完
- 张大胖和 CAP 定理
- 一个翻译家族的发家史
- 张大胖和单元测试
- Java 帝国
- 一个著名的日志系统是怎么设计出来的?
- Java 帝国之泛型
- Java 帝国之动态代理
- 从兄弟到父子:动态代理在民间是怎么玩的?
- Java 注解是怎么成功上位的?
- Java EE 要死掉了?
- Java 帝国之宫廷内斗
- Java 帝国之宫廷内斗(2)
- 当世界上只剩下一个 Java 程序员
- 持久化:Java 帝国反击战
- 什么是框架?
- 学习 Java 虚拟机没用? 听听当事人是怎么说的!
- 聊聊 Java 平台上的非 Java 语言
- Java 帝国之消息队列
- Java 帝国之 JMS 的诞生
- Java 帝国之单例设计模式
- 对 Java Inputstream 的一次采访
- ASM: 一个低调成功者的自述
- 序列化: 一个老家伙的咸鱼翻身
- Java IO 的自述
- JDK 先生最近有点烦
- 什么是框架(续)?
- 说 空话,做实事: 谈谈多态
- Kotlin 初体验
- 小白科普
- 小白科普:分布式和集群
- 什么是 Zookeeper?
- 小白科普:悲观锁和乐观锁
- 小白科普:LDAP 有什么用?
- 小白科普:服务那点事儿
- 小白科普:Netty 有什么用?
- 老司机经验
- 后端程序员都做些什么?
- 为什么要学习 HashMap 的底层原理?
- 小心,别被今日头条给困住了!
- 对自己狠一点,开始写作吧
- 开源代码啃不动,不如先定个小目标
- Python 这么简单还用学吗?
- 作为一个有追求的程序员,你应该掌握的七种武器
- 给设计模式说句公道话
- 时间是这么被浪费掉的
- 你真正付出了全部努力了吗?
- 写给初学者:编程的本质
- 在大学期间更应该学习什么?
- 看看 悲催 的码农得学多少东西?
- 学习编程的四兄弟
- 那些年,我后悔没做好的事情
- 我为什么对后端编程情有独钟?
- 当我们在学习编程语言时,我们在学习什么?
- 编程需要多少数学知识?
- 想成为编程高手,一定要学汇编吗?
- 你必须理解的计算机核心概念
- 你的需求是怎么描述的?
- 白话敏捷软件开发
- 人在职场
- 凡事必先骑上虎背,给性格内向的程序员聊几句
- 为什么能力优秀的人当了主管以后反而不行了呢?
- 不想做技术了,还有一条路
- 纪念我最有效率的一次加班
- 书写「简历」时,需要规避的错误。
- 上天还是入地?
- 工作 6 年,半路出家到 CTO
- 只是 Work 还不够,更重要的是 Think
- 我所尊敬的三位女程序员
- 我们向印度人学习什么?
- 你去下家面试,怎么评价你在这家公司做的工作?
想成为编程高手,一定要学汇编吗?
汇编语言这门课, 是我大学的一段灰色记忆。
有很长一段时间,我都搞不明白为什么汇编语言中有各种各样的寻址方式 , 还有为什么叫立即数呢? 它明明就是一个数字啊,起个这么古怪的名称。
老师布置的作业也不复杂, 例如用汇编控制主板的喇叭发声, 在屏幕上输出白底蓝色字、绿底白色字、红底黑色字..... 我都做得非常辛苦, 没记错的话还经常抄同班张同学的作业。
所以我一直对能用汇编语言编程的人充满了敬仰和带点儿嫉妒的敬畏, 尤其是听说求伯君竟然用汇编写出了 WPS! Ken Thompson、Dennis Ritchie 居然用汇编写出操作系统 Unix! 只能是一声叹息,人和人的差距真是大啊。
毕业后对操作系统痴迷,去看 MINIX 的源代码,一开头就被吓住了,在 bootstrap 阶段竟然是通篇的汇编! 在后悔为什么大学没有好好学的同时, 我还特别又买了一本汇编的书《80X86 汇编语言程序设计教程》, 准备把汇编捡起来。
艰苦地复习了一段时间就明白了一点, 操作系统用到的汇编其实和 CPU 密切相关,什么实模式、保护模式, GDT, LDT,数据段,代码段......这些 Intel CPU 的概念如果没搞明白, 根本不可能读懂操作系统的启动过程。
那时候网络上资料很少, 不像现在这么信息爆炸, 我孤独的在 Minix 的世界中挣扎了一段时间就放弃了, 我也许不是搞系统编程的那块料, 从此走向应用层编程之路。
米国那些早期的程序员很幸福, 他们随着计算机的发展而不断前进,经历了完整的从底层编程到高层编程的全过程。 最开始的时候就是直接对硬件编程, 例如比尔盖茨和保罗艾伦就是直接用汇编在牵牛星电脑上写 Basic 的解释器, 那批程序员对硬件和底层的理解是非常的透彻。
虽然我是属于从入门到放弃类型, 但是能深切的体会到学习汇编的好处: 汇编和最底层的硬件打交道( 注意是硬件啊) , 所以学习汇编能对计算机的运行机制有个透彻的了解:
什么是寄存器
程序在内存和 CPU 中是怎么折腾的
CPU 是如何访问内存的
程序的分段
机器层面如何实现函数调用(理解缓冲区溢出攻击的基础)
中断及其处理
......
有了这些知识,肯定对冯诺依曼计算机有了深刻认识。
而这些知识又构成了操作系统的基础, 有了这些基础,理解进程/线程的概念,同步和互斥,以及他们的实现就非常容易,还有虚拟内存、文件系统、 I/O 等等。
并不是说必须学了汇编才能理解操作系统,而是说看问题的深度不一样。 有了汇编的保驾护航, 你可以在头脑中建立起一个有更多细节,更多实现的计算机, 那些概念不是模糊的,而是清晰的、鲜活的。
操作系统的运行原理, 绝对是程序员受益一生的知识。 比如说后端编程,不了解 OS 的进程、线程、 页面缓存,文件系统,I/O 就去大谈如何实现一个高并发、大数据量的网站简直就是笑话。
再比如对 JVM 的学习, 如果你懂得汇编, 看到 JVM 的字节码、看到栈帧就会觉得很亲切,只需要把基于寄存器的计算方式转换成基于栈的计算方式就可以了。
我们的计算机知识就像一座金字塔, 底层是数学, 上面是数字电路,然后是汇编,再往上是操作系统、网络,数据库、高级编程语言、框架等等......
我们每个人不可能精通这个金子塔的每一层, 但是要掌握、理解构成这个金字塔的核心概念。
在应用层编程, 不一定要掌握汇编, 但是掌握汇编能让我们更透彻的看待我们赖以为生的虚拟世界 , 没错, 你要想成为黑客帝国中的 Neo, 汇编必须得学。
我有时候会胡思乱想: 如果这个编程世界根本没有什么 Java, Python, C++, Javascript , PHP, 只有汇编这么一种语言, 像 Rod Johnson(Spring 之父), DHH(Ruby on Rail 之父) , Eric Gamma (JUnit, Eclipse) , Gavin King(Hibernate 之父) 这些在应用层编程的大牛们, 他们用汇编写程序会是什么样子? 他们会创造出什么东西出来?
我想有一点是肯定的: 即使是使用汇编,他们的编程技能仍然会毫不留情的把我碾压成渣渣。 原因很简单, 一个驾驭过复杂系统的人,他的逻辑思维能力肯定是强悍无比的, 汇编只是让他换了一个工具而已。
更可怕的是由于软件极难编写, 只有一帮大牛才有资格编程,才能成为程序员, 像我这样资质平庸者估计只能去搬砖吧。
所以感谢这个时代,有这么多语言让我选择,不用被大牛碾压,还可以靠编程过活。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论