0.4开发流程简介

在我们编写和运行第一个程序之前,我们需要更详细地了解C++程序的开发流程,下图概述了简要的开发流程:

一、确定你要解决的问题

这是“what”的一步,确定问题,表面来看,这是最简单的一步,但也是最重要的一步,这是进行之后所有步骤的基础。以下是几个例子:

  • “我想写一个程序,允许我输入数字,然后计算其平均值。”
  • “我想写一个程序,生成一个二维的迷宫,让用户浏览它。”
  • “我想写一个程序,从一个文件中读取股票价格,并预测股票走势。”

二、确定如何解决问题

这是“how”的一步,这一步确定你将用什么方法解决第一步提出的问题,这也是软件开发中最容易被忽视的一步。问题的关键是,解决一个问题通常有很多种方法,这些方法有好坏之分。通常一个程序员想到方法后就会立即坐下,敲代码,而这个最初的想法通常是属于“坏方法”一类的。

通常:优秀的解决方案有如下的特征:

  • 直截了当。
  • 易于记录。
  • 模块化,可重复使用或更改而不影响程序的其他部分。
  • 功能强大,发生意外时可以发现错误并给出错误提示。

当你坐下开始敲代码时,你通常会想“I want to do _this_”,所以你会选择那个能够快速完成的方法,而这通常会导致程序变得脆弱、难以修改和拓展,并且可能存在诸多错误(bug)。

研究表明,只有20%的时间用在写初稿上,而80%的时间都是用在调试(修改错误)和维护程序(增添新功能)上。所以,在开始写代码之前,花一点额外的时间思考解决问题的最佳方案是非常值得的,程序运行时都会遇到什么样的奇葩情况?以后又会需要添加什么样奇葩的功能?考虑一下这些问题,能为你的将来节约下大把时间,省去许多不必要的麻烦。

未来的课程中我们会花更多的时间讨论如何设计解决问题的最佳方案。

三、编写程序

写程序之前,我们需要准备两件事:首先我们需要掌握一门编程语言,这就是本教程的用处,其次我们需要一个合适的编辑器。其实写程序可以用任何简单的编辑器,比如windows自带的记事本、UNIX的Vim、Pico都是可以的,但是我们强烈建议使用专门用来编码的编辑器,如果你没有不用担心,我们稍后就会教你安装一个。

专业的代码编辑器都有如下特征,可以使写程序变得更加容易简单:

  • 带行号。当编译器给出错误提示时,行号会变得非常有用,比如编译器提示“error, line 64”,如果没有行号,找到第64行就会变成一个非常恼人的事情。
  • 语法高亮和着色。这可以改变程序各个部分的颜色,使得你更加容易地看清程序的整体结构。
  • 清晰的字体。非编程字体很难区分数字0和字母0,或者数字1和小写字母l(L)、大写字母I(i),优秀的编程字体能够明显地区分这些符号以防止一个用在另一个地方。

你的C++程序通常被命名为name.cpp,name是你程序的名称,.cpp后缀名告诉编译器(和你),这是一个C++源代码文件,包含C++指令。注意有些人会使用.cc后缀名,但我们推荐你使用.cpp后缀名。

另外需要注意,许多复杂的C++程序有多个.cpp文件,虽然你写的程序大多只是一个单一的文件,但需要知道,有些程序可能包含数十个甚至数百个单独的cpp文件。

四、编译程序

为了编译一个程序,我们又需要一个叫做编译器的程序,编译器有两个作用:

  • 检查程序以确保其符合C++规范,如果不符合,编译器就会给出提示,告诉你哪里需要修改。
  • 将源代码转换为机器语言文件,通常称为目标文件。目标文件通常被命名为.o或.obj,如果你的程序有5个.cpp文件,就会生成5个.obj文件。

仅作说明性的提一下,大多数Linux系统和Mac系统都附带一个称作g++的C++编译器,用g++从命令行编译一个程序的方法如下:

g++ -c file1.cpp file2.cpp file3.cpp

这将生成file1.o、file2.o、file3.o,-c意味着“只编译”,告诉g++只需生成.o文件即可。

Linux、Windows和其他的操作系统都会提供其他的编译器,我们将在下一节讨论如何安装编译器。

对于一些复杂的项目,开发环境会使用makefile,这个文件会告诉编译器去编译哪个文件,Makefiles是个高级话题,可以写一整本书,但幸运的是,你无须考虑它,因而我们也不会讨论这个话题。

五、链接

链接是将编译器生成的所有目标文件合并成一个可运行的可执行程序的过程。这个过程是由一个称为链接器的程序完成的。

除了链接目标文件,连接器还负责引用C++标准库,或者其他你使用的预编译库,例如图形库和声音库。C++语言本身是相当小相当简单的,但它配备了大量的可选组件(你会在程序中用到),这些组件包含在C++标准库中,例如,如果你想把某个东西输出到屏幕上,就需要在程序中使用一个特殊的命令,告诉编译器你要使用标准库中的I/O程序(input/output,输入输出)。

一旦连接器完成了链接目标文件的任务,你就可以得到一个可执行文件。

再一次,说明性地提一下,链接Linux或OS X计算机上的.o文件时,我们仍然可以使用g++:

g++ -o prog file1.o file2.o file3.o

-o告诉编译器我们想从file1.o、file2.o、file3.o获得一个名为prog的可执行文件。如果想的话,编译链接的过程可以结合在一起写:

g++ -o prog file1.cpp file2.cpp file3.cpp

这将会结合编译与链接两个步骤,直接生成一个名为prog的可执行文件。

六、测试与调试。

这是非常有趣的部分(希望如此),你可以运行你的程序,看看运行结果是否如你所愿,如果不是的话,就需要调试了,稍后我们会更细致地讨论如何调试。

请注意步骤3、4、5和6都涉及到软件,且每一步都可以使用一个单独的程序来完成,一个软件包,就是大家所说的集成开发环境(IDE,integrated development environment)集成了所有这些功能。拥有一个IDE,你就拥有了一个带行号显示、代码高亮功能的编辑器,一个编译器,一个连接器。IDE会自动生成必要的参数来编译链接你的程序并产生一个可执行文件,包含多个文件的程序也不在话下。如果需要调试程序,你可以使用集成调试器。另外,IDE通常也会捆绑其他一些有用的功能,例如团队协作、代码自动补全、层次浏览,有时也会有版本控制系统。

下一节我们将会细致地探讨如何安装和使用IDE。

关于 “0.4开发流程简介” 的 1 个意见

发表评论

电子邮件地址不会被公开。