5.7 除法器的优化

计算机组成

5 乘法器和除法器

5.7 除法器的优化

屏幕快照 2018-07-09 11.25.51

我们现在的这个除法器已经可以正常的工作了。但是距离实用还有相当大的距离,必须要经过优化,不过除法的优化就比较复杂。因此,在这一节,我们只是对它的优化方法和优化的方向做一个非常基本的探讨。

屏幕快照 2018-07-09 11.26.00

这是我们已经有了的这一版除法器,我们不妨称之为第一版的实现。在这个除法器当中,有一个64位的余数寄存器;一个64位的除数寄存器;一个32位的商寄存器和一个64位的ALU。

屏幕快照 2018-07-09 11.26.09

那我们首先来考虑面积方面的优化,我们先来看看在哪些地方存在着浪费。

首先,我们的除数是只有32位的,而我们的除数寄存器使用了64位的,实际只使用了其中的一半,这是第一个可以优化的点。

第二,商寄存器在初始化的时候是空的,每执行完一轮会产生移位,从右向左逐位填满。所以,这里也存在着浪费的情况。

第三,余数寄存器初始时是满的,也就是最开始的被除数。但是,在不断进行和除数的减法之后这个余数会变得越来越小,它有实际意义的位从左往右在逐渐地减少。所以,越往后,余数寄存器当中浪费的位就会越多。

那我们就尝试从这三个方面进行面积上的优化。

屏幕快照 2018-07-09 11.26.20

那我们把经过面积优化的除法器称为第二版,我们就来看一看第二版的除法器是什么样的。为了方便对比,我们把优化方案和原来结构的描述放在一起。

首先,原先有一个64位的除数寄存器,现在我们将除数寄存器缩小为32位,因为除数本来就是32位的,所以这样除数寄存器就没有了浪费的情况。但是我们要注意,除数寄存器是在整个运算过程中一直要使用的,它的移位只是为了和余数寄存器进行对齐,以方便运算。所以,原先才准备了一个64位的寄存器,以便于除数在移位的过程中也不会丢失。那现在将它缩小为32位了,就不能再有移位的功能,否则其中有效位就会丢失了。因此,这个除数寄存器也就不用再支持移位功能。那么在运算中需要将除数和余数进行对齐的这项功能,就得放到别的地方来完成了。

第二,我们知道原来有一个32位的商寄存器,它一开始是空的,在运算的过程中逐位填满。那既然它一开始没有用,所以我们干脆先取消这个寄存器,再看一看可不可以在别的地方实现类似的功能。

第三,原来有一个64位的ALU。而我们知道,实际参与运算的其中一个操作数是除数,另一个操作数则是余数寄存器当中和除数对应的一些位,实际上只有32位。所以,我们就将这个64位的ALU缩小为32位,也就是说只要让其中有效位数参与运算。

那么对于余数寄存器,或者说一开始是被除数的这个寄存器,它在和除数进行减法运算时,最开始只有最高的32位参与运算,之后才逐次地往低位移动。所以,我们先规定这个余数寄存器只有高32位参与这个加减法运算,我们也在这个余数寄存器当中画一条半透明的线作为标记,而整个余数寄存器仍然保留为64位,其中的高32位被连接到ALU的一个输入,而ALU的输出也连接到了余数寄存器的高32位。

但是,原来除数寄存器是带有右移的功能,从而实现了余数寄存器中参与运算的数逐渐向低位移动这样一个情况,那现在除数寄存器已经不能右移了。与之相对,余数寄存器那就得支持一个左移的功能,而且我们再去回顾除法的运算过程可以发现,余数或者说被除数的高位一旦退出了运算,就不再会有机会重新参与运算了。所以,把余数寄存器的高位向左移位,并将移出的位丢弃,是不会对运算的过程造成影响的。所以,我们将余数寄存器加上左移的功能。而实际上我们发现,现在这个余数寄存器不仅支持左移,还支持右移的功能。为什么支持左移?刚才我已经介绍了;而为什么支持右移呢?就留给大家自己来思考。

当然,什么时候进行移位需要由控制逻辑进行控制。所以,在余数寄存器上也需要有相应的控制输入。那现在我们要注意的是,余数寄存器的浪费问题仍然没有解决。随着运算的进行,每一轮余数寄存器都会向左移位一次,它的右边则会多空出一位来,而且空出的位会越来越多。那么我们回头来看一看,其中我们还需要一个32位的商寄存器,而且这个商在运算的一开始是不需要占据任何空间的,只需要每一轮采用左移的方式,给它多分配一个比特就可以了。那就正好是余数寄存器现在所浪费的情况,我们就可以很自然地将商寄存器合并到余数寄存器当中。让每一轮产生的商,从余数寄存器的右端逐个移入。这样当运算结束时,商就占据了余数寄存器的低32位,而余数寄存器的高32位,则是最后真正的余数。这样再连上对应的控制逻辑之后,我们就有了一个经过面积优化的除法器。

那么在实现了面积优化之后,我们就要考虑在性能上是否可以进行优化。

屏幕快照 2018-07-09 11.26.30

想进行除法器的性能优化,我们就要先来回顾乘法是如何进行优化的。其实现在的乘法器可以做到非常好的优化,这和乘法运算自身的特点是分不开的。

我们来看之前提到过的例子,仔细分析就可以发现,虽然乘法和除法都要产生很多中间的结果,也都需要通过移位等操作进行对齐,再进行最后的运算。但是很大的不同在于,乘法的每一个中间结果都是独立的,每一个中间结果,要么和被乘数相等,要么是0,而且它究竟是哪一种?只由乘数当中固定的一位决定,不受其它位的影响。所以,如果我们人工进行乘法的计算,当我们有了被乘数和乘数之后,可以交给很多人来协作运算。每个人只计算其中一个中间结果,然后再由一些人将这些中间结果加起来,这样就可以通过并行的计算大幅度地提高性能。

屏幕快照 2018-07-09 11.26.40

而我们来看除法的这个工作流程,中间有一个检查余数的工作,而且当余数小于0时,还需要回退第一步的操作。这实际上就是因为除法的这些中间结果并不是各个独立的。那我们可能会想到,乘法的那个流程图当中,不也有一个要进行检查的分支操作吗?看上去和除法这个流程图是非常相似的。那么,不妨把乘法的这个流程图找出来仔细地看一看。

屏幕快照 2018-07-09 11.26.50

的确。在开始的这个地方确实有一个检查乘数寄存器的最低位的操作,并且根据检查结果的不同会走向两个不同的分支。但是,我们仔细分析就会发现,这个分支实际上是不存在的。因为当最低位为1时,会执行将被乘数寄存器和乘积寄存器相加,这样一个操作。那么我们不妨可以理解为,将被乘数寄存器的内容和乘数寄存器的最低位进行一个”与操作“,然后再和乘积寄存器相加,因为现在乘数寄存器的最低位是1,任何数和1进行”与操作“,结果还是这个数本身,所以,这样的改动并不会影响这里的操作;而对于这一边,当最低位为0时,如果我们也做同样的操作,也就是将乘数寄存器的最低位和被乘数寄存器先进行”与操作“,然后再和乘积寄存器相加,因为任何数和0进行”与操作“,结果都是0,0再和乘积寄存器相加,那就相当于没有执行加法操作,乘积寄存器的内容并没有改变。所以,实际上我们可以将这个分支取消,在每轮的最开始都直接将乘数寄存器的最低位和被乘数寄存器进行”与操作”,然后和乘积寄存器相加。这样无论最低位是1,还是0,都能完成这个工作流程图所表达的工作。

屏幕快照 2018-07-09 11.27.00

那即使对于这个优化后的工作流程,效果也是一样的。因为第一步的检查之后,2和3这两步操作都会执行,唯一的区别在于1a这个操作。所以,采用刚才所描述的那种修改(前一个图片提供的修改方案,引入“与操作”),也可以达到同样的效果。因此,对于这个工作流程来说,在实际的实现当中也可以不存在这个分支的操作。

屏幕快照 2018-07-09 11.27.10

然而对于除法的这个工作流程,这一次减法的运算结果是事先无法预知的。因此,无法预知下一步将执行哪一个分支,而且其中一种分支还需要将这个减法操作进行回退。所以,也没有办法将两个分支进行合并。因此,在这个除法运算流程的大框架之下,是很难进行进一步的性能优化了。

屏幕快照 2018-07-09 11.27.19

正是由于除法的优化非常的困难,因而也引来了很多人对除法进行深入的研究,也产生了很多很有趣的,快速除法的实现方法。如果你对此有兴趣,可以进一步深入地探索。

转载于:https://www.cnblogs.com/houhaibushihai/p/9283329.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 V 第1版序 XVII 前言 XIX 作者简介 XXIII 第1章 基础 A1 1 1.1 Scala解释器 1 1.2 声明值和变量 4 1.3 常用类型 5 1.4 算术和操作符重载 7 1.5 关于方法调用 8 1.6 apply方法 9 1.7 Scaladoc 11 练习 16 第2章 控制结构和函数 A1 19 2.1 条件表达式 20 2.2 语句终止 22 2.3 块表达式和赋值 22 2.4 输入和输出 23 2.5 循环 25 2.6 高级for循环 27 2.7 函数 28 2.8 默认参数和带名参数 L1 29 2.9 变长参数 L1 29 2.10 过程 31 2.11 懒值 L1 31 2.12 异常 32 练习 35 第3章 数组相关操作 A1 39 3.1 定长数组 39 3.2 变长数组:数组缓冲 40 3.3 遍历数组和数组缓冲 41 3.4 数组转换 42 3.5 常用算法 44 3.6 解读Scaladoc 45 3.7 多维数组 47 3.8 与Java的互操作 48 练习 49 第4章 映射和元组 A1 53 4.1 构造映射 53 4.2 获取映射中的值 54 4.3 更新映射中的值 55 4.4 迭代映射 56 4.5 已排序映射 57 4.6 与Java的互操作 57 4.7 元组 58 4.8 拉链操作 59 练习 60 第5章 类 A1 63 5.1 简单类和无参方法 63 5.2 带getter和setter的属性 64 5.3 只带getter的属性 67 5.4 对象私有字段 68 5.5 Bean属性 L1 69 5.6 辅助构造器 71 5.7 主构造器 72 5.8 嵌套类 L175 练习 78 第6章 对象 A1 81 6.1 单例对象 81 6.2 伴生对象 82 6.3 扩展类或特质的对象 83 6.4 apply方法 84 6.5 应用程序对象 85 6.6 枚举 86 练习 87 第7章 包和引入 A1 91 7.1 包 91 7.2 作用域规则 93 7.3 串联式包语句 95 7.4 文件顶部标记法 95 7.5 包对象 96 7.6 包可见性 97 7.7 引入 97 7.8 任何地方都可以声明引入 98 7.9 重命名和隐藏方法 99 7.10 隐式引入 99 练习 100 第8章 继承 A1 103 8.1 扩展类 103 8.2 重写方法 104 8.3 类型检查和转换 105 8.4 受保护字段和方法 106 8.5 类的构造 106 8.6 重写字段 107 8.7 匿名子类 109 8.8 抽象类 109 8.9 抽象字段 110 8.10 构造顺序和提前定义 L3 110 8.11 Scala类继承关系 112 8.12 对象相等性 L1 114 8.13 值类 L2 116 练习 117 第9章 文件和正则表达式 A1 121 9.1 读取行 121 9.2 读取字符 122 9.3 读取词法单元和数字 123 9.4 从URL或其他源读取 124 9.5 读取二进制文件 124 9.6 写入文本文件 124 9.7 访问目录 125 9.8 序列化 125 9.9 进程控制 A2126 9.10 正则表达式 129 9.11 正则表达式组 130 练习 131 第10章 特质 A1135 10.1 为什么没有多重继承 135 10.2 当作接口使用的特质 137 10.3 带有具体实现的特质 138 10.4 带有特质的对象 139 10.5 叠加在一起的特质 140 10.6 在特质中重写抽象方法 141 10.7 当作富接口使用的特质 142 10.8 特质中的具体字段 143 10.9 特质中的抽象字段 144 10.10 特质构造顺序 145 10.11 初始化特质中的字段 147 10.12 扩展类的特质 148 10.13 自身类型 L2 149 10.14 背后发生了什么 151 练习 152 第11章 操作符 A1157 11.1 标识符 157 11.2 中置操作符 158 11.3 一元操作符 159 11.4 赋值操作符 160 11.5 优先级 161 11.6 结合性 162 11.7 apply和update方法 162 11.8 提取器 L2 164 11.9 带单个参数或无参数的提取器 L2166 11
超实用的jQuery代码段精选近350个jQuery代码段,涵盖页面开发中绝大多数要点、技巧与方法,堪称史上最实用的jQuery代码参考书,可以视为网页设计与网站建设人员的好帮手。《超实用的jQuery代码段》的代码跨平台、跨设备、跨浏览器,充分向读者演示了如何使用jQuery的各项技术,实现令人激动的网页效果。    《超实用的jQuery代码段》从jQuery框架的使用原理与应用场景出发,对最实用的jQuery代码段进行了全方位的介绍和演示。全书分为11章,包含网页效果、DOM元素与属性、HTML事件、CSS样式、用户输入自动完成、拖放、图形图像、AJAX、算法、jQuery Mobile应用、浏览器、Cookies等jQuery技术内容,对提高网站开发人员和设计人员的jQuery技术水平有指导作用。 超实用的jQuery代码段 目录: 序1 jQuery必知必会 VIII 序2 你绝对不可能全部做对的jQuery题 XVI 序3 最流行的前端面试题 XXIII 第1章 jQuery操作网页 1.1 显示或隐藏网页内容 1.2 切换页面的显示或隐藏 1.3 实现幻灯片式的淡入淡出效果 1.4 切换页面的淡入淡出 1.5 页面的滑动隐藏 1.6 切换页面的滑动 1.7 图片的动画效果 1.8 停止动画效果 1.9 不可不知的Callback回调 1.10 提高效率的链式(Chaining)操作 1.11 在新窗口中打开链接 1.12 强制在弹出窗口中打开链接 1.13 平滑滚动页面到某个锚点 1.14 阻止文本行换行 1.15 实现iframe高度自适应 1.16 实现左右div自适应相同高度 1.17 获取鼠标在屏幕中的坐标 1.18 获取鼠标在窗口客户区中的坐标 1.19 获取鼠标在窗口页面中的坐标 1.20 设置Flash对象的WMode窗口模式 1.21 实现类Twitter的字数限制效果 1.22 提示文本的隐藏与显示 1.23 实现文字闪烁效果 1.24 实现文字动画效果 1.25 实现文字跟随鼠标移动变化的动画效果 1.26 文本域中光标的定位 1.27 实现可折叠效果 1.28 文本框内容自动缩进 1.29 禁止页面滚动的方法 1.30 页面加载后消息框居中显示 1.31 创建页面固定浮动栏的方法 第2章 jQuery操作DOM元素 2.1 如何验证某个元素是否为空 2.2 检查特定的HTML元素是否存在 2.3 判断HTML元素是否嵌套 2.4 获取当前元素的索引值 2.5 插入节点元素 2.6 复制节点元素 2.7 替换节点元素 2.8 删除节点元素 2.9 为元素绑定事件 2.10 如何从元素中除去HTML标签 2.11 如何限制文本域中字符的个数 2.12 如何选中页面上的所有复选框 2.13 禁用表单的回车键提交 2.14 禁用右键单击上下文菜单 2.15 IE下禁用文本选择功能 2.16 输入框获取焦点时文本高亮提示 2.17 实现多个输入框同步操作 2.18 在新窗口中打开外部链接 2.19 jQuery实现outerHTML属性 2.20 实现带固定表头的表格 2.21 为表单内控件设定缺省数值和文本 2.22 防止单个页面重复提交按钮 2.23 取得列表控件选中的option对象 2.24 限制输入框仅接受特殊字符的输入 2.25 禁止页面内全部超链接 2.26 实现动态组合列表框 2.27 如何使用属性过滤器 2.28 如何测试某个元素是否可见 第3章 jQuery操作HTML事件 3.1 禁止或启用输入框 3.2 实时监听输入框字符的变化 3.3 实时监听输入框值的变化 3.4 绑定鼠标右键单击事件 3.5 双击不选中文本 3.6 通过单击事件添加或解除绑定 3.7 激活整个div层的单击事件 3.8 鼠标单击实现div的选取 3.9 模拟鼠标单击事件 3.10 设定时间间隔的方法 3.11 设定时间延迟的方法 3.12 延时显示子菜单的方法 3.13 通过事件获取页面加载时间 3.14 如何为动态添加的元素绑定事件处理函数 3.15 为表格行增加单击事件 3.16 用回车键模拟Tab键 第4章 jQuery操作CSS样式 4.1 使用addClass()函数动态添加样式类 4.2 使用removeClass()函数动态移除样式类 4.3 使用toggleClass()函数切换页面元素的样式类 4.4 为body增加class类支持 4.5 操作div的显示与隐藏 4.6 如何设定div始终居中显示 4.7 测试浏览器是否支持某些CSS 3属性 4.8 如何添加hover类到指定元素 4.9 基于URL地址为导航链接添加class样式 4.10 如何延迟添加class类 4.11 如何延迟清除class类 4.12 动态调整页面的字体大小 第5章 jQuery实现用户输入自动完成功能 5.1 最简单的用户输入自动完成 5.2 使用远程数据源的自动完成 5.3 带缓存的自动完成 5.4 带滚动条的自动完成 5.5 Combobox风格的自动完成 5.6 读取XML数据的自动完成 5.7 多维数据的自动完成 第6章 jQuery实现拖放功能 6.1 基本拖放功能 6.2 基于事件的拖放 6.3 限制移动范围的拖放 6.4 延迟进行的拖放 6.5 具有对齐功能的拖放 6.6 自动滚动的拖放 6.7 反转位置的拖放 6.8 使用事件监控拖曳次数 6.9 拖动时动态更改鼠标的光标类型和位置 6.10 拖曳并放置到目标容器 6.11 限制可放置的元素 6.12 实现可拖放的购物车 6.13 可排序的拖放 6.14 在多个列表之间进行拖放 6.15 使用拖动方式选择多个元素 6.16 在两个Tab标签之间进行元素拖动 6.17 拖动表格选择多行数据 6.18 拖动表格时自动选中复选框 6.19 拖动表格行并放置到目标位置 6.20 表格的拖动排序 6.21 拖动调整控件的大小 6.22 调整控件大小时设置调整约束 6.23 使用拖动的方式调整表格的宽度 6.24 设计可改变单元格宽度并可以多选的表格 第7章 jQuery操作图形图像 7.1 如何更好地处理图片法显示问题 7.2 如何显示图片直到页面加载完成 7.3 预加载显示图片的方法 7.4 Facebook风格的图片预加载 7.5 检查图片src是否有效 7.6 上下滑动的图片 7.7 淡入淡出一幅图片,进入另一幅图片 7.8 获取图片原生尺寸的方法 7.9 检查图像是否已经被完全加载 7.10 单击改变背景图案 7.11 如何显示Flickr网站的图片 7.12 如何显示Google Picasaweb的图片 7.13 按比例调整图片的大小 7.14 滑动效果的背景图片 7.15 动态表单生成图片预览 7.16 平滑滚动的导航菜单 7.17 图片的放大预览 7.18 实现平滑的图片动态缩放效果 7.19 自动适应的窗口背景 7.20 如何判断加载多张图片的完成状态 7.21 鼠标悬停时的图片放大 7.22 淡出图片,淡入另一幅图片 7.23 页面加载时随机显示图片 7.24 按顺序淡入图片显示 7.25 检测图片的URL是否有效 7.26 强制显示图片的方法 7.27 实现可拖动显示的图片 第8章 jQuery实现AJAX 8.1 动态加载外部文件 8.2 动态加载外部网页 8.3 加载网页文件内容并传递服务器端参数 8.4 使用AJAX刷新删除网页记录 8.5 使用AJAX异步验证用户名和密码 8.6 页面滚动时加载新的网页内容 8.7 打造自己的站内搜索引擎 8.8 异步加载并解析XML文件 8.9 动态加载HTML内容到标签页中 8.10 使用AJAX刷新异步提交表单 8.11 使用AJAX刷新上传图片 8.12 使用AJAX刷新验证PHP会话是否有效 8.13 在AJAX异步调用时显示加载指示器 8.14 在AJAX异步调用时处理JSON数据 8.15 解析XML数据并加载到HTML表格 8.16 jQuery AJAX错误的处理方法 8.17 在页面级创建全局的AJAX监听器以及状态指示器 8.18 级联AJAX数据异步加载 8.19 取消AJAX异步请求 第9章 jQuery常用算法 9.1 jQuery遍历算法 9.2 jQuery祖先算法 9.3 jQuery后代算法 9.4 jQuery同胞算法 9.5 jQuery过滤算法 9.6 对一个列表进行排序 9.7 实现JSN对象数组的排序 9.8 将12343778转成12.343.778的形式 9.9 模拟抽奖程序 9.10 实现冒泡算法 9.11 查询数组中特定数值 9.12 从数组中移除特定数值 9.13 根据指定正则表达式识别超链接 9.14 验证Email地址的正确性 9.15 动态统计字符个数 9.16 使用jQuery验证用户年龄 9.17 按照首字母进行元素排序 9.18 获取URL地址的Hash参数 9.19 避免多行文本溢出的算法 9.20 随机选择一个元素 9.21 替换&bnsp;空字符的方法 9.22 序列化表单到JSON数据 9.23 获取页面加载时间 9.24 将单个句子打断显示 9.25 限制只能输入中文、英文或数字 9.26 日期类型与时间戳的转换 9.27 使用数组模拟打字效果 9.28 获取数组中特定索引的最高值 9.29 清除所有的表单内容 9.30 用jQuery删除空白标签和具有非中断空格的标签 第10章 jQuery Mobile移动开发技巧 10.1 让页面自适应屏幕宽度 10.2 在移动设备页面中创建多个显示视图 10.3 创建对话框显示效果 10.4 从外部文件中加载页面内容 10.5 为页面添加转场效果 10.6 设置全局默认的转场效果 10.7 定制显示回退按钮 10.8 在标题栏中添加导航栏 10.9 在页脚区域添加导航栏 10.10 添加可折叠的导航按钮 10.11 实现可折叠的输入表单 10.12 实现手风琴样式的折叠面板 10.13 使用网格打造简单的九宫格界面 10.14 可动态隐藏的页眉和页脚 10.15 最简单的手机相册 10.16 在列表框上添加气泡提示 10.17 在列表框上添加自定义按钮 10.18 为列表添加自定义的缩略图图标 10.19 创建列表日历的效果 10.20 动态创建listview列表项 10.21 动态加载和切换页面 10.22 在页面切换时显示加载进度框 10.23 在屏幕旋转时更改显示样式 10.24 在列表框中实现加载更多效果 10.25 自定义选择菜单 10.26 使用多个选择菜单进行组合选择 10.27 使用多选菜单选择多个值 10.28 创建双重范围的滑块 10.29 实现开关效果的选择功能 10.30 创建主题化的表单效果 第11章 其他常用代码段 11.1 判断jQuery库是否被加载 11.2 解决jQuery库冲突的方法 11.3 jQuery版本检查方法 11.4 解决jQuery版本冲突问题 11.5 如何设置IE特有的功能 11.6 判断浏览器类型并设置HTML元素内容 11.7 加载Google CDN的jQuery库 11.8 Cookies应用方法 11.9 使用cookie.js管理Cookies 11.10 让Cookies在N分钟后过期 11.11 如何删除Cookies 11.12 获取当前页面的URL并添加样式 11.13 向表格追加一行数据 11.14 获取客户端IP 11.15 向Firebug的控制面板发送消息 11.16 根据不同的屏幕大小显示不同的网页 11.17 jQuery遍历对象的属性 11.18 最优化的循环语句写法 11.19 如何构建最优化的字符串 11.20 使用jQuery产生GUID值 11.21 使用jQuery实现聚合函数 11.22 用jQuery打印网页的特定区域 11.23 禁止表单被提交 11.24 使用delay()延迟执行动画 11.25 在网页上运行本地程序的方法 11.26 动态过滤HTML表格中的内容 11.27 使用递归函数创建文字闪烁特效 11.28 使用ID选择器加快选择的速度 11.29 在类选择器前用标签选择器加快速度 11.30 缓存jQuery对象以提升性能 11.31 使用find()函数提升子查询的性能 11.32 使用jQuery操作DOM的限制
主要讲述了计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。 本书介绍了人类在一个奋斗领域中的创造性和灵活性:计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。 本书33章,有33位作者,每位作者贡献一章。每位作者都将自己心目中对于“美丽的代码”的认识浓缩在一章当中,张力十足。33位大师,每个人对代码之美都 有自己独特的认识,现在一览无余的放在一起,对于热爱程序的每个人都不啻一场盛宴。 虽然本书的涉猎范围很广,但也只能代表一小部分在这个软件开发这个最令人兴奋领域所发生的事情。 本书收录的是软件设计领域中的一组大师级作品。每一章都是由一位或几位著名程序员针对某个问题给出的完美的解决方案,并且细述了这些解决方案的巧妙之处。 本书既不是一本关于设计模式的书,也不是一本关于软件工程的书,它告诉你的不仅仅是一些正确的方式或者错误的方式。它让你站在那些优秀软件设计师的肩膀上,从他们的角度来看待问题。 本书给出了38位大师级程序员在项目设计中的思路、在开发工作中的权衡,以及一些打破成规的决策。 第1章 正则表达式匹配器 。 1.1 编程实践 1.2 实现 1.3 讨论 1.4 其他的方法 1.5 构建 1.6 小结 第2章 Subversion中的增量编辑器:像本体一样的接口 2.1 版本控制与目录树的转换 2.2 表达目录树的差异 2.3 增量编辑器接口 2.4 但这是不是艺术? 2.5 像体育比赛一样的抽象 2.6 结论 第3章 我编写过的最漂亮代码 3.1 我编写过的最漂亮代码 3.2事倍功半 3.3 观点 3.4 本章的中心思想是什么? 3.5 结论 3.6致谢 第4章 查找 4.1. 耗时 4.2. 问题:博客数据 4.3. 问题:时间,人物,以及对象? 4.4. 大规模尺度的搜索 4.5. 结论 第5章 正确、优美、迅速(按重要性排序):从设计XML验证器中学到的经验 5.1 XML验证器的作用 5.2 问题所在 5.3 版本1:简单的实现 5.4 版本2:模拟BNF语法——复杂度O(N) 5.5 版本3:第一个复杂度O(log N)的优化 5.6 版本4:第二次优化:避免重复验证 5.7 版本5:第三次优化:复杂度 O(1) 5.8 版本 6:第四次优化:缓存(Caching) 5.9 从故事中学到的 第6章 集成测试框架:脆弱之美 6.1. 三个类搞定一个验收测试框架 6.2. 框架设计的挑战 6.3. 开放式框架 6.4. 一个HTML解析器可以简单到什么程度? 6.5. 结论 第7章 美丽测试 7.1 讨厌的二分查找 7.2 JUnit简介 7.3将二分查找进行到底 7.4 结论 第8章 图像处理中的即时代码生成 第9章 自顶向下的运算符优先级 9.1. JavaScript 9.2. 符号表 9.3. 语素 9.4. 优先级 9.5. 表达式 9.6. 中置运算符 9.7. 前置操作符 9.8. 赋值运算符 9.9. 常数 9.10. Scope 9.11. 语句 9.12. 函数 9.13. 数组和对象字面量 9.14. 要做和要思考的事 第 10章 追求加速的种群计数 10.1. 基本方法 10.2. 分治法 10.3. 其他方法 10.4. 两个字种群计数的和与差 10.5. 两个字的种群计数比较 10.6. 数组中的1位种群计数 10.7. 应用 第11章 安全通信:自由的技术 11.1 项目启动之前 11.2剖析安全通信的复杂性 11.3 可用性是关键要素 11.4 基础 11.5 测试集 11.6 功能原型 11.7 清理,插入,继续…… 11.8 在喜马拉雅山的开发工作 11.9 看不到的改动 11.10 速度确实重要 11.11 人权中的通信隐私 11.12 程序员与文明 第12章 在BioPerl里培育漂亮代码 12.1. BioPerl和Bio::Graphics模块 12.2. Bio::Graphics的设计流程 12.3. 扩展Bio::Graphics 12.4. 结束语和教训 第13章 基因排序器的设计 13.1 基因排序器的用户界面 13.2 通过Web跟用户保持对话 13.3. 多态的威力 13.4 滤除无关的基因 13.5 大规模美丽代码理论 13.6 结论 第14章 优雅代码随硬件发展的演化 14.1. 计算机体系结构对矩阵算法的影响 14.2 一种基于分解的方法 14.3 一个简单版本 14.4 LINPACK库中的DGEFA子程序 14.5 LAPACK DGETRF 14.6递归LU 14.7 ScaLAPACK PDGETRF 14.8 针对多核系统的多线程设计 14.9 误差分析与操作计数浅析 14.10 未来的研究方向 14.11 进一步阅读 第15章 漂亮的设计会给你带来长远的好处 15.1. 对于漂亮代码的个人看法 15.2. 对于CERN库的介绍 15.3. 外在美(Outer Beauty) 15.4. 内在美(Inner Beauty ) 15.5. 结论 第16章,Linux内核驱动模型:协作的好处 16.1 简单的开始 16.2 进一步简化 16.3 扩展到上千台设备 16.4 小对象的松散结合 第17章 额外的间接层 17.1. 从直接代码操作到通过函数指针操作 17.2. 从函数参数到参数指针 17.3. 从文件系统到文件系统层 17.4. 从代码到DSL(Domain-Specific Language) 17.5. 复用与分离 17.6.分层是永恒之道? 第18章 Python的字典类:如何打造全能战士 18.1. 字典类的内部实现 18.2. 特殊调校 18.3. 冲突处理 18.4. 调整大小 18.5. 迭代和动态变化 18.6. 结论 18.7. 致谢 第19章 NumPy中的多维迭代器 19.1 N维数组操作中的关键挑战 19.2 N维数组的内存模型 19.3NumPy迭代器的起源 19.4 迭代器的设计 19.5 迭代器的接口 19.6 迭代器的使用 19.7 结束语 第20章 NASA火星漫步者任务中的高可靠企业系统 20.1 任务与CIP 20.2 任务需求 20.3 系统架构 20.4 案例分析:流服务 20.5 可靠性 20.6 稳定性 20.7 结束语 第21章 ERP5:最大可适性的设计 21.1 ERP的总体目标 21.2 ERP5 21.3 Zope基础平台 21.4 ERP5 Project中的概念 21.5 编码实现ERP5 Project 21.6 结束语 第22章 一匙污水 第23章 MapReduce分布式编程 23.1 激动人心的示例 23.2 MapReduce编程模型 23.3 其他MapReduce示例 23.4 分布式MapReduce的一种实现 23.5 模型扩展 23.6 结论 23.7 进阶阅读 23.8 致谢 23.9 附录:单词计数解决方案 第24章 美丽的并发 24.2 软件事务内存 24.3 圣诞老人问题 24.4 对Haskell的一些思考 24.6 致谢 第25章 句法抽象:syntax-case 展开器 25.1. syntax-case简介 25.2. 展开算法 25.3. 例子 25.4. 结论 第26章 节省劳动的架构:一个面向对象的网络化软件框架 26.1 示例程序:日志服务 26.2 日志服务器框架的面向对象设计 26.3 实现串行化日志服务器 26.4 实现并行日志服务器 26.5 结论 第27章 以REST方式集成业务伙伴 27.1 项目背景 27.2 把服务开放给外部客户 27.3 使用工厂模式转发服务 27.4 用电子商务协议来交换数据 27.5 结束语 第28章 漂亮的调试 28.1 对调试器进行调试 28.2 系统化的过程 28.3 关于查找的问题 28.4 自动找出故障起因 28.5 增量调试 28.6 最小化输入 28.7 查找缺陷 28.8 原型问题 28.9 结束语 28.10 致谢 28.11 进一步阅读 第29章 把代码当作文章 第30章 当你与世界的联系只有一个按钮 30.1 基本的设计模型 30.2 输入界面 30.3 用户界面的效率 30.4 下载 30.5 未来的发展方向 第31章 Emacspeak:全功能音频桌面 31.1 产生语音输出 31.2 支持语音的Emacs 31.3 对于在线信息的简单访问 31.4 小结 31.5 致谢 第32章 变动的代码 32.1 像书本一样 32.2 功能相似的代码在外观上也保持相似 32.3 缩进带来的危险 32.4 浏览代码 32.5 我们使用的工具 32.6 DiffMerge的曲折历史 32.7 结束语 32.8 致谢 32.9 进一步阅读 第33章 为“The Book”编写程序 33.1 没有捷径 33.2 给Lisp初学者的提示 33.3 三点共线 33.4 不可靠的斜率 33.5 三角不等性 33.6 河道弯曲模型 33.7 “Duh!”——我的意思是“Aha!” 33.8 结束语 33.9 进一步阅读 后记

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值