章节目录

程序开发流程

本节阅读量:

软件开发,通常遵循如下流程:

程序开发流程


需求分析

首先,明确需要编程解决的问题。

例如:

  • 开发一个将输入数字进行加减乘除的计算器
  • 开发一个转换图片格式的程序
  • 开发一个统计excel中指定信息的软件

方案设计

这一步需要思考采用何种方案来解决问题。针对同一个问题往往有许多好或坏的解法,需要仔细思考并挑选出优秀的解法。

「方案设计」在软件开发中经常被忽略。大部分情况下可能拍拍脑袋,有个思路就开始编程。 这样很容易编写出脆弱且充满「bug」的程序。

bug第一次用来描述程序中的错误

好的解决方案有以下特征:

  • 简洁不复杂
  • 容易实现并被他人理解
  • 模块化,只要略加修改,系统的每个部分都能复用或单独升级
  • 具有健壮性,当异常发生时,易恢复或有明确错误信息

编写程序

编写程序需要2个必备条件:首先要了解所使用的编程语言,即本教程所讲授的内容;其次,要准备一个文本编辑器来编写代码。

代码是编译器能够理解的文本,因此可以使用任何喜欢的文本编辑器,比如notepad、vi、emacs等。 但更推荐使用专门为编程设计的编辑器,下一章节会进行介绍。

好的编辑器使编程更加容易:

  • 显示行号。当程序编译失败时,编辑器提示某一行存在错误,有行号的编辑器能定位到错误位置。
  • 语法高亮。语法高亮帮助我们结构化理解程序,清楚展示程序不同组成部分。
  • 挑选合适的字体。要能区分数字「0」和字母「O」、数字「1」和字母「I」(大写i)以及「l」(小写L)。推荐选用等宽字体(monospaced font),便于对齐代码缩进。字体名称中含有「mono」的一般是等宽字体,例如「DejaVu Sans Mono」就是不错的选择。

下面是一个带行号与语法高亮的例子:

1
2
3
4
5
6
7
#include <iostream>

int main()
{
    std::cout << "Hello World!";
    return 0;
}

C++程序文件以「.cpp」为文件后缀,也有人喜欢使用「.cc」后缀,这里推荐使用「.cpp」。

大多数C++程序都会由多个cpp文件组成。大型C++程序,可能有成千上万的cpp文件。 我们从含有单个cpp文件的程序开始学习和编写。


编译

在得到可执行程序前,需要使用C++编译器对C++源代码进行编译。目前比较流行的编译器有GCC、LLVM、MSVC。

在编译「.cpp」文件时,编译器主要做如下操作:

  1. 检查代码是否符合C++语言规范。如果不符合,会给出对应有问题的行号,直到代码中所有的语法错误都被修改完才能通过编译。
  2. 将代码转换成由机器语言组成的文件,称为「目标文件」。后缀是「.o」或者「.obj」,前缀与对应的cpp文件名一致。

如下,有3个「.cpp」文件,生成3个对应「.o」目标文件。

编译


链接

为得到最终的可执行文件,需要使用「链接器」将目标文件组合到一起。需要链接的内容包括如下三部分:

  1. 编译器产出的目标文件
  2. C++标准库。C++语言本身不提供太多功能,许多额外的实用功能被打包到「C++标准库」中。一般情况下会默认链接C++标准库,不需要额外设置。
  3. 其他预编译好的库文件。将许多目标文件打包到一起,供其他程序使用其功能,这就是库文件。例如,如果想编写播放音乐的软件,需要解析与验证音频、让硬件来播放,完成这些功能需要大量的编程工作。为此,可以下载已经编写好的支持这些功能的库,利用别人的库来快速开发程序。
链接

在产出最终的可执行文件时,链接器会检查所有跨文件的依赖关系。例如,在A.cpp中定义了某个功能,在B.cpp中使用,链接时就会将这些依赖连接起来。

如果发现某个功能找不到定义或存在重复定义,链接器会给出对应的报错信息。


测试与调试

至此,运行最终得到的可执行文件,「测试」一下运行结果是否符合预期。

如果程序不能正常工作,就需要「调试」程序,找出问题所在。后续章节会详细讲解如何调试。


0.2 C与C++

上一节

0.4 安装开发环境

下一节