Python的原理的解释。编程语言分为编译型语言和解释型语言,我们需要了解它们的区别,才能够更好的理解编译器和解释器的区别。
python几个特点:- 面向对象:在本站的《Python3萌新入门笔记》中有专门的文章,简单来说是指在程序设计中能够采用封装、继承、多态的设计方法。
- 动态语言:是在运行时可以改变其结构的语言;例如,在程序运行过程中,给一个类的对象添加原本不存在的属性。
- 动态数据类型:变量不需要指定类型,但需要解释器执行代码时去辨别数据类型;这个特点让编程变得简单,但代码执行效率变低。
- 高级语言:是指高度封装了的编程语言,相对于机器语言,更加适合人类编写与阅读。
- 解释型语言:是指无需编译,直接能够将源代码解释为机器语言进行运行的语言。
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
这里涉及到跨平台的概念,平台可以理解为不同CPU架构(例如X86、ARM等)的机器和同种CPU但不同的操作系统(例如Unix、Windows等)的机器。
早期的解释器就是这样的工作流程:源代码 (source code) → 解释器 (interpreter) 。
源代码无需预先编译成可执行程序。在程序执行时,解释器读取一句源代码之后,先进行词法分析和语法分析,再将源代码转换为解释器能够执行的中间代码(字节码),最后,由解释器将中间代码解释为可执行的机器指令。所以,编译型语言的可执行程序产生的是直接执行机器指令,而解释型语言的每一句源代码都要经过解释器解释为可以执行的机器指令,相比之下解释型语言的执行效率会低一些。
但是,解释型语言在不同的平台有不同的解释器,源代码跨平台的目的实现了,开发人员不用再考虑每个平台如何去编译,只需要关注代码的编写,编写完的代码在任何平台都能无需修改(或少量修改)就能正确执行。
注意:Shell中执行源代码时不会生成中间文件,每次都是读取源代码,转化为字节码后,解释执行。
JIT即时编译器比较典型的例子是在JVM(Java虚拟机)Java程序最初是通过解释器进行解释执行的,当Java虚拟机发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。JIT即时编译器会将这些“热点代码”编译成与本地机器相关的机器指令,进行各个层次的优化。当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地机器指令之后,可以获取更高的执行效率。当程序运行环境中内存资源限制较大,可以使用解释器执行节约内存,反之可以使用编译执行来提升效率。大家都知道,Java程序的运行性能很高,基本上可以和C/C++的程序相媲美。这主要是因为JIT即时编译器可以针对那些频繁被调用的“热点代码”做出深度优化,而静态编译器无法完全推断出哪些是运行时的热点代码,而不能做出针对性的优化。因此,通过JIT即时编译器编译的本地机器指令才会比直接生成的本地机器指令拥有更高的执行效率。
Python有多种解释器,比较著名的有CPython、IPython、PyPy、Jython和IronPython等,其中CPython是Python官方默认的解释器,它是用C语言实现Pyhon解释器。CPython是单纯的解释器,将源代码转化为字节码之后解释执行。而另外一款使用Python实现的Python解释器PyPy,比CPython解释器更加灵活。因为PyPy采用了JIT技术,在程序的运行性能上PyPy将近是CPython解释器执行效率的1至5倍。而其它的解释器都各有特点。IPython是基于CPython增强了交互。Jython是运行在Java平台上的Python解释器。IronPython是运行在.Net平台上的Python解释器。
python解释器工作原理Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。基于C的Python编译出的字节码文件,通常是.pyc格式。
- 执行 python XX.py 后,将会启动 Python 的解释器
- python解释器的编译器会将.py源文件编译(解释)成字节码生成PyCodeObject字节码对象存放在内存中。
- python解释器的虚拟机将执行内存中的字节码对象转化为机器语言,虚拟机与操作系统交互,使机器语言在机器硬件上运行。
- 运行结束后python解释器则将PyCodeObject写回到pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
一、python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库。
二、python是全动态性的,可以在运行时自己修改自己的代码,java只能通过变通方法实现。python的变量是动态的,而java的变量是静态的,需要事先声明,所以java ide的代码提示功能优于python ide。
三,python的产生几十年了,几十年前面向过程是主流,所以用python有好多程序用的是面向过程设计方法,很多概念从c语言过来的,class在python中是后加入的,而java是为了实现没有指针的c++(当年com组件用的引用记数,java用的虚拟机),主要采用面向对象的设计方法,很多概念是oop的概念。面向过程,相对简洁直观,但容易设计出面条程序,面向对象,相对抽象优雅,但容易过度抽象。
四,在实际使用的python入门简单,但要学会用python干活,需要再学习python各种库,pyhton的强大在于库,为什么python的库强大,原因是python的库可以用python,c语言,c++等设计,再提供给python使用,所以无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库在等着你用。而java没有python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码。python虚拟机因为编译性没有java的支持的好(或者说故意这么设计的),一般直接使用源码(linux),或源码简单打个包(如pyexe)。
五、python有很多虚拟机实现,如cython,Pyston,pypy,jython, IronPython等等,适合用于业务语言,或插件语言,或面向领域语言,而java因为虚拟机巨大,很少用于插件语言,发布也不方便。
六、java主要用于商业逻辑强的领域,如商城系统,erp,oa,金融,保险等传统数据库事务领域,通过类似ssh框架事务代码,对商业数据库,如oralce,db2,sql server等支持较好,软件工程理念较强,适合软件工程式的多人开发模式。python主要用于web数据分析,科学计算,金融分析,信号分析,图像算法,数学计算,统计分析,算法建模,服务器运维,自动化操作,快速开发理念强,适合快速开发团队或个人敏捷模式。
七、java的商业化公司支持多,如sap,oracle,ibm等,有商业化的容器,中间件,企业框架ejb。python的开源组织支持多,如qt,linux,google,很多开源程序都支持python, 如pyqt,redis,spark等。
八、python用途最多的是脚本,java用途最多的是web,pyhotn是胶水,可以把各类不相关的东西粘在一起用,java是基佬,可以通过软件工程组成几百个人的团队和你pk,商业化气息重。不过我认为还是python强大,因为可以方便调用c或c++的库,但软件工程和商业化运作没有java好,适合快捷开发。