我们知道,我们编写的程序,不管是什么编程语言,最后执行的时候,基本上都是CPU在完成。之所以说基本上,是因为还有GPU、FPGA等特殊情况。
但不知道大家发现没有,我们编程的时候,经常在关注内存问题,比如堆和栈的区别、内存分配与释放、指针问题、内存泄露问题等等,但为什么作为执行程序的核心角色——CPU,我们却很少去关注它呢?
对于这个问题,你是怎么看的,思考5秒钟想想?
下面是我的一些看法。
这其实是编程语言越来越“高级”的结果。
事实上,在几十年前,那时候没有现在这么多高级语言,很多编程大佬们都是徒手写汇编,就必须得关注CPU。
以我们熟知的Intel x86架构为例,思考这几个问题:
长跳和短跳有什么区别?
中断门、任务门、调用门分别是什么,有什么区别?
x86的CPU有哪些常用寄存器,分别是做什么用的?
虚拟地址、逻辑地址、线性地址、物理地址分别是什么,有什么区别?
我的公众号读者很多是搞C/C++和底层软件开发的,估计都很少有人能完整回答出这些问题,更别说其他搞Java、Python、JavaScript的一票程序员了。
但是用汇编语言编程,太伤脑子了,开发效率低不说,更重要的是,辛辛苦苦吭哧吭哧写完,结果换个CPU平台还没法通用。
后来,计算机工程师们开始思考:编程为什么还要考虑CPU?得把这些东西屏蔽掉!所以,高级语言应运而生了,从那时起,程序员们编程基本不用考虑CPU了,这些底层的细节,编译器和操作系统都给封装好了,提供一致的调用接口,我们只需要调用操作系统提供的编程接口就好了。
再后来,程序员们觉得面向操作系统编程也很麻烦,和上面CPU同样的问题,不同操作系统的编程API完全不一样,辛辛苦苦吭哧吭哧写完,结果从Windows换到Linux,又不能用了!
计算机工程师们又开始思考:为什么还要考虑操作系统、内存这些东西?于是直接面向虚拟机、解释器的语言又出来了。
如果你是Java、Python、JavaScript的程序员,想想你在编程的时候会关心操作系统,会关心内存管理吗?
估计以后会有人提问:为什么编程很少关注操作系统了?为什么编程很少关注内存了?
时代在发展,功能封装了一层又一层,现在的程序员,越来越少去关注底层的东西了。
但这也造成的一个后果就是,开发的门槛降的越来越低,不需要学《计算机组成原理》、《操作系统》、《数据结构与算法》这些计算机基础课程,只需要《21天从入门到精通》就可以进入这个行业。
我之前看到过一个报道,最近几年,每年毕业的大学生大概在1000万左右。其中计算机相关专业(包含计算机科学与技术、软件工程、网络工程、通信工程、电子信息工程、自动化等)加起来的人数占比在10%左右,这样算下来每年都有100万左右的新人涌入这个赛道,这还不包括很多其他专业转码的人,加起来只会更多。
这样一想,计算机真的是卷的厉害。
随着越来越多新人的加入,计算机软件开发行业竞争也越来越激烈,只靠CRUD技能很大程度上会限制程序员们在技术领域的发展。而学习了解一些计算机底层技术知识,修炼好程序员的内功,可以帮助我们知其然还能知其所以然,在一众开发中脱颖而出。
所以推荐咱们程序员除了日常工作项目开发工作,多了解一些计算机底层的知识。像是Linux操作系统、计算机网络工作原理、数据库底层原理等等。