《深入理解程序设计》章节试读

出版社:人民邮电出版社
出版日期:2014-1
ISBN:9787115337887
作者:[美] Jonathan Bartlett
页数:208页

《深入理解程序设计》的笔记-第36页 - 使用C调用约定的汇编语言函数

第一段中 mov %esp, %ebp 是等价于 (ebp) = (esp),翻译者直接把方向搞反了。英文原文没错。

《深入理解程序设计》的笔记-第116页 - 第10章 ~ 第11章

第10章 像计算机一样计数计算机将一切都作为1和0的序列来存储。计算机内存只看到数字,具体表达方式和意义需要程序员去解释。不同指令执行速度不同,可以通过二进制运算符(布尔运算符:AND, OR, NOT, XOR, 移位与循环移位)来加速。
第11章 高级语言语言只是工具,程序员不应该惧怕使用学习和使用新的工具。每个语言都各有千秋,懂得的语言越多,就越能胜任程序员的工作。尽可能多地探索感兴趣的语言:C更容易与其他语言交换;Python具有清晰的语法且适用于更直观的解决方案,其跨平台的GUI工具也非常强大;Common Lisp对于愿意学习它的人来说,比其他环境具备更强大、更多的功能。
C编译分为两个部分:预处理器和主编译器。
汇编语言与操作系统和硬件平台息息相关,编译语言和解释语言的代码则具有更好的移植性,可以运行在多种操作系统和硬件上。
Perl是一种解释语言,具有一个特点是将字符串作为单个值进行处理(汇编和C语言中字符串是多值序列);Perl的一个主要优势是处理文本的强大能力和快捷速度。
#!/usr/bin/perl
#!/usr/bin/python
#!:标识一个解释程序
/usr/bin/xxx:指定解释器

《深入理解程序设计》的笔记-第143页 - 第12章 优化

第12章 优化
强调:除非在极端的情况下,否则代码的可维护性和可读性比优化重要得多。
开发程序必须注意:
1.对所有事做好文档记录;
2.确保每一件事按照文档记录完成;
3.代码以模块的形式编写,易于修改;
一种正确的做事顺序:开发时重点完全放在程序正确性上,将优化视作最后需处理的事。
探查器(profiler):gprof是标准GNU/Linux分析工作
为了优化函数,需要了解它们的调用和使用方式。
局部优化:针对特定硬件和特定程序优化
1.预先计算:对小数据集和需要长时间的计算,存储所有答案
2.记住计算结果:缓存或记忆
3.局部性原理
4.使用寄存器
5.内联函数:函数调用设计参数入栈和跳转开销;递归函数不能内联
6.优化指令:xorl %eax, %eax 比 movl $0, %eax 更快,前者只访问寄存器不传输任何数据
7.寻址方式
立即寻址 > 寄存器寻址 > 直接寻址 > 间接寻址 > 基址寻址 > 索引间接寻址
8. 数据对齐
全局优化:由结构性优化构成,往往通过结构重组避免性能问题,而不是试图找到解决性能问题的最佳方式
1.并行化
2.无状态:无状态函数

《深入理解程序设计》的笔记-第106页 - 9

被管理的内存部分通常称为堆

《深入理解程序设计》的笔记-第32页 - 4

由系统提供的函数称为原函数(或原语),这些函数你无法编写程序完成,它们必须由系统提供。其他一切都是建立在这些函数之上的。
汇编语言中,原语通常就是系统调用
在不同的语言中,变量存储以及计算机传输参数和返回值的方式各不相同。这种差异称为语言的调用约定,因为它描述了在调用函数时,函数预期得到什么样的数据。
在C语言调用约定中,栈是实现函数的局部变量、参数和返回地址的关键因素

《深入理解程序设计》的笔记-第8页 - 2

存储在内存中的地址也成为指针

《深入理解程序设计》的笔记-第17页 - 3

%eax 累加器
%ebx 基址寄存器 Base
%ecx 计数 Count
%edx 存放数据 Data
%edi 目标变址 Destination Index
%esi 源变址 Source Index
%ebp 基址指针 Base Pointer
%esp 堆栈指针 Stack Pointer,总是指向当前栈顶
%eip 指令指针
栈的样子:
参数 #N <--- N*4+4(%ebp)
......
参数2 <--- 12(%ebp)
参数1 <--- 8(%ebp)
返回地址 <--- 4(%ebp)
旧%ebp <--- (%ebp)
局部变量1 <--- -4(%ebp)
局部变量2 <--- -8(%ebp)和(%esp)
栈是从内存顶部开始向下增长的

《深入理解程序设计》的笔记-第1页 - 相关资料

本书网站:Programming from the Ground Up Book - Summary 2004年
http://savannah.nongnu.org/projects/pgubook
可下载英文版PDF电子书
1.图灵社区
http://www.ituring.com.cn/book/1114
重点是勘误内容。
2. 其它勘误
1)第59页 第3行 “通过递增%cl获取下一个值” --> “通过递增%edi获取下一个值”
2)第82页 代码 "jl continue_processing" --> "jg continue_processing"
3)第103页 代码倒数第4行 “jle allocate_here” --> "jge allocate_here"
4)第109页 第3行,准确理解应该是 ”%ebx中保存的是我们想要的下一个内存区的末地址,即新中断地址“
5)第110页 第1行 "cmpl %edx, %ecx" --> "cmpl %ecx, %edx" 或者按照第3)项修改
6)第117页 二进制加法表 第二行第三列 0+1应该为1
3. 关于附录GUI编程
由于GTK和GNOME版本的更新,至少Python语言的示例代码太过古老(2004年),经实测无法使用,置于C和汇编代码估计很有可能也是如此。
相关参考链接:
一个gnome-python的例子,运行不了
http://www.unixresources.net/linux/clf/python/archive/00/00/57/29/572951.html
4. 书中示例源码,在Ubuntu14.04 32Bit系统运行通过
https://github.com/RanHuang/Hello-World/tree/master/linux-assemble
5. AT&T汇编语言
此书用的是AT&T格式的Intel汇编语言,是gcc系列默认汇编语言。

《深入理解程序设计》的笔记-第77页 - 第7章开发健壮的程序

第7章 开发健壮的程序
需要自律与刻苦:通常需要寻找每一个可能发生的问题,并为程序采取应对计划。
技巧:
1.用户测试;
2.数据测试;(极端案例:0,1,预期范围内一个数字,超出预期一个数字,预期范围内第一个和最后一个数字,低于预期范围的第一个数字,高于预期范围的第一个数字)
C语言assert宏,可再编译时关闭断言
3.模块测试
驱动程序和存根小函数
错误处理与修复相比,试图诊断出了什么问题导致更多的问题。因此仅通过报告错误代码和消息,让用户通过不同的资源进行故障排除是更好的做法。


 深入理解程序设计下载 更多精彩书评


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024