C入门1程序编译器和操作系统
C++入门(1):程序、编译器和操作系统
程序、编译器和操作系统
参考书目《C++ primer》《编译原理基础》
在开始任意一门语言的学习之前,很多人习惯于使用一个“软件”(如visual studio 2010),这个软件的功能是你可以把你的“hello world”程序写进去,点击编译,成功后运行,出现一个黑框,显示“hello world”。很多人把这个过程当成一个习惯,但可能没有想过,你写的代码和visual studio以及windows之间的关系。
但我觉得你还是需要简单了解它们之间的逻辑关系和简单的运行方式。此篇博客中,我将会简单的跟大家分享一下程序、编译器和操作系统之间的关系,不对原理做深入的说明,只是告诉你他们是如何一起工作的。这三个内容每一个都是很深的方向,如果你真的想要了解,可以参考《编译原理》及《计算机操作系统》。
程序(机器语言)
我们每天都在跟周围的人说话,使用的就是 语言 。很经典的一句话是:人有人的语言,机器有机器的语言。
机器的语言就是 程序 。
人想要跟机器对话,让机器去做人想做的事情,那你要懂机器的语言是怎么说的,计算机的语言不就是0和1嘛(哭笑脸)。不过计算机刚刚问世的时候,确实是有人只用0和1进行编程的,很强大, 后来出现了汇编,算是计算机语言的一个很大的进步,但程序员还是需要按照机器指令的工作方式思考。后来次出现了C语言这些符合人类思维特征的语言,但这些语言具有很高的抽象程度,你本身的思维逻辑需要够强大,才能设计出好的机器语言。
看一段C++程序
int main()
{
int a=0;
int b=1;
int sum=0;
sum = a+b;
cout<<"a+b= "<<sum<<endl;
return 0;
}
能看得出来,其实我们已经可以很容易的理解到这段代码的含义,这就是程序的进步。
然而,上述这个程序计算机是不可能看懂的,为了能将人类思维写出来的程序“翻译”成机器能理解的程序,计算机领域的“翻译官”—- 编译器(Compiler) 被发明了,后边会详聊编译器。
总之,要学好编程,你首先得有做一个翻译的心理准备,而且你要具备强大的逻辑和抽象的思维。
编译器(编译器与IDE的关系)
说编译器之前,还需要补充一个关于编程语言的知识,很多人听说过编译器,但没有听说过解释器,其实这两个东西是需要在一起讨论一下的。
编译器的运行过程是,给一个源程序(程序员写的)—编译器编译—生成目标程序,目标程序—数据输入—程序运行输出结果。这里可以看出来源程序和目标程序是很独立的两个阶段。
解释器的运行过程是,源程序—翻译一段—执行一段。
打个比方,编译器就像翻译一本书,翻译完了,发给读者看就行了,写书的作者不需要在场;而解释器相当于同声传译,作者说一句,解释器翻译一句,同时还要有读者在场听。虽然这两种翻译方式不同,但需要注意的是, 凡是可以采用编译方式的地方,几乎都可以采用解释的方式。
编程语言有的时候会根据翻译的方式不同分为 编译型语言(如C/C++) 和 解释型语言(如JAVA/C#) ,语言和语言各有优势,翻译的方式也各有优势。
说了这么半天,有人会问,我怎么从来没有感觉到编译器的存在,编译器在哪。其实很多新手习惯了使用上边说的“软件”,这种软件有个专业的叫法—IDE,集成开发环境。
编译器作为其中的一个工具被集成在IDE中了,因此你可能感觉不到,但如果在windows控制台下用javac编译过java代码,或者你在linux的命令行下编译过程序,那个时候你就是直接使用了编译器。
操作系统
在提到一些编程语言的时候,比如Java,有人会说这是一个跨平台的语言,其实说白了就是跨计算机系统。
从我目前的理解来看,在编程语言运行在一台计算机上时,它的很多代码经过编译器之后是可以直接控制硬件进行相应的运算的,但是既然你是在这个计算机系统上运行的,你的输入和输出可能需要依赖操作系统(如windows下的图形界面,.net或mfc)。
所以说操作系统与程序的紧密程度要取决你的 程序所要实现的功能 ,如果你是做UI的,那么你可能要深入了解windows系统的机制,如果你是做核心算法,可能你并不需要在操作系统上花费太多时间。
当然,具体问题还要具体分析,因为本身操作系统就是一门学问,如何能让你的程序更好的跑在系统上,需要你对他有足够的了解。