编辑推荐
日文版重印41次!
“计算机组成原理”图解趣味版
蹲马桶就能看懂的编程基础知识
如何向小学生讲解CPU和二进制?
如何向中学生讲解内存和磁盘?
如何向女高中生讲解操作系统的原理?
如何向老奶奶说明显示器和电视的不同?
如果你完全没有思路,就应该读一读这本书。
以图配文,深入讲解编程基础知识
语言通俗,即使是文科生也能看得懂
特设“如果是你,你会怎么做?”专栏,生动有趣
内容简介
《图灵程序设计丛书:程序是怎样跑起来的》一书从计算机的内部结构开始讲起,以图配文的形式详细讲解了二进制、内存、数据压缩、源文件和可执行文件、操作系统和应用程序的关系、汇编语言、硬件控制方法等内容,目的是让读者了解从用户双击程序图标到程序开始运行之间到底发生了什么。同时专设了“如果是你,你会怎样介绍?”专栏,以小学生、老奶奶为对象讲解程序的运行原理,颇为有趣。《图灵程序设计丛书:程序是怎样跑起来的》图文并茂,通俗易懂,非常适合计算机爱好者及相关从业人员阅读。
作者简介
矢泽久雄,YAZAWA股份有限公司董事长兼总经理。GrapeCity信息技术集团顾问。电脑作家之友会会长。
曾在某大型电子公司从事过电脑生产,在SoftwareHouse做过程序员,现主要从事软件包的开发工作。工作之余笔耕不缀,从电路到编程语言均有涉及。代表作有《计算机是怎样跑起来的》《使用C语言学习程序设计的基础》《征服C++类和继承》等。自称软件艺人。
李逢俊,北京易网联信信息技术有限公司CEO。
哈尔滨工业大学硕士毕业后在日工作8年,曾在日本知名游戏公司担任移动互联网部门负责人,拥有丰富的移动游戏开发及运营经验。2011年回国创业,创建易网联信团队,致力于精品手机游戏的开发及运营。
内页插图
目录
第1章 对程序员来说CPU是什么
1.1 CPU的内部结构解析
1.2 CPU是寄存器的集合体
1.3 决定程序流程的程序计数器
1.4 条件分支和循环机制
1.5 函数的调用机制
1.6 通过地址和索引实现数组
1.7 CPU的处理其实很简单
第2章 数据是用二进制数表示的
2.1 用二进制数表示计算机信息的原因
2.2 什么是二进制数
2.3 移位运算和乘除运算的关系
2.4 便于计算机处理的“补数”
2.5 逻辑右移和算术右移的区别
2.6 掌握逻辑运算的窍门
COLUMN如果是你,你会怎样介绍?--向小学生讲解CPU和二进制
第3章 计算机进行小数运算时出错的原因
3.1 将0.1 累加100次也得不到10
3.2 用二进制数表示小数
3.3 计算机运算出错的原因
3.4 什么是浮点数
3.5 正则表达式和EXCESS系统
3.6 在实际的程序中进行确认
3.7 如何避免计算机计算出错
3.8 二进制数和十六进制数
第4章 熟练使用有棱有角的内存
4.1 内存的物理机制很简单
4.2 内存的逻辑模型是楼房
4.3 简单的指针
4.4 数组是高效使用内存的基础
4.5 栈、队列以及环形缓冲区
4.6 链表使元素的追加和删除更容易
4.7 二叉查找树使数据搜索更有效
第5章 内存和磁盘的亲密关系
5.1 不读入内存就法运行
5.2 磁盘缓存加快了磁盘访问速度
5.3 虚拟内存把磁盘作为部分内存来使用
5.4 节约内存的编程方法
5.5 磁盘的物理结构
第6章 亲自尝试压缩数据
6.1 文件以字节为单位保存
6.2 RLE算法的机制
6.3 RLE算法的缺点
6.4 通过莫尔斯编码来看哈夫曼算法的基础
6.5 用二叉树实现哈夫曼编码
6.6 哈夫曼算法能够大幅提升压缩比率
6.7 可逆压缩和非可逆压缩
COLUMN如果是你,你会怎样介绍?--向沉迷游戏的中学生讲解内存和磁盘
第7章 程序是在何种环境中运行的
7.1 运行环境=操作系统+硬件
7.2 Windows克服了CPU以外的硬件差异
7.3 不同操作系统的API不同
7.4 FreeBSDPort帮你轻松使用源代码
7.5 利用虚拟机获得其他操作系统环境
7.6 提供相同运行环境的Java虚拟机
7.7 BIOS和引导
第8章 从源文件到可执行文件
8.1 计算机只能运行本地代码
8.2 本地代码的内容
8.3 编译器负责转换源代码
8.4 仅靠编译是法得到可执行文件的
8.5 启动及库文件
8.6 DLL文件及导入库
8.7 可执行文件运行时的必要条件
8.8 程序加载时会生成栈和堆
8.9 有点难度的Q&A;
第9章 操作系统和应用的关系
9.1 操作系统功能的历史
9.2 要意识到操作系统的存在
9.3 系统调用和高级编程语言的移植性
9.4 操作系统和高级编程语言使硬件抽象化
9.5 Windows操作系统的特征
COLUMN如果是你,你会怎样介绍?--向超喜欢手机的女高中生讲解操作系统的作用
第10章 通过汇编语言了解程序的实际构成
10.1 汇编语言和本地代码是一一对应的
10.2 通过编译器输出汇编语言的源代码
10.3 不会转换成本地代码的伪指令
10.4 汇编语言语法是“操作码+操作数”
10.5 最常用的mov指令
10.6 对栈进行push和pop
10.7 函数调用机制
10.8 函数内部的处理
10.9 始终确保全局变量用的内存空间
10.1 0临时确保局部变量用的内存空间
10.1 1循环处理的实现方法
10.1 2条件分支的实现方法
10.1 3了解程序运行方式的必要性
第11章 硬件控制方法
11.1 应用和硬件关?
11.2 支撑硬件输入输出的IN指令和OUT指令
11.3 编写测试用的输入输出程序
11.4 外围设备的中断请求
11.5 用中断来实现实时处理
11.6 DMA可以实现短时间内传送大量数据
11.7 文字及图片的显示机制
COLUMN如果是你,你会怎样介绍?--向邻居老奶奶说明显示器和电视机的不同
第12章 让计算机“思考”
12.1 作为“工具”的程序和为了“思考”的程序
12.2 用程序来表示人类的思考方式
12.3 用程序来表示人类的思考习惯
12.4 程序生成随机数的方法
12.5 活用记忆功能以达到更接近人类的判断
12.6 用程序来表示人类的思考方式
COLUMN如果是你,你会怎样介绍?--向常光临的酒馆老板讲解计算机的思考机制
附录让我们开始C语言之旅
C语言的特点
变量和函数
数据类型
标准函数库
函数调用
局部变量和全局变量
数组和循环
其他语法结构
前言/序言
大家还记得自己初次接触计算机时的情形吗?想必多数读者使用的都是Windows系统,应该也有不少读者使用VisualStudio和Java等集成开发环境(IDE,Integrated Development Environment,即集成了编程所需的各种工具的开发软件)开发过程序。Windows的图形化操作界面,大大提高了计算机操作的便利性,而利用集成开发环境开发程序,就像用绘图软件画图一样简单。由此可见,这是一个便利的时代。
然而,现实却不容乐观,我们在享受这些方便的同时也付出了代价。虽然拥有一定的编程能力,却无法进一步提高自身技能;知识应用能力的不足导致无法编写源程序。越来越多的程序员正为这些问题而烦恼。个中原因在于,大家不了解程序运行的根本机制。
“双击程序图标,程序开始运行”,作为一名程序员,对程序的了解仅仅停留在这一表层是不行的。我们还应该了解更深层的机制:加载到内存中的机器语言程序,由CPU进行解析和运行,进而计算机系统整体的控制和数据运算也开始运行。了解了程序的运行机制后,就能找到编写源程序的方法。
本书以通俗易懂的方式来解析程序的运行机制,适合想要学习编程的读者,迫切希望提升技能的初级程序员,以及对计算机较为熟悉的中级用户阅读。为了便于说明,书中涉及了不少计算机硬件知识,不过本书的主题依然是编程,也就是软件。
《日经Software》杂志上连载过名为“程序是怎样跑起来的”的文章,而本书就是在整合以上内容的基础上创作的。2001年10月,本书第1版出版后,受到了众多读者的欢迎,我们也收到了很多反馈信息。
大部分读者表示“了解了CPU的寄存器和内存的运行方式,也知道了自己编写的程序的运行机制”,收获颇丰。不过也有编程经验较少的读者表示“内容有点难”。
值此第2版出版之际,我再次核对了全文,大幅增加了寄存器和栈等内容的相关说明,并作了详细的注释。实例程序的代码也由原来的VisualBASIC语言,换成了更便于说明程序运行机制的C语言,并在书的末尾添加了一个辅助章节,对C语言进行了简单的介绍。通过这样的改动,相信即便是觉得第1版有点难的读者,也会感到满意。
无论任何事情,了解其本质非常重要。只有了解了本质才能提高利用效率。这样一来,即使有新技术出现,也能很容易地理解并掌握。接下来,就让我们一起在本书中探索程序的奥秘,寻求程序的本质吧。
矢沢久雄
《软件构建艺术:从代码到产品的飞跃》 一、 揭示软件的本质:理解冰山下的运行机制 你是否曾疑惑,你手中的智能手机、每天使用的应用程序、甚至驱动庞大互联网的复杂系统,它们究竟是如何从一堆看似杂乱无章的代码,最终变成能够触及我们生活方方面面的强大工具?《软件构建艺术:从代码到产品的飞跃》这本书,将带你深入探索这个问题的核心,揭示软件的本质,理解冰山下的运行机制。 我们习惯于享受软件带来的便利,却很少去思考其背后的构造。这本书并非单纯的编程语言教程,也不是关于算法的炫技展示。它更侧重于软件的“生命周期”和“架构思维”,从宏观层面剖析软件是如何从一个抽象的概念,一步步落地,最终成为一个稳定、高效、可维护的产品的。 我们将从最基础的概念开始,探讨“程序”的定义,它不仅仅是一系列指令的集合,更是解决问题的逻辑载体。我们会深入理解“代码”作为人类与机器沟通的桥梁,其背后蕴含的严谨性和艺术性。你将看到,每一行代码都凝聚着开发者的思考和设计,它们如何被组织、被调度,最终共同协作完成复杂的任务。 书中最引人入胜的部分,便是对软件“运行”过程的细致描绘。我们将超越“输入-处理-输出”的简单模型,去理解程序在计算机内部的真实旅程。这包括: 编译与解释的魔术: 探讨高级语言如何被转化为机器能够理解的低级语言,以及编译型和解释型语言各自的优劣,理解代码从“文本”到“可执行文件”的演变过程。 内存的奥秘: 深入剖析程序运行时所占据的内存空间,理解栈(Stack)、堆(Heap)等概念,以及内存分配、回收的机制,这是程序能够高效运转的基础。 进程与线程的协作: 学习如何将庞大的任务分解成更小的单元,并让它们并行或并发执行,理解进程、线程的区别与联系,以及它们在多任务环境下的协调工作。 操作系统作为舞台: 认识到操作系统在软件运行中的关键作用,它是资源的调度者,是程序的管理者,理解操作系统如何为软件提供运行环境,并处理硬件交互。 数据在流动: 追踪程序运行时数据的产生、传输、存储和销毁,理解数据结构如何影响程序的效率,以及各种数据传输协议在网络通信中的作用。 通过这些深入浅出的讲解,你将能够建立起对软件运行原理的全面认知,摆脱“黑箱”的困惑,真正理解软件是如何“跑起来”的。 二、 构建坚实的基石:软件设计的艺术与原则 仅仅理解软件如何运行是远远不够的,一个优秀的产品背后,必然有着精妙的软件设计。这本书将引导你进入软件设计的殿堂,学习如何构建出既能满足当前需求,又具备未来扩展性的高质量软件。 我们将深入探讨以下软件设计的重要方面: 架构思维的培养: 学习如何从整体上规划软件的结构,理解不同的架构模式(如微服务、单体应用、事件驱动架构等)的适用场景与权衡。我们将分析优秀架构的特点:模块化、低耦合、高内聚,以及它们如何保证软件的可维护性和可扩展性。 SOLID 原则的实践: 深入理解面向对象设计中的五大基本原则(单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则),并学习如何在实际编程中灵活运用它们,避免设计陷阱,写出更易于理解和修改的代码。 设计模式的智慧: 介绍并解析一系列经典的设计模式,如工厂模式、单例模式、策略模式、观察者模式等。这些模式是前人智慧的结晶,能够帮助我们解决软件开发中反复出现的设计问题,提高代码的可重用性和灵活性。本书将通过丰富的案例,展示设计模式如何在实践中发挥作用,避免“生搬硬套”。 数据结构与算法的基石: 虽然本书不是纯粹的算法书籍,但会强调数据结构和算法在软件设计中的重要性。我们将探讨不同数据结构(如链表、树、图、哈希表等)的特性和适用场景,以及常用算法(如排序、查找、图遍历等)如何影响程序的性能。理解这些基础知识,是做出高效设计的前提。 接口设计的艺术: 强调清晰、简洁、易于使用的接口设计,无论是模块间的接口,还是对外提供的API。我们将讨论接口的契约精神,以及如何通过良好的接口设计,降低模块间的依赖,提高系统的灵活性。 通过对这些设计理念和实践的深入学习,你将能够从“写出能运行的代码”晋升到“写出高质量、易于维护、易于扩展的代码”。这本书的目标是培养你的“工程思维”,让你在面对复杂问题时,能够有条不紊地进行设计和实现。 三、 迈向产品化:软件工程的实践与管理 软件的生命力在于其能够转化为一个真正可用的产品,并持续地服务于用户。《软件构建艺术:从代码到产品的飞跃》将带领你了解软件从开发到发布的完整流程,以及在这个过程中所涉及的工程实践和管理方法。 我们将触及以下关键领域: 开发流程的演进: 介绍敏捷开发、Scrum、Kanban等现代软件开发方法论,理解它们如何提高团队协作效率,缩短开发周期,快速响应市场变化。 版本控制与协作: 深入理解 Git 等版本控制系统的强大功能,学习如何进行代码的提交、分支管理、合并,以及团队间的有效协作,确保代码的安全和一致性。 自动化构建与测试: 探讨持续集成(CI)和持续交付(CD)的理念,了解如何利用自动化工具(如 Jenkins、Docker 等)来构建、测试和部署软件,大幅提高开发效率和产品质量。我们将重点讲解单元测试、集成测试、端到端测试的重要性,以及如何编写有效的测试用例。 代码质量的保障: 强调代码审查、静态代码分析工具的应用,以及如何建立编码规范,确保代码的可读性、可维护性和健壮性。 部署与运维: 了解软件发布到生产环境的常见策略,如蓝绿部署、金丝雀发布等,并初步接触软件监控、日志分析等运维知识,理解如何保障软件在生产环境的稳定运行。 项目管理的基础: 简要介绍软件项目管理中的关键要素,如需求管理、任务分解、进度跟踪、风险管理等,理解一个成功的软件项目是如何被规划、执行和交付的。 这本书的目标,是将你从一个仅仅会编写代码的“开发者”,蜕变成一个能够独立构建、交付并维护高质量软件产品的“软件工程师”。它为你提供的是一套完整的“工程思维”和“实践工具箱”,让你在软件开发的道路上,能够走得更远,飞得更高。 《软件构建艺术:从代码到产品的飞跃》,不仅仅是一本书,更是一次深入的探索之旅,一次思维的升华。它将为你打开一扇通往软件世界深处的大门,让你真正理解软件的灵魂,掌握构建卓越软件的艺术。无论你是初入编程殿堂的学生,还是希望提升自身技能的在职开发者,这本书都将是你不可或缺的良师益友。