入职学习(5)--一个程序员的成长史(25)

一个短暂的周末结束了,代是雄带着意犹未尽的心情早早地来到了公司。自从给唐师傅反馈了自己学习《C语言编程规范》和《数据库编程规范》的学习心得之后,代是雄一直没有收到唐师傅的下一步的学习计划,因此他一直惦记着这件事,想主动询问唐师傅,又不知道这样做是否合适。很多刚进入职场的人都会有这个问题,就是不知道主动向指导老师询问学习计划是否恰当。实际上,在工作中,我们要发挥自己的主观能动性,自己的任何问题都要尽快反馈出来,这样才能让指导老师知道大致的学习情况,才能安排下一步的学习和工作计划。

正当代是雄犹豫着是否应该主动联系唐师傅的时候,后者已经通过邮件向代是雄下达了下一步的学习计划。邮件的内容很简单:请简单描述一下程序编译和链接的过程,要求不要在互联网上查找,在下班之前完成。

看到这个邮件之后,代是雄明白唐师傅是在考察自己对计算机基础知识的掌握程度。不管是计算机组成也好,或者是编译和链接的原理也罢,都和程序设计息息相关,因为只有具备了扎实的理论功底,才能够在软件开发这条路上走得足够远。

我们用高级语言(如C/C++、Java等)编写出来的程序不能被计算机识别,只有经过一定的处理之后才能变为机器码供计算机识并处理执行,这个处理的过程包括预处理、编译、汇编和链接四个步骤。也就是说,对于一个程序hello.c来说,只有经过这四个步骤才能在计算机上运行起来,我们才能够看到程序的输出结果。

第一步:预处理,也叫预编译。这个过程主要处理那些源代码文件中的以“#”开始的预编译指令,比如“#include”、“#define”等,主要处理规则为:1)将所有的“#define”删除,并且展开所有的宏定义;2)处理所有条件预编译指令,比如“#if”、“#ifdef”、“#eif”、“#else”、“#endif”等;3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置(注意:这个过程是递归进行的,也就是说被包含的文件可能还包含其它文件);4)删除所有的注释“//”和“/**/”;5)添加行号和文件名标识,比如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号;6)保留所有的#pragma编译器指令,因为编译器须要使用它们。经过预编译后的文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到文件(如hello.i)中。

第二步:编译。编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件,这个过程往往就是我们所说的整个程序构建的核心部分,也是最复杂的部分之一。编译过程一般可以分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。在Linux下,编译过程相当于执行如下命令:gcc -S hello.i -o hello.s,现在版本的GCC把预编译和编译两个步骤合并成一个步骤,使用一个叫做cc1的程序来完成这两个步骤;也可以使用如下命令:gcc -S hello.c -o hello.s。从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。

第三步:汇编。该步骤是由汇编器完成的,它是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令,所以汇编器的汇编过程相对于汇编器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了。对于hello.c来说,汇编过程可以通过调用汇编器as来完成:as hello.s –o hello.o(或者gcc -c hello.s -o hello.o);也可以使用gcc命令从C源代码文件开始,经过预编译、编译和汇编直接输出目标文件:gcc -c hello.c -o hello.o。

第四步:链接。源代码被编译成目标代码之后,这个目标代码中有一个问题是:某些变量的地址还没有确定;也就是说,如果目标代码中有变量定义在其它模块,该怎么办?现代的编译器可以将一个源代码文件编译成一个未链接的目标文件,然后由链接器最终将这些目标文件链接起来形成可执行文件。人们把每个源代码独立地编译,然后按照需要把它们“组装”起来,这个组装模块的过程就是链接。链接的主要内容是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接;链接过程主要包括了地址和空间分配、符号决议和重定位等步骤。

“好复杂的过程啊!”代是雄在心里想着,“我们编写的一个简单的’hello world’程序要经过这么周折的处理才能够被机器执行,为什么我们不直接使用机器语言来编写程序,而要使用高级语言呢?”原因是这样的:高级语言使得程序员们能够更加关注程序逻辑的本身,而尽量少考虑计算机本身的限制,如字长、内存大小、通信方式、存储方式等;高级编程语言的出现使得程序开发的效率大大提高,其可移植性也使得它在多种计算机平台下能够游刃有余;有研究表明,高级语言的开发效率是汇编语言和机器语言的5倍以上。

理清了自己的思路之后,代是雄将这个问题的答案写到了一个Word文档中,排好版并检查有无错别字之后便发给了唐师傅。碰巧这个时候唐师傅不在座位上,那么等唐师傅看到代是雄的回复之后,会给出怎样的评价呢?

时间: 2024-09-15 06:46:39

入职学习(5)--一个程序员的成长史(25)的相关文章

主人公的出场—一个程序员的成长史(1)

        (大家好,从今天起,我的微信公众号(logiczhou)会连续推送<窗内窗外-一个程序员的成长史>系列.本系列以我本人从学校到职场的经历为原型,同时结合了我对软件开发工作.程序员的学习和生活的认识和感悟,欢迎大家阅读.你的点赞和支持是我写作的动力.下面是本系列的第一篇文章,让我们跟随主人公代是雄的脚步一起去体验程序员生活吧!)         翻开日历,已是2012年的4月.代是雄,中国一个普通高校的的硕士研究生,就要毕业了.         回首自己的在校的学习生涯,代是雄感

“一个程序员的成长史”系列答读者问(1)

"一个程序员的成长史"系列文章已经断断续续写了一年多的时间了,现在已经更新到第16篇了.在每一篇文章发布之后,总会有一些读者通过博客留言.微博.微信.QQ等方式发表他们的意见,在此,我对大家的支持表示感谢. 本系列更新至今,我想就一些读者常见的问题来做一下系统的答复.我希望大家能够一如既往地支持本人的写作,能够将"一个程序员的成长史"系列文章推荐给身边的人,让更多的人来了解程序员的工作与生活. 问题一:请问本系列文章的主人公代是雄就是作者本人吗? 答:不全是.主人公

毕业典礼—一个程序员的成长史(4)

今天就要举行毕业典礼了,每个人的脸上都洋溢着甜美的笑容.是啊,三年之前选择读研的人,哪个不是为了今天呢?哪个不是为了想要拿到这张文凭呢? 代是雄他们宿舍的人很早就起来了,因为昨天已经约好了今天要一起去照毕业照.研究生三年下来,同宿舍的人之间已经结下了深厚的友谊.代是雄他们宿舍室友五人,来自五个不同的地方.代是雄本人来自重庆,前面提到的小郭和小林同学分别来自四川和福建,另外两位室友小许和小李同学分别来自江苏常州和南京.小许同学算是他们五人中最时尚的了,在代是雄还不知道苹果为何物时,小许同学便用上了

入职学习(6)--一个程序员的成长史(26)

代是雄一直等着唐师傅的答复,可得到的却是一份开发人员常用的软件工具的清单.唐师傅说,"工欲善其事,必先利其器",从代是雄对之前所提问题的回答来看,他觉得代是雄的基础还不错,可以开始通过阅读实际的程序代码来学习了,但还有一个预备工作就是安装软件工具.听了唐师傅的评价之后,代是雄的心里美滋滋的,觉得自己正在踏入软件开发的门槛. 代是雄看到这份软件清单包含了如下这些软件:Microsoft Visual C++ 6.0.Source Insight.Notepad++.Araxis Merg

初入开发组(2)--一个程序员的成长史(17)

在代是雄的殷切期盼之下,在张工蜗牛般的工作速度之下,操作系统终于安装好了.系统装好之后,代是雄看了一下,发现在Win7已经很流行的2012年,张工居然给他安装的是XP系统.于是,代是雄随口问了一句:"张工,麻烦再确认一下呢,是给我安装的Windows XP吗?" "没错,是这个系统."张工说话的时候也没有看着代是雄,而是只顾忙自己的. "现在是不是应该安装Win7呢?在学校的时候,大部分同学就已经在用Win7了,我那个2009年买的电脑都是安装的Win7.

初入开发组(3)--一个程序员的成长史(18)

在去食堂的路上,代是雄回忆了一下,自己从初中便开始住校,那时一日三餐便是在食堂里面解决的,高中是如此,大学也基本如此.这样算下来,代是雄和食堂已经打了十几年的交道了."这个食堂会不会像学校的食堂那样,饭菜很难吃呢?"代是雄在心里想到. 进入食堂之后,代是雄左右看了一下,这个食堂的布局和之前自己所见过的食堂差不多,也是几个大的窗口用于卖主食,两个小的窗口用于卖面点.由于代是雄去得比较晚,现在每个窗口前面都排起了长队.代是雄排了将近五分钟的队才打到饭,这期间他没有看到有插队的人,看来,程序

初入开发组(5)--一个程序员的成长史(20)

解决完了肚子的问题,代是雄又回到了座位上,继续翻看那本他好几次试图翻看的<C程序设计>.这次,代是雄还是未能如愿,正在准备阅读第一页的时候,邹总又走了过来,叫代是雄和另外一位员工到他的位置上去一下. 看到代是雄他们过来了,邹总从旁边的座位上搬了两把椅子过来,让他们两人坐下.坐定之后,邹总对代是雄说:"这位是我们组的资深员工唐国大,他是一位非常优秀的软件开发工程师,我准备指派他做你的指导老师,你可以叫他唐师傅了."听了邹总的话之后,代是雄马上回过头去,恭恭敬敬地叫了一声&qu

初入开发组(1)--一个程序员的成长史(16)

也许是昨天晚上睡得早,今天代是雄起了个大早.在外面吃了点包子稀饭之后,便坐着公交车来到了公司.公交车还是一如既往的拥挤,代是雄一路上都是站着过来的,对于长期在大城市上班的人来说,大家都已经习惯了. 来到公司的大门口,代是雄发现很多人都是坐班车来上班的.下了班车之后,有些人又往另一个方向走去.代是雄放眼望去,才知道他们去食堂了.对于像Z公司这样的大公司来说,在每个研发中心都设立了食堂,提供早中晚三餐.这样,很多人就不用早起在家里面做早饭了,睡醒之后到公司吃饭更方便.代是雄决定从明天开始,自己也直接

上班第一天(4)--一个程序员的成长史(13)

代是雄等了将近一个小时,终于看到赖科长离开了座位,朝他走了过来.在过来的路上,赖科长还叫了另外一个人.那个人的年龄看起来和赖科长差不多大,带着一副厚厚的眼镜(估计有1000度左右). 赖科长对代是雄说要找个地方好好聊一下,叫他跟着他们走.穿过坐满程序员的开放办公区域,他们来到了一个小会议室中.这个会议室大约有十个平方米大小,中间放着一张长方形的会议桌,桌子周围摆着几把椅子,桌子上放着一个投影仪. "随便找个位置坐下吧."赖科长对代是雄说.同时,他和另外一个人也找了一个位置坐下了. 代是