这是本学期娄老师课程的第一篇博客,新学期应该有一个新的开始,正所谓新学期新气象,希望这学期能够改掉过去的那些坏毛病,能以一个崭新的姿态迎接新学期的到来。首先第一周应该学习的是教材的第一章和第七章。
首先是第一章的内容
教材内容学习
计算机系统漫游
最开始就是复习一下之前所学到的知识,也就是计算机系统是由硬件与软件系统所组成的。整体泛读一下第一章的内容,我们可以发现第一章大部分来说是基本概念,信息就是位加上文。首先了解到hello程序的生命周期是从一个源文件开始的。然后巩固了一下二进制有关的知识。
其次就学习到了程序被其他程序翻译成不同的格式,书中有一个类似表格的流程十分重要。也就是预处理器通过hello.i到达编译器接着通过hello.s到达汇编器然后通过Hello.o到达链接器。其次简要的了解一下GNU项目。
接下来学习的是第七章的内容
链接
链接是将各种代码和数据片段收集并组合成为一个单一文件的过程。目标文件有三种,可重定位目标文件,可执行目标文件与共享目标文件。
可重定位目标文件是我所认真学习的。
.text:已编译程序的机器代码。
.rodata:只读数据,比如printf语句中的格式串和开关语句的跳转表。
.data:已初始化的全局C变量。
.bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。
.symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息。
.rel.text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件结合时,需要修改这些位置。
.rel.data:被模块引用或定义的任何全局变量的重定位信息。
.debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。只有以-g选项调用编译驱动程序时才会得到这张表。
.line:原始C源程序中的行号和.text节中机器指令之间的映射。
.strtab:一个字符串表,其内容包括:.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。
教材中遇到的问题与解决
1.对GCC常用参数并不是十分理解
最开始的时候,对GCC感到十分的陌生,就算是读了几遍课本也无法好好地理解GCC,偶然在博客园看到了一个大神对GCC常用参数的整理。(http://www.cnblogs.com/shuaihanhungry/p/5808369.html)
-E #预处理后即停止,不进行编译,预处理后的代码送往标准输出
-S #编译后即停止,不进行汇编,可以使用 -o 选项选择其他名字
-c #编译或汇编源文件,但是不作连接,编译器输出对应于源文件的目标文件,可以使用 -o 选项选择其他名字
-o #指定输出文件名。该选项不在乎 GCC 产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的 C 代码
-MM #和 -M 选项类似,但是输出结果仅涉及用户头文件
-llibrary #连接名为 library 的库文件,连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是 liblibrary.a
#搜索目录除了一些系统标准目录外,还包括用户以 -L 选项指定的路径
-static #在支持动态连接的系统上,阻止连接共享库
-shared #生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件
-fPIC #如果支持这种目标机,编译器就输出位置无关目标码,适用于动态连接,即使分支需要大范围转移
-Idir #在头文件的搜索路径列表中添加 dir 目录
-Ldir #在 -l 选项的搜索路径列表中添加 dir 目录
-w #禁止所有警告信息
-Wall #生成所有警告信息
-g #以操作系统的本地格式产生调试信息
-rdynamic #把所有符号(而不仅仅只是程序已使用到的外部符号,但不包括静态符号,比如被static修饰的函数)
#都添加到动态符号表(即.dynsym表)里,以便那些通过dlopen()或backtrace()
#(这一系列函数使用.dynsym表内符号)这样的函数使用。
-O0 #不优化
-O1 #优化,对于大函数,优化编译占用稍微多的时间和相当大的内存
-O2 #多优化一些,除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作
-O3 #优化的更多,除了打开 -O2 所做的一切,它还打开了 -finline-functions 选项
#-finline-functions,把所有简单的函数集成进调用者,编译器探索式地决定哪些函数足够简单,值得这种集成
-m32 #产生32位代码
2.面向对象与面向过程到底是怎么回事?
面向对象:用线性的思维。与面向过程相辅相成。在软件开发过程中,宏观上,用面向对象来把握事物间复杂的关系,分析系统。微观上,仍然使用面向过程。
“面向过程”是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。
代码调试过程中遇到的问题以及解决过程
1.程序翻译成不同的格式遇到了问题
解决:好好通读课本,理解编译器与汇编器之间的hello.s的转换。
代码托管
无
上周考试错题
无
结对及互评
点评模板:
博客中值得学习的或问题:
xxx
xxx
...
代码中值得学习的或问题:
xxx
xxx
...
其他
本周结对学习情况
无
感悟
虽然说是刚开学,但是由于上学期已经经历过这样的学习,所以还是感觉到十分的紧张,这学期的内容照上学期比较的话,明显增多,所以这学期来讲的话,更需要认真与努力,希望这学期能够有一个非常良好的开端。
学习进度条
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
计划学习时间:6小时
实际学习时间:6小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)