现在我们用的高级语言有很多,c语言c++等。关于计算机语言的简单编译原理,以及高级语言的移植性的通俗点的说明网上很少。因此,有很多同学有时候很迷惑,到底我们用高级语言写的程序最后怎么在机器上运行的,还有在windows下编译的高级语言写程序能在linux下运行吗?

带着这些疑问,我们开始我们的探索路程吧。

我们先简单的说明一下编译过程:

我们都知道,高级语言的出现很方便编程者,但是计算机只识别机器指令(也就是计算机能听懂的语言)。如果你说的语言计算机不能直接识别,那么你就需要有一个翻译,而这个翻译就是编译器。

简单的编译原理:

比如:一个c语言写的project,其中的每个文件都要经过编译生成一个单独的二进制文件(一般为*.o),所谓编译就是把高级语言翻译成计算机能直接听懂的语言。然后还有一个链接过程,就是把这些.o文件统一连接成最后的可执行文件。即最后能在机器上运行的程序。

上面说的是编译器的最简单的作用,编译器的具体原理是很复杂的,本人知识有限。呵呵

这只是让大家理解一下编译器是干什么的。还有高级语言是要经过编译器编译才能在机器上运行的。

所谓跨平台:

跨平台分为跨操作系统平台(比如,你在linux下建立的project,想在windows下运行),跨硬件平台(比如,你在linux下开发arm板子上运行的程序)。这些都叫跨平台。

和跨平台有关的内容:

经常看到高级语言(如c语言),是一种和硬件、操作系统无关的高级语言,即完全跨平台。

前面已经说过,在windows编译的c语言程序,在linux下是不能运行的。有人就可能会问:c语言不是夸平台的吗?、

原因是这样的:简单的说,你的操作系统环境不一样,程序不能执行是很容易理解的。

如果你写的c语言是符合ANSI(百度一下)    标准的。那么,在操作系统层次上移植是很简单的,只要换个编译器即可。这个程序想在windows下运行,用vc等windows编译器,如果想在linux下运行,用linux编译器编译。

好了,看到这里是不是有点明白了,其实c语言的标准是一样的,想在什么环境和硬件平台上运行就用什么环境和硬件平台的编译器。其实,就是你用中文写了一篇文章,如果你想发给一个美国朋友看,你要翻译成英语,而你要发给德国的朋友,你要翻译成德语。这个是一样的道理。

下面再说一下我们平时写的程序和开发项目时,要做移植的话有时候就有点麻烦。

这是为什么那。

是这样的:如果我们的project全部使用ANSI标准写的话,移植也就换个编译器的事。

但事实上,我们不可能从头开始写自己的project,一般会用到库文件。所谓库文件,就是别人帮你写好的程序,只不过是已经编译好的可执行的程序(大家想想,编译好的是不是就只针对一个平台了)。打个比方,你在家里的时候吃水果,一开始你每次都是现去商场买,然后拿回家吃。后来你发现这样太费事,你就去商场买了很多水果,拿回家放进冰箱。下次你再想吃水果,从冰箱拿就行了。这样就方便了不是。其实语言里的库文件也是同样的道理。

如果一段代码你经常重复使用,你最好也把它写成通用的,然后编译好放到仓库里。好了,这就是库文件。关于库文件的详解见:

http://hi.baidu.com/%D5%C5%C1%AC%C6%B8/blog/item/4c47942c5aad2524c995597a.html

 

那有人会问,库文件一般在哪,怎么用呀。

其实,我们写的一般的c语言肯定要用到库文件的。

编译器就提供一些标准的c语言库文件。例如:<stdio.h>头文件里定义的所有的函数,都是用到的别人给你写好的库函数。现在大家想一想,你用的printf()函数咱们是不是并没有实现。而是用的别人的。

也许又有人会问,那编译器给提供的是编译好的程序,不就不能跨平台了吗。对,只不过标准库函数在所有的编译器中都给你实现了相应的函数。所以,如果你用的是标准库函数,那么你就不用关心移植问题。可能有时候在不同平台下的编译器对标准库函数的实现函数名不一样或存放的头文件不一样。这个要查相关编译器的资料。

还有,如果你用到其他的库文件的话,你就要重新编译成你要用的平台的可执行文件。

关于跨平台,说的可能有点繁琐,只是让大家认识到库是怎么回事,我们写的程序是用到别人的库的。其实,写程序就是把问题分解成一些小的程序块,用语言解决之。然后再重复利用这些小的程序块。说白了,写程序就是把大的问题分解,然后尽量重复利用这些小的程序。

而库文件就是这些小的程序。

好了,先写到这吧

版权声明:本文为博主原创文章,未经博主允许不得转载。