一些问题Q&A


C盘

C盘为什么是C盘?

为什么是从C开始的?按照字母表,A,B,C,D... 那么A盘B盘去哪里啦?

答案是,A盘和B盘确实是有的,盘符A和盘符B是为软盘准备的(盘符:标识磁盘的符号,例如A,B,C,D...),后来软盘逐渐淘汰,被硬盘取代,但盘符还是保留了下来。硬盘的盘符是从C开始计算的,A,B,C,D...依次类推,直到Z。

为什么要用这样的(A,B,C,D...)的方式对磁盘进行分配呢?

因为在Windows系统中,在Windows XP之前都是单用户系统(只有一个用户),唯一的用户对所有的资源进行管理。(Windows一开始没有考虑多用户的设计)

为什么不能把软件装在C盘呢?

并不是所有的软件都不能装在C盘,往往有些软件默认装在C盘更有利。(系统会默认从C盘找这些软件(环境变量),如果不预先装在C盘,则需要额外配置)。但对于大多数软件来说,应当避免装在C盘。C盘的权限问题。C盘也被作为虚拟内存(当物理内存不足时将占用虚拟内存),C盘不宜太满。

环境变量

什么是环境?

“人需要空气,水,食物等才能存活。”这里的“空气”、“水”,“食物”等就是人赖以生存的环境。没有这些人类将无法存在,如果将人看作是一个正在运行的系统,那么缺少了这些环境的支持,人就不能够“正常运行”。

什么是变量?

变化的量(例如,x = 1,x就可以看成一个变量。x可以等于任何东西,x = 小明,x = 3.14 等等。x的值可以取任何你想要的(x并不是只能等于某一个值,值是可以任意变化的),然后用x来指代它。)

感谢大神的修正和补充: 相对于上文“X的值”,“X的指代物”更加贴切。(X作为变量可以表示数字,也可以表示字符等等)。 例如在数学中函数与映射,说到函数时,函数的映射的结果是数(从定义域出发映射到实数域或复数域),但是映射的结果不一定是数。

环境变量

就是指 系统要运行起来,所依赖的变量(这些变量构成了系统的 运行环境)。注意,这里的系统并不一定是指整个大的系统(Windows),也可以指一个小系统(比如你玩的游戏)。

环境变量的值通常是文件路径(比如 D:\game\tools 就是一个路径)。系统在真正运行起来之前,会通过环境变量(所指向的位置)寻找能够让运行起来所依赖的文件。比如我现在需要运行一个游戏,游戏启动依赖D:\game\tools 这个路径下的 start_enviroment.exe 文件。如果这个环境变量没有设置(可以到 系统设置 -> 高级 -> 环境变量 中设置环境变量),找不到游戏运行所依赖的start_enviroment.exe文件,那么游戏就无法启动。如果设置了环境变量(比如 新建环境变量 -> 名字设置为game_enviroment,值设置为D:\game\tools,保存之后环境变量生效,重启游戏,系统就会在D:\game\tools这个目录下寻找依赖的文件,找到了start_enviroment.exe,游戏启动成功。)

X86架构和ARM架构

什么是架构

架构可以理解为平台(就好像打游戏,有不同的游戏平台,比如索尼的PlayStaion系列,微软的XBox系列),手机和电脑可以看成是两个不同的平台(因为它们的架构不同)。

架构的应用

电脑一般采用X86架构。手机一般采用的是ARM架构。

同一个软件,会有“手机版”和“电脑版”的区别,比如QQ,有手机版的QQ和电脑版的QQ,虽然都是QQ,但是它们是运行在不同的平台上的(手机QQ是运行在手机上的,是ARM架构,而电脑QQ是运行在电脑上的,是X86架构)。制作QQ软件的人需要分别对不同的平台写不同的代码(虽然功能都是相似的)。

就好像你用笔在纸上写一首诗,和用记事本在电脑上写一首诗,阅读上并没有什么区别(不管是纸还是电脑屏幕,这都不会影响你的阅读),但是它们的实现方式有所不同。一个需要笔纸,而另一个需要一台电脑。

编译

什么是编译

编译,就是指将源代码变成可执行文件的过程。源代码是给人看的字符,可执行文件是给计算机来运行的二进制文件。

用记事本来写代码(代码就是人类能够读懂的一些符号,是给人看的),源代码写好之后,编译器根据不同的架构(平台)来生成对应的可执行文件(也就是二进制文件,用记事本打开会乱码,人无法阅读,这些是给计算机看的,全部都是0和1组成的机器代码)。

编译在行为上可分为编译和链接两部分。编译过程中,产生的中间文件需要链接程序所需要的库(库也就是使程序能够运行起来所需要的环境,参考上文环境部分),最终生成目标文件(也就是对应平台能够运行的二进制文件)。

静态编译

静态编译就是在编译的链接过程中,把程序所依赖的库(也叫环境)一起链接合并到最终的可执行文件中(也就是最后的目标文件,比如 game.exe)。静态编译的好处就是最终的可执行文件可以直接运行,不依赖外部的环境(因为环境已经被打包到可执行文件里面了)。当然也有缺点,如果依赖的环境很多,会导致最终的可执行文件体积变得非常庞大。

动态编译

动态编译和静态编译相反,动态编译在编译的链接过程中,没有把程序所依赖的库(环境)一起链接合并到最终的可执行文件里,那些库(环境)要在可执行文件启动之后再去调用(依赖环境在外部),一旦外部缺少相应的库(环境),程序就无法运行起来。这样做的好处就是减少了最终可执行文件的体积,编译速度也会更快。

(例如比较常见的错误:找不到xxx.dll,dll就是动态链接库的缩写,缺少了所需要的库,程序就无法启动。)

交叉编译

交叉编译是指:通过编译,在一个平台(架构)上生成另一个平台(架构)上的可执行文件。

例如在ARM平台下通过编译生成能够在X86平台下运行的可执行文件。反过来也一样,在X86平台编译生成能够在ARM平台下运行的可执行文件。

分布式编译

若一个程序的源代码(工程量)过于庞大(对于大型项目而言),编译成可执行文件的时间可达几十分钟,几个小时甚至更久。所谓分布式编译,就是将工程内部相互独立的模块放到其他的机器上同时编译,然后再将各个机器编译的结果整合起来的过程。(例如一个工程,一台机器单独编译需要10小时,那么分摊给10台机器同时编译,只需要1个小时,若分摊给100台机器只需要6分钟。编译完成后将各个机器的结果汇总,形成最终的可执行文件。用这种方式可以大大缩短编译所需要的时间。)