本书以图解的方式通俗易懂的讲解计算机系统中各项技术的本质,包括编程语言的本质是什么、操作系统、进程线程协程等的本质是什么、到底什么是内存、什么是堆区栈区、内存分配等是怎么一回事、怎样从晶体管构建出CPU、I/O是如何实现的等等,从根源出发,一步步讲解一项技术到底是怎么来的,同时内容可视化——辅助大量精心设计的插图,几乎做到了平均一页有一图,把对技术的理解门槛降到最低。
前言
本书源自笔者的两个疑问:我的代码看上去能正常运行,可这是为什么呢?计算机在执行我写的代码时在底层发生了什么?
现代计算机系统的结构就像一个汉堡包一样,实际上是被层层抽象过的,程序员在最上层用高级语言编写代码时根本不用关心底层细节,这极大地提高了开发效率,但有时遇到一些较为棘手的问题,很多人往往束手无策,这其中大部分情况是因为对底层了解不够而导致的,我们有时甚至都不能理解产生的问题本身,更何谈解决问题呢?
这些看上去很难解决的问题在那些编程高手眼里往往不值一提,他们几乎能脱口而出直指本质,你一两天都搞不定的问题在这些编程高手那里可能会被瞬间解决掉,因为他们对自己写下的每一行代码到底会对计算机系统产生什么样的影响了如指掌,如他们非常清楚地知道分配一块内存在底层发生的一系列故事等。英文中有一个词很形象—— mental model (心智模型),本书更多地为你揭示那些编程高手的心智模型和计算机系统 底层的奥秘。
在讲解方式上,首先笔者认为内容可视化非常重要,一图抵千言,因此本书中有多达341张图,以图解的方式来讲解所涉及的内容;其次内容的可读性也很重要,本书会 以通俗易懂的方式从概念的起源开始讲解,不仅告诉你是什么、为什么,还会告诉你这是怎么来的,把对内容阅读理解的门槛降到最低。
当然,除了上述较为“功利”的目的,笔者认为有趣的东西还是值得了解一下的,计算机系统其实就是这样一个很有趣的东西,如果你不这么认为的话,那么很可能是你 还不够了解它。计算机系统中的许多设计是如此的有趣,即便是出于好奇,也应该去了 解一下,就像 Linus 所说的那样——Just for fun !
本书配套资料
一款操作系统发布后往往需要打补丁、定时升级,而一本书的出版往往与之类似,由于笔者能力有限,因此在本书出版后可能也需要打补丁,在微信公众号“码农的荒岛求生”后台回复“补丁”二字可获取笔者关于本书相关话题的扩展内容,相信这些内容 可以更好地帮助读者理解本书。
路线图
本书分为6章:
● 第1章关注编程语言,重点阐述到底什么是编程语言、编译器的工作原理,以及如何从代码生成最终的可执行程序。
● 第2章重点讲解程序运行起来后,也就是运行时的奥秘,包括程序到底是以什么样的形式运行起来的,操作系统、进程、线程、协程到底是什么,我们为什么需要了解这些概念,回调函数、同步、异步、阻塞、非阻塞又是怎么一回事,这些又能赋予程序员什么样的能力等。
● 第3章将带你认识内存。程序的运行离不开内存,因此我们要了解内存的本质是什么,到底什么是指针,为什么会有堆区、栈区,函数调用的实现原理是什么,申请内存时底层到底发生了什么,该怎样实现一个自己的malloc内存分配器等。
● 第4章介绍计算机系统中最重要的CPU,CPU的实现原理是什么,怎样一步步打造出CPU,CPU是如何认识数字的,CPU空闲时在干什么,以及CPU是如何演变进化的,为什么会出现复杂指令集及精简指令集,如何利用CPU与栈的组合实现函数调用、中断处理、线程切换及系统调用等机制。
● 第5章讲解计算机系统中的cache,为什么需要cache,以及程序员该如何编 写出对cache 友好的代码。
● 第6章关注I/O,计算机系统是如何实现I/O的,程序员调用read函数时在底层是如何一步步读取到文件内容的,程序员该如何高效处理I/O等。
勘误
由于笔者水平有限,书中难免会有疏漏之处,恳请广大读者批评指正。
在微信公众号“码农的荒岛求生”底部菜单栏中有一项关于本书勘误的菜单入口,读者可通过此渠道查看本书的bug或者反馈问题。
致谢
首先感谢微信公众号“码农的荒岛求生”的忠实读者,是你们让我一直坚持到现在,是你们让我能感受到自己做的事情是有价值的,是你们让本书出版成为可能。
其次特别感谢我的爱人,是你的鼓励让我踏上了写作之路,在此之前我从没想过自己此生会与写作有什么关联,是你让我发现了全新的自己,这无异于重生。
最后感谢我的父母,是你们的辛苦付出让我远离生活琐事。“当你轻装上阵时必定 有人为你负重前行”,我无以为报,谨将此书献给你们。
陆小风(@码农的荒岛求生),硕士毕业于北京航空航天大学计算机学院,先后就职于VMware和京东,具有多年软件系统研发经验,擅长用通俗易懂的语言讲解计算机技术。