C++环境与编译
章节概览
我们将在本章讨论以下内容:
a.什么是一个程序(抽象与实现)
b.什么是程序的程序的开发环境
c.什么是程序的编译
d.什么是IDE、compiler、assembler、linker、debugger
我们将在本章实践以下内容:
a.下载C++编译器并编译一个C++文件
b.配置一个C++的(集成)开发环境
c.测试C++文件的基本方法
如果你对本章内容感兴趣,请跳到理论部分开始阅读本章内容。
章节测试
以下测试用来检验本章的成果,如果你感到毫无压力,说明你已经掌握了本章的绝大多数知识,进而跳过本章。或者,你也可以稍后用它来检验你在本节的学习成果。
Q1. 请简述关于“什么是一个程序”的几种历史观点。
Q2. 什么是一个abstraction,什么是一个implemention。
Q3. 请简述代码转换(tanslation)的两种方式,以及对它们的历史观点。
Q4. 请列举三个目前最广泛使用的C++的编译器,并把它们按照支持高级编程语言数目从多到少的顺序排序。并且写出它们在命令行的名称。
Q5. 文本编辑器的功能有哪些?如果IDE警告找不到头文件<iostream>,但是代码可以正常编译运行,可能是什么功能出现了问题?
Q6. 请列举两个目前最广为使用的文本编辑器。
Q7. 我们一般怎么称呼C++的通用调试器(general debugger)?
Q8. c++的项目构建工具有哪些?
Q9. 什么是一个IDE?
Q10. 判定一个程序功能正确,需要满足哪两个条件?
理论部分
论题 1.什么是程序
历史讨论
现代的人可能不会对“程序”一词有太大的困扰,其中很大一部分原因是“习以为常”。但是如果要编写“程序”,或者类似的东西,我们应该仔细考虑一下“程序”到底是一个什么东西。以下是tsq查阅了百度百科的结果,然而,由现代计算机体系结构的观点来看,这些结果是很不准确的,特别是对于从事有关程序方面的人来说:
计算机程序(Computer Program),港、台译做电脑程式。计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写作的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。一般的,以英语文本为基础的计算机程序要经过编译、链接而成为人难以解读,但可轻易被计算机所解读的数字格式,然后放入运行。
程序是一个指令序列。
为了使计算机程序得以运行,计算机需要加载代码,同时也要加载数据。从计算机的底层来说,这是由高级语言(例如Java,C/C++,C#等)代码转译成机器语言而被CPU所理解,进行加载。
或者,如果你查阅计算机科学方面的书籍,它会告诉你“程序”是运行于操作系统抽象层之上的抽象层。
但是,事实上,有些“程序”,比如JAVA程序,往往运行在JVM上;而C#程序,往往运行在.NET上。就算同样是硬件,又有不同的品牌,不同的厂商,不同的型号... ... 要从抽象层(程序运行的环境)这方面来看,有很大困难。
抽象与实现
那么,有没有什么办法来统一大家对于“程序”的观点呢?答案是:“yes”。我们需要先引入程序抽象的定义。
在现代计算机体系结构的观点来看,事物分为两个方面:抽象(abstraction)和实现(implemention)。由行为定义(behavior-defined)的那些称为抽象,而由实现定义的那些称为实现。(注意:我们用“那些”来指代,不论是具体的还是想象的,是实在的还是虚拟的,是物理的还是数字的,都在此定义之内)一个抽象层,是指一个元素均为抽象的集合。
abstraction:又称how,是指一个东西的集合由它的表现(behavior)定义;
implemention:又称what,是指一个东西的集合由它的部分(component)定义;
下面几个例子来帮助读者理解abstraction和implemention。请读者务必理解abstraction和implemention的区别,因为C++几乎所有的内容都是通过abstraction和implemention来定义的。
现代数学的一个主流观点认为,“自然数集合”是满足下列条件的那些集合:①N中有一个元素,记作1。②N中每一个元素都能在N中找到一个元素作为它的后继者。③1不是任何元素的后继者。④不同元素有不同的后继者。⑤(归纳公理)N的任一子集M,如果1∈M,并且只要x在M中就能推出x的后继者也在M中,那么M=N。
按照这个“自然数集合”的观点来看,似乎好多东西都可以成为自然数。例如,一个猴子在黑板上写了一串意义不明的符号:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14。并且这只猴子会按照某种规律(当然,你也许会知道是什么规律)不停地、永远地写下去。我们来看,这些符号是不是满足“自然数集合”的定义呢?答案是“yes”,所以它就是自然数集合。(如果你认为答案是“no”,你可以想一想,如果把猴子写的第一个符号0当作是自然数集合定义中的1,会发生什么)
如果这个猴子写的是另一串意义不明的符号:
1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111,1111111111111,11111111111111。并且这只猴子会按照某种规律(当然,你也许会知道是什么规律)不停地、永远地写下去。我们来看,这些符号是不是满足“自然数集合”的定义呢?答案是“yes”,所以它就是自然数集合。
如果这个猴子写的是另一串意义不明的符号:
0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110。并且这只猴子会按照某种规律(当然,你也许会知道是什么规律)不停地、永远地写下去。我们来看,这些符号是不是满足“自然数集合”的定义呢?答案是“yes”,所以它就是自然数集合。
猴子也许不满足于符号,而是拿出了香蕉,排出了香蕉的阵列: