# 【知识精讲】C++程序是如何开发的
## Part1
我们已经知道,程序语言可以分为**机器语言**,**汇编语言**和**高级语言** 三个层次——现阶段我们人类开发者能够直接编写的是汇编语言和高级语言,绝大多数情况下用到的还是高级语言。
高级语言的语句是由一些英语单词、数学公式等构成的——对于程序员来说,这些语句相对来说更浅显易懂,但是机器本身却只能识别 000 和 111 构成的二进制代码(也叫**机器码**)。那么,高级语言是怎么变成二进制代码的呢?这中间就要有一个过程——需要一个“翻译器”来帮助我们完成这些事情。
典型的机器码如下图所示——这里使用十六进制数表示二进制代码:
![](https://res.jisuanke.com/img/upload/20160712/cf2c2dc0f25c12f9cd8197d6e06ec20adb96134f.png)
## Part2
具体地说,我们自己用高级语言写的程序,称为高级语言源程序,而将其转化成二进制代码之后的程序,称为目标程序——它已经是完全的二进制机器指令了,这个过程称为编译。那么,是不是有目标程序就能直接运行了呢?我们需要考虑到,如果一个程序比较大的话,那么它可能要有多个模块来协作——就算是简单地向屏幕上输出一个“Aloha Oe”,你也依然需要调用系统库里定义好的输出功能模块。
所以,我们需要把所有需要的模块都合并在一起,才能构成一个可以执行的程序——这个就是程序的链接过程,链接完成之后,才会得到一个可以执行的程序。那么,你肯定要问:编译和链接过程该怎么进行呢?有一些专门的软件可以完成这个过程,这些软件被称为**编译器(Compiler)** 和**链接器(Linker)**。
在编译和链接的过程中,都会对程序中的错误进行检查——只有代码准确无误的程序才能编译成功。如果代码本身有错误的话编译器就会报错,如下图所示。但是需要注意的是,编译通过,并不代表程序本身是完全正确的——你仍然需要通过调试,确认程序可以正确地运行,才能说你的程序是准确无误的。
![](https://res.jisuanke.com/img/upload/20160712/9c28db60af3b1f2ae6beaaf5b385ad0395ddcf48.png)
## Part3
除此之外,还有另一种与之类似的软件,称为**解释器**——在介绍什么是“解释器”之前,我们首先要知道“编译型语言”与“解释型语言”的差别。
所谓“编译型语言”,指的是源程序的代码写好之后,编译器直接把高级语言的源代码编译成二进制的机器码,执行的时候直接运行机器码就行了——这门课程学习的 C++ 语言,是一种典型的编译型语言;而“解释型语言”则与之不同,写好的代码不会马上就被翻译成机器码,而是先保存成源程序的代码文件——等到运行的时候,这些语句才会**由解释器来一条一条地解释执行**——很多脚本语言,比如 Python,都属于解释型语言。
一般而言,编译型语言拥有更高的运行效率,而解释型语言的可移植性更好——此外,还有一些介于两者之间的语言,比如JAVA/C#,就是先编译成某种“中间代码”然后再交由不同平台的虚拟机解释执行的。
## Part4
整个程序开发的过程,可以分为这样的一个流程:设计数据结构与算法->源程序编辑->编译与连接->测试->调试。
在看到这个流程之前,有的同学可能会觉得,要开发程序,就一定需要专用的“编程软件”(学名叫做集成开发环境(Integrated Development Environment),简称 IDE )才行,有的同学可能还见过 Visual C++ 6.0,或者 Dev-Cpp 之类的软件。
![](https://res.jisuanke.com/img/upload/20160712/31e05715f75de23eaa333096083149794cec52f0.jpg)
一款经典的 IDE Code::Blocks
然而,所谓的 IDE ,其实就是把编辑器、编译器和其他的一系列工具整合在一起的产物——毫无疑问,像 Microsoft Visual Studio 之类的先进的 IDE ,在开发很多大型软件的时候,确实可以几十上百倍地提高开发效率。但是实际上,IDE并不是编程活动的必需品——对于初学者来说,只要有用于写代码的文本编辑器,和用于编译代码的编译器工具链,就已经足够了。
## Part5
这门课程使用 GNU C++ Compiler 编译器(也叫 g++ ),它可以在几乎所有主流的操作系统上运行——为了便于练习,我们建议大家在自己的电脑上安装和配置相同的环境,然后搭配一款自己喜欢的文本编辑器使用。
Linux 和 Mac OS X 用户可以使用 Vim 或者 Emacs 等,Windows 用户可以选择系统自带的记事本( Notepad )或者第三方的 Notepad++ 。此外,你还可以选择 Sublime Text,Atom 或者 Visual Studio Code 等跨平台工具。这些工具本身各有千秋,如果可能,你都可以试一试,找到你最喜欢、用起来最顺手的那个(编辑器没有“最好”,只有“最适合你”,千万不要太纠结)。
![](https://res.jisuanke.com/img/upload/20160712/92177cba26c41dc410c101f519be0c981823be9e.jpg)
在Mac OS X 平台下运行的 Visual Studio Code
最后,我们将向大家介绍如何在自己的电脑上编译程序——学完一节代码课之后,你试着在自己的电脑上编译运行一下:
## Part6
首先,在文本编辑器中写好代码,然后保存——类似于 C 语言,所有 C++ 语言的代码都是以`*.cpp`文件的形式保存在你的电脑上的。比如你写了一个程序,想要命名为“AlohaOe”,那么这个文件的名字就是`AlohaOe.cpp`。接下来启动你的操作系统自带的控制台(Terminal或者CMD),然后进入到文件所在目录,输入以下命令:
~~~
g++ AlohaOe.cpp -o AlohaOe
~~~
其中,第一个参数代表要编译的文件,`-o`代表输出,最后一个参数代表你想要让编译器输出可执行文件的名字——这里你可以随意更改。如果你的程序没有错误的话,那么这条命令执行之后就不会返回任何提示——反之则会报错并指出你的程序在哪里出了偏差。编译完成之后就可以试着运行你的程序了——在命令行中输入`./AlohaOe`或者`AlohaOe`就可以直接启动你已经编译好的程序。
- 教材介绍
- 《编程初学入门常识》
- 什么是程序语言
- 【知识精讲】编程与编程语言
- 【选择测试】编程语言分类
- 【知识精讲】高级语言分类
- 【选择测试】编译与解释
- 【选择测试】程序员笑话-Java
- 熟悉键盘上用于编程的键位
- 【知识精讲】认识你的键盘
- 【知识精讲】中文和英文字符
- 【匹配测试】识别中英文符号
- 【选择测试】中英文符号的影响
- 【伴随编程】不要使用中文引号
- 【伴随编程】不要使用中文分号
- 【伴随编程】正确地输入符号
- 【选择测试】找出程序中的错误
- 初始工程师思维
- 【知识精讲】二进制思想
- 【选择测试】程序员笑话-凑整
- 【知识精讲】闭合的逻辑
- 【选择测试】程序员笑话-条件
- 程序员职业与生活
- 【知识精讲】程序员的发展方向
- 【知识精讲】程序员的装备
- 【知识精讲】程序员的健康
- 【选择测试】做一名健康的程序员
- 《C++程序设计》
- 前言
- 【知识精讲】编程与计算机科学
- 【知识精讲】编程与软件工程
- 【知识精讲】如何学习编程
- 你好C++
- 【知识精讲】你好,C++
- 【知识精讲】C++程序是如何开发的
- 【知识精讲】成为一名Power User
- 【伴随编程】让我们一起说你好
- 【知识精讲】你的第一个C++语言程序
- 【伴随命令】编译、运行你的程序
- 【伴随编程】将变量流式输出
- 【选择测试】变量的作用域
- 【知识精讲】变量与数据类型
- 【匹配测试】C++语言的入门概念
- 【知识精讲】在程序中学会换行
- 【选择测试】正确地换行
- 简单数学运算
- 【知识精讲】重新认识基本运算
- 【选择测试】运算符的理解
- 【伴随编程】做一下简单的运算
- 【伴随编程】a 的 n 次方
- 【知识精讲】数学函数
- 【伴随编程】让C++语言变成计算器
- 【伴随编程】计算球的体积
- 【匹配测试】数学世界知多少
- 【知识精讲】在程序中添加注释
- 【选择测试】正确地写注释
- 从伴随输入到变量地址
- 【伴随编程】 一个数字复读机器
- 【选择测试】理解标准输入输出
- 【伴随编程】一个加法计算器
- 【程序设计】A+B+C问题
- 【伴随编程】简单的I/O格式控制
- 【知识精讲】地址与取地址符
- 【伴随编程】看看我们的地址
- 习题一:面积与周长
- 【程序设计】矩形面积与周长
- 【程序设计】三角形面积与周长
- 【程序设计】圆形面积与周长
- 程序中的是与非
- 【知识精讲】是非的表示与关系运算
- 【伴随编程】验一验关系运算式
- 【选择测试】关系运算式求值
- 【知识精讲】如果的意义
- 【伴随编程】分段函数求值
- 【知识精讲】如果之后的如果
- 【伴随编程】五则运算器
- 【选择测试】分支的嵌套
- 【伴随编程】问号表达式
- 【知识精讲】是非之间的逻辑组合
- 【伴随编程】判断闰年
- 【程序设计】日期合法性
- 【知识精讲】多路顺序结构
- 【知识精讲】在程序中学会缩进
- 【选择测试】正确的缩进
- C++程序中的苦力
- 【知识精讲】使用循环结构
- 【选择测试】对比两种循环
- 【伴随编程】使用while循环
- 【填空测试】理解循环结构
- 【知识精讲】自减和自增运算符
- 【伴随编程】使用自增运算符
- 【知识精讲】for循环
- 【选择测试】for循环的使用
- 【程序设计】一大波好玩儿的程序
- 《代码能力快速提升》
- 《基础数据结构》
- 《搜索入门》
- 《动态规划基础》
- 《数论和基础数学》
- 《图和数基础》