1.python和脚本语言
python给人的第一印象是一种脚本语言,这里援用维基百科,对脚本语言做解释【脚本语言(Script language,scripting language,scripting programming language)是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。】由此可见,脚本语言最重要的特性是省去了“编译--链接”的过程,通常是解释--运行,python也不例外。但是python通常可以被定义为面向对象的脚本语言,它将面向对象支持和脚本语言全面的融合了在一起。脚本语言通常也可以称为解释语言。
2.Python的执行过程
python目前标准的实现方式是将源代码文件编译为字节码的形式,之后再将字节码解释出来,字节码是一种和平台无关的格式,字节码不是二进制码,援用维基百科【字节码(英语:Bytecode)通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java语言】。字节码可以提高执行的速度,比起源代码要快的多。
如果python在机器上拥有写入权限,编译的过程会将源代码保存为一个以.pyc为扩展名的文件,下一次运行程序时,如果你未修改过源代码,python会直接加载.pyc文件并跳过编译步骤。如果无写入权限,字节码将在内存中生成,程序结束时丢弃。
3.python是脚本语言吗?
python的执行过程可以知道,python是先编译,再解释,运行的过程,因此不能完全说python是解释性语言,它有编译只是不太彻底,同时python又让你看起来像解释性语言,他在执行效率和可用性上做了折中。可以说python是一门先编译后解释的脚本语言。
4.PVM和JVM
众所周知,jvm是java能跨平台运行的核心。java的运行方式同样是将源代码编译成字节码后,在jvm下运行。pvm一样也是执行pyc字节码,那jvm和pvm到底有什么区别和联系呢?性能上又有什么差异呢?
4.1.区别
先援用一段stackoverflow上的回答:http://stackoverflow.com/questions/441824/java-virtual-machine-vs-python-interpreter-parlance
he term "bytecode" is used in both Java and Python, but not all bytecode is created equal. bytecode is just the generic term for intermediate languages used by compilers/interpreters. Even C compilers like gcc use an intermediate language (or several) to get the job done. Java bytecode contains information about primitive data types, whereas Python bytecode does not. In this respect, the Python (and Bash,Perl,Ruby, etc.) virtual machine truly is fundamentally slower than the Java virtual machine, or rather, it simply has more work to do. It is useful to consider what information is contained in different bytecode formats:
* llvm: cpu registers
* Java: primitive data types
* Python: user-defined types
To draw a real-world analogy: LLVM works with atoms, the Java virtual machine works with molecules, and The Python virtual machine works with materials. Since everything must eventually decompose into subatomic particles (real machine operations), the Python virtual machine has the most complex task.
Intepreters/compilers of statically-typed languages just don't have the same baggage that interpreters/compilers of dynamically-typed languages have. Programmers of statically-typed languages have to take up the slack, for which the payoff is performance. However, just as all nondeterministic functions are secretly deterministic, so are all dynamically-typed languages secretly statically-typed. Performance differences between the two language families should therefore level out around the time Python changes its name to HAL 9000.
上面这段文字,大致的意思是,虽然都是字节码,但是pyc和.class文件在创建的级别不同,.pyc类似物质,.class类似原子。我的理解是,如果想执行.pyc需要调用可执行的c函数(c实现的话),段落最后也提到一切动态的最终要演变成秘密的静态。而反观jvm的实现,jvm是有完成的机器架构的,对于字节码来说jvm是一个完整的设备结构,jvm包括了以下5个实现:
-
JVM指令系统
-
JVM寄存器
-
JVM 栈结构
-
JVM 碎片回收堆
-
JVM 存储区
因此可以说对于.class是jvm机器下exe,显然.class更接近机器代码。
4.2.共同点
既然都是字节码,那么java是不是也是编译--解释--执行的过程呢?java是否也是解释性语言呢?
答案是显然的,java也是经过了编译--解释--执行的过程,可以说java和python都是带编译的解释性语言。
4.3.性能差异
经过4.1节的讨论,可以得出以下结论,java的执行效率优于python,但是java实现了众多寄存器等的特点,内存占用方面肯定比python要大的多。
5.pyc到底包含了些什么?
直接援用吧,呵呵,讲的太详细,都不想自己思考了
http://blog.donews.com/lemur/archive/2006/02/21/736881.aspx
6.可以发布了
搞了几天,凑凑拼拼发了一篇文章,当然不是为了写文章而文章,而是在有疑问的时候,试着去理解,也有个记录,同时也做一个分享,这里部分我自己的理解,部分网上截取过来的,算是对python的执行过程有了一个大概的了解。
书读百遍而自知,我想以后的理解可以更深入吧。
python这么好一个脚本语言,出来了这么多年,最近才开始了解他,惭愧之极。
技术的路,还很远。