65.9K
CodeProject 正在变化。 阅读更多。
Home

写出优秀代码卷2:底层思考,高层书写

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (19投票s)

2009年12月29日

CPOL

7分钟阅读

viewsIcon

59822

评 Randall Hyde 的《写出优秀代码》卷2

引言

Image of Write Great Code Vol. 2 Cover

最近我终于有时间专心阅读一本新书。我想了解低级汇编语言,以及它如何用于应用程序性能调优。我听说《汇编艺术》是关于汇编语言的最佳书籍之一。在查找同一作者 Randall Hyde 出版的其他书籍时,我发现了他的新系列《写出优秀代码》。

该系列第二本书正好聚焦于我所寻找的内容:简要介绍汇编语言,以及如何用它来优化代码性能。

这本书主要针对 x86 和 PowerPC 指令集。我的背景是 Java 和 C# .NET。这两种都是第四层语言,使用优化的 JIT 编译器处理 OP Code(Java)或 IL(.NET)。我已经具备这两种语言和中间语言的工作知识。然而,我对汇编语言一无所知(尽管我在大学时上过汇编课)。

这本书首先介绍了 x86 和 PowerPC 的基本汇编代码。它非常清晰地解释了两者之间的相似点和不同点。最值得注意的是 x86 使用一套较小的寄存器,而 PowerPC 拥有一套更丰富的寄存器。书中介绍的汇编语言的理解难度非常低,只提及了语言中最基本的指令。这一点非常关键,可以帮助读者在没有领域知识的情况下更快地掌握基础。我认为这很像滑雪和滑雪板的区别。滑雪初学难精通,而滑雪板初学易精通。如果采用 Randall 的方法,汇编语言更像后者。书中提到了语言和指令集的在线对应表,但我在阅读时并没有使用它们。这迫使我用自己的大脑去解读代码。

每个示例都以介绍要解决的问题开始。然后提供一个高级语言的示例,并附带经过编译器优化和未优化处理的代码反汇编。针对 x86 和 PowerPC 的代码泛化,使用了多种编译器。从中,我很快就看到 GNU PowerPC 编译器似乎提供了最佳的优化效果。

本书的目标是展示如何用高级语言编写代码,并理解编译器如何优化代码。这非常有益,我确实学到了比预期更多的关于编译器优化的知识。我也了解到编译器只是按照设计的功能运行。因此,如果我用一种编译器不期望的高级方式编写代码,那么就不会应用任何优化。更重要的是,本书揭示了许多开发者可能由于缺乏理解和依赖性问题而无意中阻止编译器进行优化的情景。

一位书评人认为,关于布尔逻辑的部分物有所值。我心想:“也算吧”,这种不温不火的感觉可能源于我拥有电子工程学位。我觉得关于内存分配、迭代器和分支运算符的部分非常有趣。

在阅读这本书时,我得出一个结论:编辑——据说他让这本书更容易阅读——实际上并没有做得很好。我可能会以不同的方式编辑,但我认为这本书的目标仍然忠实于其预期的目的和受众。

章节和目录

一些基本统计信息

  • 定价:44.95 美元 / 58.95 加元
  • 总页数:587 + 在线附录
  • 出版社:No Starch Press

第一章:底层思考,高层书写

一篇简短的 10 页介绍,概述了本书内容、如何阅读本书以及关于编译器质量的误解。

第二章:难道你不应该学习汇编语言吗?

一篇 6 页的概要,讲述为什么汇编语言难以学习和理解,本书如何解决学习汇编的初始学习曲线问题,高级汇编和 HAL(作者个人汇编语言),以及一些关于作者另一本书《汇编艺术》和其他优秀汇编书籍的知识。

第三章:面向 HLL 程序员的 80x86 汇编

面向高级程序员的 x86 汇编语言介绍。详细介绍了 20 页的 80x86 基本架构,随后是最小指令集列表。本章和下一章几乎完全相同,以便于比较书中涉及的两种微处理器。

第四章:面向 HLL 程序员的 PowerPC 汇编

面向高级程序员的 PowerPC 系列及其汇编语言介绍。相比 80x86,这里的细节较少,仅有 10 页介绍架构和最小指令集。我发现,在阅读完第三章和第四章后,编辑本可以对两者之间的相似之处做一些注释。本书将两者之间的联系留给读者自己去建立,但本书的其余部分确实很好地概述了它们之间的差异。

第五章:编译器操作和代码生成

本章重点介绍编译器,涵盖了基本的编译器理论以及编译器使用的语言、文件类型和翻译过程之间的区别。这些信息是阅读本书其余部分的先决条件。它很好地涵盖了编译器生成可执行文件的整个过程。作者用 40 页的篇幅在 10 个部分中介绍了这些内容。

第六章:分析编译器输出的工具

让读者了解如何反编译和使用其他工具来帮助从高级语言生成汇编列表。本主题占用了 50 页。本书大部分内容都集中在反编译各种编译器和架构上的 C 语言代码。

第七章:常量和高级语言

一篇 40 页的介绍,关于常量以及它们在汇编中如何定义。

第八章:高级语言中的变量

本章介绍的不仅仅是变量。它主要关注变量和内存组织、生命周期和消耗。本主题占用了 50 页。

第九章:数组数据类型

一篇 40 页的概述,介绍数组类型及其在内存中的组织方式。本章展示了在汇编中填充数组的不同方法,并揭示了程序员在使用数组时犯的一些错误。

第十章:字符串数据类型

本章介绍基本字符串及其在汇编中的表示方式。作者承认,完全掌握汇编中的字符串已超出本书范围。本主题占用了 30 页。

第十一章:指针数据类型

“什么是指针?”这个问题在本章中得到了解答。指针的陷阱和算术运算(使用指针的常见问题)得到了介绍。

第十二章:记录、联合和类数据类型

40 页介绍了高级语言。本章并没有真正介绍所涵盖的高级构造如何转化为汇编,但它确实展示了编译器在尝试优化生成的汇编时遇到的一些问题。

第十三章:算术和逻辑表达式

介绍了基于堆栈、累加器和寄存器机器的区别。从高级理解的角度来看,优化算术表达式的部分很有趣。本主题占用了 50 页。

第十四章:控制结构和程序化决策

涵盖了流程控制语句。在阅读本节时,我发现自己并没有真正理解汇编语句。在阅读了其他章节并更好地理解了不同“jump”语句的作用后,我回到本章重新阅读。我认为这是本书中最有趣的章节之一。40 页。

第十五章:迭代控制结构

本章有助于填补上一章的空白。也非常有趣。40 页。

第十六章:函数和过程

30 页介绍函数以及编译器在传递不同值类型或引用类型时遇到的问题。

作者似乎写了一些涵盖本书内容的章节。主要关于编译器理论、性能和依赖性问题。总的来说,我会给这本书打 4 分(满分 5 分),并推荐给任何有兴趣编写更优秀代码并理解编译器如何优化高级代码的人。

历史

  • 初稿 - 2009 年 12 月
© . All rights reserved.