`
izuoyan
  • 浏览: 8946860 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)

阅读更多

原文发表在http://www.douban.com/review/2032438/

关于《程序员的自我修养》这本书,最初是在和博文的周筠老师MSN上谈起,当时听周老师提及这本书是一本关于链接和装载等系统软件知识的书籍,当时就很感兴趣,因为这方面的书在国内真的见得很少,一方面这种书似乎跟做应用开发的有距离,毕竟如果只是用用C#、Java,似乎没什么必要关心编译器、链接器在做些什么,特别是那么“老土”的C编译器、链接器,另一方面关于这块的知识水比较深,既要有理论深度(得对操作系统、编译原理等有一定了解和学习),又要有工程基础(得实实在在地去研究过GCC、OS,甚至得去读读它们的源码),同时还得有足够的开发经验,至少得有一定在linux上开发系统软件的基础,这样也就难怪很难见到这种“曲高和寡”的书了。


所以当周筠老师最初推荐我读一遍这本书稿,并告知这本书是两个在校读研的学生写出来的,所以第一感觉对这本书并不抱太大期望,担心这本书又会是一堆理论的堆垒。但在我初初翻看这本书、特别是翻到第二、第三部分时,很是惊讶于其中描写的细致,单是看中间用objdump/readelf分析ELF以及用实际案例来分析和解释符号解析和重定位,就会明白这本书绝不是一本只讲“理论”的形而上,于是决定静下心来仔细阅读,并完成周老师布置给我的“任务”(写些对此书的审阅意见)。


仔细阅读后,深感这本书是一本联系理论和工程的桥梁,本书深入浅出地对系统底层机制进行了拨丝抽茧,让读者清晰地洞悉程序的前世今生,作为程序员,作为喜欢刨根问题的程序员,读这本书我想至少有两个好处,其一自不必说,一本让你洞悉系统如何链接、装载的优秀图书总是可以让你学到很多东西的,其二则在于,本书作者在写作本书中反映出的认真、执着,以及从小处着手的分析阐述方法,委实让我等值得学习,看书中若干的实例和图表,就可以明白作者在写作过程中的心血(听周老师提及这本书是俞甲子等花费两年时间原创)

或许有人会说这本书有点太底层了,对于普通程序员的日常工作好像没什么价值,这里我想举个自己的例子来证明理解系统底层的概念是多么重要。当时我们项目(linux平台,gcc开发)中使用到一个第三方library(没有source code),我们的项目是在RHAS4(gcc3.4)上编译的,而library是在Redhat9(gcc2.96)上编译,但library的接口都是标准的C接口,而且按理说gcc的C++对象模型在不同版本间也没什么差异,所以应该可以安全地使用这个library,但结果很不幸地程序crash了,而且是crash在奇怪的STL string函数中,事后的分析证明了那是由于STL模板的弱符号导致符号解析错误,不同的STL库(主程序和library调用了不同的STL)中的函数被覆盖而导致。如果不对linux里弱符号(本书3.5.5,弱符号与强符号)、符号表(本书7.5.3,动态符号表)、符号解析(本书4.2.3,符号解析)等有足够的了解,遇到这样的crash我想一定会抓狂的。此外像soname、动态链接器等,这些对于在linux下开发都是些很必备的知识。


最后还是说点对这本书的一些负面意见吧;-)


首先就是书名了,个人不是太喜欢这个主标题,似乎有点太高了,其实我觉得周老师最初给我看的那个书名《深入理解计算机系统软件》要更贴切些,不太明白为什么最后会改名;-)


其次,从个人角度来看,我觉得这本书对windows部分的介绍不是太必要,其实我更希望这本书能够更深入更全面地对linux的链接和装载进行介绍,比如在多加些linux进程管理、C++及template对编译和链接的影响、gcc的c library更详尽的分析(本书第四部分的crt看起来还是更偏“教学”目的了)等等,可能这样会更专注,当然也可能会丢失一些windows读者,不过也可以把windows的内容另成一书;-)呵呵,这些说来容易,但那又是何等地心血。


好吧,从内容上,这本书一定值得你一翻,就算你不通读,把第二、第三部分仔细读读一定会很有收获,如果你对系统的机理感兴趣,特别是,如果你是linux C/C++程序员,我如是推荐。


此外,从书籍的装裱上,博文一贯的高标准让此书不论是封面、纸张,还是排版,都堪称一流,当属一本可撑台面的书架点缀;-)

分享到:
评论

相关推荐

    VR-Drumming:开发了一个VR应用程序,指导用户演奏鼓组

    虚拟现实鼓开发了一个VR应用程序,指导玩家如何演奏鼓组团队成员: 邹飞李根苏洋杨爱宁刘梦华屏幕截图: 教程模式GIF :项目描述从以下几个方面开发了用于仿真的虚拟环境: 高保真鼓组高保真鼓槌中度保真椅子低保真...

    工艺计算MBBR.xls

    污水处理计算书

    object-tracking.zip

    object-tracking.zip

    pyopenjtalk-0.3.3

    win10/win11下使用, 包含pyopenjtalk-0.3.3-cp39-cp39-win_amd64.whl,pyopenjtalk-0.3.3-cp310-cp310-win_amd64.whl,pyopenjtalk-0.3.3-cp311-cp311-win_amd64.whl三个版本的whl文件,解决GPT_SoVITS中pip install安装pyopenjtalk失败。

    613155687470549安卓鸿蒙手机版_10.7.6.6.apk

    613155687470549安卓鸿蒙手机版_10.7.6.6.apk

    初识Flask的md格式文件

    初识Flask的md格式文件

    基于stm32f103C8T6智能台灯设计与制作

    本次设计是系统介绍了智能台灯的应用背景、设计原理、软硬件电路等。以STM32作为主控,应用定时模块、人体感应模块、光敏模块,使得智能台灯具备调光,监督使用者的坐姿,节能,时间提醒等功能。有五级自动、手动灯光。ds1302实时时钟模块、HCSR04超声波模块、dht11温湿度模块、HCSR501人体感应模块、光敏电阻模块和无源蜂鸣器模块。

    基于matlab实现模拟退火算法计算函数最小值以及SVM参数寻优.rar

    基于matlab实现模拟退火算法计算函数最小值以及SVM参数寻优.rar

    麦肯锡-工具与方法工作手册gl.ppt

    麦肯锡-工具与方法工作手册gl.ppt

    客流量预测.rar客流量预测.rar客流量预测.rar

    客流量预测.rar客流量预测.rar客流量预测.rar

    基于VB+access实现大气污染模型(系统+翻译+论文+开题).zip

    【项目资源】:基于VB+access实现大气污染模型(系统+翻译+论文+开题).zip 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    ASP+ACCESS网上远程教育网毕业设计(调研报告+源代码+设计说明书+答辩).zip

    ASP+ACCESS网上远程教育网毕业设计(调研报告+源代码+设计说明书+答辩).zip

    基于matlab实现脑电信号分析MATLAB工具箱,是做信号处理的必备工具,尤其针对生物医学信号处理.rar

    基于matlab实现脑电信号分析MATLAB工具箱,是做信号处理的必备工具,尤其针对生物医学信号处理.rar

    dephi+sqlserver2000题库与试卷生成系统.zip

    dephi+sqlserver2000题库与试卷生成系统.zip

    ASP+ACCESS学生信息管理系统设计(源代码+设计说明书).zip

    ASP+ACCESS学生信息管理系统设计(源代码+设计说明书).zip

    CD销售管理系统JSP+SQL(源代码+设计说明书+英文文献).zip

    CD销售管理系统JSP+SQL(源代码+设计说明书+英文文献).zip

    AO工艺设计计算.xls

    污水处理计算书

    node-v12.21.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v10.21.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    ASP+ACCESS房产信息管理系统(源代码+设计说明书).zip

    ASP+ACCESS房产信息管理系统(源代码+设计说明书).zip

Global site tag (gtag.js) - Google Analytics