代码驱动的程序设计学习

这学期的课程已经到了第三周了,不少同学在博客中连代码托管还没弄好。出现的问题有:

Ubuntu上git安装配置出现问题;
使用git基本的流程不对,连最基本的git add; git commit; git push流程都不会,还直接到git@OSC上通过代码片断把电脑上的代码又贴一遍,浪费时间;
有的同学输了一周的代码,最后一起git commit 一下,而不是完成一段代码就git add;git commit 一下;
由于上一条的问题,代码的注释都一样,不能精细解释代码的功能;

上学期的《Java程序设计》中git和git@OSC已经用了一学期了,现在的情况说明不少同学要么上学期学的东西不扎实,学过的知识忘了,要么上学期就没学会。我感觉没学会的可能性很大,这么简单的东西不大会忘。虽然有「使用开源中国托管代码」和卢肖明同学的「Ubuntu下git的安装与使用」 这些博客指导,好好看实践相关内容的同学还是太少,还是有必要结合课程写个step by step 的教程,虽然下面的内容课堂上都演示过,不少同学还是没有学会。

更大的问题是完成学习任务时缺少思考,累却收获不大,从而失去学习的激情。

学习时问题驱动是个很好的方式,「本学期第一周学习任务」要求根据「别出心裁的Linux命令学习法」的思想学习「Linux 基础入门(新版)」,目前这门课有13节,不少人要么没学完,要么反映学完了没搞明白。这时候基于自己的实践,通过问题驱动来找最常用的命令,你会发现3/4/5/6节是学习重点。编程的学习,代码驱动是个很好的方式,我们的教材《深入理解计算机系统V2》是那么厚的一本书,通过使用git和gdb来积极主动的读写代码是一个很好的方式。积极主动的前提是自己有思考,不是仅仅完成老师的任务,那么按照下面的方法学习,这学期收获的不是一门功课的好成绩,而是为学习信息安全专业打下的坚实的计算机基础:程序设计、操作系统、计算机组成原理、汇编语言、编译原理、计算机网络、软件工程…

工具参考
下面的内容涉及到git和gdb的使用,这儿给出这两个工具的cheatsheet,方便大家参考,当然打印一份夹在教材中随用随查更好。

git cheatsheet
git1

git2

gdb cheatsheet
gdb1

gdb2

git的安装测试
Ubuntu中在bash中输入git, 如果没有安装git,会有如下提示:

no git

git的安装非常简单,根据上图中的提示,我们在bash中输入sudo apt-get install git就可以了,可以输入git --version来测试是否安装成功。如下图所示:

install git

不管是使用自己电脑上的虚拟机还是使用实验楼上的虚拟机,新建一个体现自己学号姓名的文件夹很重要,让老师一眼能看出来这是谁做的。如下图,输入mkdir 20145300rocedu 新建一个20145300rocedu文件夹。通过输入cd 20145300rocedu 进入20145300rocedu文件夹:

mdcddir

有的同学没有项目的概念,这学期的代码和上学期的Java课程中的代码混在一起,非常不好。

我们的教材《深入理解计算机系统V2》的英文版名为《Computer Systems :A Programmer’s Perspective》,和那本C语言名著《C程序设计语言 (The C Programming Language)》有个专有的缩写K&R一样,《深入理解计算机系统V2》的专用缩写为CSAPP,我们使用的是第二版,所以加上学号信息,通过在bash中输入mkdir 20145300CSAPP2E 建立教材的项目文件夹。根据C项目的规范,我们在20145300CSAPP2E文件夹下建立相应的文件夹:

src:存放源代码文件
include: 存放头文件
bin:存放编译后的目标文件、可执行文件等
lib:存放项目所需的静态库、动态(共享)库
res: 存放项目所需的图标、声音、图片等资源
docs: 存放项目相关的参考资料、帮助文档,比如大家的学习博客就可以放在这里

此外还可以建立dist文件夹存放打包,发布以后的代码;建立examples文件夹存放示例代码等。
项目文件夹下可以通过touch README Makefile新建README和Makefile两个文件:

README 是对项目的简要介绍:licence、功能、编译环境等,详细的要在docs下有帮助文档
Makefile 实现项目编译自动化
其他相关文件
我们的教材有12章,在src文件夹下为每章建立了一个文件夹。

建好的项目结构如下图所示:

project structure

我们的工作目录一般选择项目目录下,其他的使用相对路径。比如我们在src/01intro目录下输入教材第一章第一页的hello world程序hello.c, 我们使用vim src/01intro/hello.c命令:
vimhello

代码如下图所示:
hello.c

在Vim中通过:wq保存hello.c并退出Vim后,我们使用gcc src/01intro/hello.c -o bin/hello来编译程序,注意命令中相对路径的使用。可执行程序hello生成在bin目录下,我们可以使用./bin/hello来执行hello程序。此时目录结构如下图所示:

compilehello

我们通过git config对git作一下简单配置,user.name尽量体现自己的学号信息。
gitconfig

git cheatsheet中有常用的配置项:
git

我们通过git init 把项目纳入git管理。以后就是最常用的git add; git commit了,使用git commit时一定要注意解释一下刚才做了什么。比如我们在这用git commit -m "initiate csapp2e project with hello world program"说明‘我们用hello world程序初始化了CSAPP2E这个项目’。

git init

如下图,git cheatsheet中有常用的git 查看命令,git log会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明。如果记录过多,则按Page Up、Page Down、↓、↑来控制显示;按q退出历史记录列表。如上图,我们此时只有一条git commit记录。

gitbrowse

我们建立了项目目录结构后,编译命令中要用到相对路径,命令就长且难以记忆了,比如上面我们使用gcc src/01intro/hello.c -o bin/hello来编译hello world程序。我们可以通过shell脚本来简化编译运行程序。注意我们要用chmod +x compile.sh给脚本添加可执行权限,我们就可以用./compile.sh来执行脚本了。如下图所示:

compilescript

脚本中是编译、运行程序的命令,shell脚本中第一行是固定写法, #后面是注释:
helloscipt

我们想体会教材上gcc编译程序的四个阶段:预处理、编译、汇编、链接。
foursteps

可以在脚本中增加相关命令:
fourstepsscript

大家要注意,源代码产生的中间文件是不需要纳入git的管理的,也就是说我们上面建立的项目目录结构中的bin是不需要git管理的,否则项目所占空间可能会很大,往代码托管网站使用git push推送时,会浪费不少流量,也浪费代码托管网站的存储空间。我们可以使用.gitignore文件把不想纳入git管理的文件、文件夹排除掉。
vimgitignore

ignorebin

我们完成一个小任务,就git add; git commit 一下,注意在注释中说明刚才做了什么:

commit ignore

大家注意不要到周末了写了几百行代码了才git add; git commit 一下,这样导致所有代码的注释都一样了,很多同学的注释都是“Week2”、“Week3”、“第三周代码”。

评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值