在学习python之前,我们首先来谈谈python。Python这个语言其实很早就有了,只是我们接触它可能也差不多是2010年之后的事情了。记得在2013年,当时我们所在的公司开始全面从瀑布的传统开发流程转向敏捷模式。对于敏捷来讲,有一些流程和指标,例如dailytest。但是如果想做dailytest那就必须有一套工具能够支撑,我不打算去详细谈如何去设计一个自动化的dailytest框架,只是说在这个机缘巧合之下,我们选择了python作为dailytest的工具语言。
因为我们公司是做机顶盒的,整个测试团队对c/c++是很熟悉的,但是对python是一无所知,为了更快的推进,当时公司专门请来一个人来教大家python,一连上了二十多节课,基本上把python语言的基本语法了解了,然后大家用python来开发这个工具。如果用python开发一个小工具是很快的,但是如果是比较复杂的揉进了业务逻辑的工具,那就需要比较长的时间。
其实说到测试工具,很多不了解测试人往往觉得测试工具是无往不利的,一旦搞定了自动化便可以极大的缩短测试间,这个看法是不太正确的。这个问题回头可以专门写一篇来谈,这里不过多的叙述。
总而言之,python的那句口号:“人生苦短,我用phython。”这句话已经深入人心。说明了python的有优点是快,我们可以用python快速的写一些小工具,这得益于python丰富的第三方库。Python的设计哲学强调简洁性和可读性,所以你可以看到python是通过缩进而不是分号来分割语句的。
Python是一门解释性语言,什么解释性语言呢?所谓解释性语言和编译型语言(C/C++)是相对的。简单来讲,如果你写了一个程序,这个程序需要一次性的编译成机器语言(二进制码),那这种语言就是编译型语言。如果一个语言它可以解释一句执行一句,这个语言就是解释性语言。解释器负责翻译一句执行一句。当然如果在说的深入一点,其实python也不算一个真正的解释器,在我们运行python的时候,我们会发现生成一个pyc的文件,这个文件可以认为和java的class文件一样,是一个中间过程,首先将python的文件编程pyc文件,这个可以理解为python的字节码,然后在通过python的虚拟机一句一句的解释执行。这个python的虚拟机是不是和java的虚拟机有异曲同工之妙?
和java虚拟机一样,python通过python虚拟机实现了平台无关性。什么是平台无关性呢,举个例子,你在windows写的代码同样可以在linux下运行,可能现在大家看这个问题觉得没什么好稀奇的,因为可能觉得世界本来是这个样子的,其实不然。
要深刻体会到这个问题,得回到二十多年前,那时候我的同学小胖正在用java写一个程序,当时java就已经有了平台无关性的说辞了,叫做一次书写多次运行。但是等小胖把windows上用java写好的程序,移植到linux环境下时候,一运行,程序就是各种出错,把他搞崩溃了,嘴里不停骂:shit。其实这就是当是java的平台无关性实现的不好,所有了当时的那句嘲讽:一次书写多次修改。
现在java虚拟机已经很好的实现了平台无关性,甚至是语言无关性。只要你将java编译为字节码,这个字节码可以在任何平台上运行。字节码实现了语言无关性,我们可以讲java编译成字节码,可以将python编译成字节码,这样所有的字节码都可以在java虚拟机上运行。
说到这里,我们都明白了实现平台无关性的关键点是虚拟机,针对windows, linux,mac,都运行相对应的java虚拟机,所以你在windows上生成的jar包,也可以在linux或者mac上运行。因为不论是什么平台的编译器,生成的字节码是一样的,也就是与平台无关,等到执行的时候,不同的平台的虚拟机,再将字节码翻译成对应特定平台的机器指令。同理,python也是一样。
好了,通过python的浅谈,我们扩展到了编译型语言和解释性语言,谈论了两者的区别,同时谈到了虚拟机,这可能和python语言本身没什么直接关系,但是能够简单理解语言是如何运行的,也是有好处的。
其实对于编译本身,这个话题只是一个开端,下一章节,我想详细的谈一下编译的过程,这样我相信对于计算机软件的运行会有一个简单清晰的理解,这也契合我之前说的,我们学习python,而不仅仅是python,而是相关的计算机基础知识。