精华内容
下载资源
问答
  • Python 是一门解释型的编程语言,因此它具有解释型语言的运行机制。计算机程序,其实就是一组计算机指令的集合,能真正驱动机器运行的是机器指令,但让普通开发者直接编写机器...编译型语言编译型语言是指使用专门的...

    5d1ab4babe050126.jpg

    Python 是一门解释型的编程语言,因此它具有解释型语言的运行机制。

    计算机程序,其实就是一组计算机指令的集合,能真正驱动机器运行的是机器指令,但让普通开发者直接编写机器指令是不现实的,因此就出现了计算机高级语言。高级语言允许使用自然语言(通常就是英语)来编程,但高级语言的程序最终必须被翻译成机器指令来执行。

    高级语言按照程序的执行方式,可以分为编译型和解释型两种。

    编译型语言

    编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码,一次性"翻译”成可被该平台硬件执行的机器语言(包括机器指令和操作数),并包装成该平台所能识别的可执行程序的格式,这个转换过程称为编译(Compile)。编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行。编译器,可以理解为就是一个比较复杂的计算机程序,它可以接受一个以高级语言编写的程序,并将其翻译成以某个计算机的机器

    语言表达的等效程序。

    有些程序编译结束后,还可能需要对其他编译好的目标代码进行链接,即组装两个以上的目标代码模块生成最终的可执行程序,通过这种方式实现低层次的代码复用。

    因为编译型语言是一次性编译成机器语言的,所以可以脱离开发环境独立运行,而且通常运行效率较高。但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行程序通常无法移植到其他平台上运行,如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少需要采用特定平台上的编译器重新编译。

    半编译型语言

    此外,还有一种伪编译型语言,如 Visual Basic,它属于半编译型语言,并不是真正的编译型语言。它首先被编译成 P-code 代码(中间代码),并将解释引擎封装在可执行程序内,当运行程序时,P-code 代码才会被解析成真正的二进制代码。

    从表面上看,Visual Basic 可以编译生成可执行的 EXE 文件,而且这个 EXE 文件也可以脱离开发环境,在特定平台上运行,非常像编译型语言。实际上,在这个 EXE 文件中,既有程序的启动代码,也有链接解释程序的代码,而这部分代码负责启动 Visual Basic 解释程序,再对 Visual Basic 代码进行解释井执行。

    解释型语言

    解释型语言是指使用专门的解释器,将源程序逐行解释成特定平台的机器代码并立即执行的语言。

    解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。

    可以这样认为,每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势,就是跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器都负责将源程序解释成特定平台的机器指令。也就是说,解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。

    编译型语言PK解释型语言

    编译型语言和解释型语言的对比如下图所示。

    1562031442109637.gif

    借助上图不难理解,编译型语言和解释型语言的区别在于,编译是对高级语言程序进行一次性翻译,这样的好处是,一旦源程序被彻底翻译,它就可以重复运行,且今后都不再需要编译器和源代码;而如果使用解释器,则高级语言程序每次运行,都需要借助源程序和解释器,其最大的好处就是,程序有很好的可移植性。

    展开全文
  • Python是一门解释型语言?我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成...解释型语言和编译型语言计算机...

    Python是一门解释型语言?

    我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的.pyc文件的是什么呢?c应该是compiled的缩写才对啊!

    为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清一下这个问题,并且把一些基础概念给理一理。

    解释型语言和编译型语言

    计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个"翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。

    编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成集齐语言。运行时就不需要翻译,而直接执行就可以了,最典型的例子就是C语言。

    解释型语言就没有这个编译过程,而是在程序运行的时候,通过解释器对程序逐行做出解释,然后直接运行,最典型的例子是Ruby。

    通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了"翻译”,所以在运行时就少掉了"翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。

    此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹的分成解释型和编译型这两种。

    用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

    再换成C#,C#首相是通过编译器将C#文件编译成IL文件,然后在通过CLR将IL文件编译成机器文件。所以我们说C#是一门纯编译语言,但是C#是一门需要二次编译的语言。同理也可以等效运用到基于.NET平台上的 其他语言。

    Python到底属于哪一种类型?

    其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单的了解一下Python程序的运行过程吧。

    当我们在命令行中输入python hello.py时,其实是激活了Python的"解释器”,告诉"解释器”:你要开始工作了。可是在"解释”之前,其实执行的第一项工作和Java一样,是编译。

    熟悉Java的同学可以想象一下我们在命令行中如何执行一个Java的程序:

    javac hello.java

    java hello

    只是我们在用eclipse之类的IDE时,将这两步给融合成了一步而已。其实Python也是一样的,当我们执行python hello.py时,它也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。

    简述Python中程序的运行过程

    在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。

    我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。

    当Python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

    当Python程序第二次运行时,首先程序会在硬盘中寻找对应的pyc文件,如果找到,则直接载入,否则就重复上面的过程。

    所以我们应该这样来定位PyCodeObject和pyc文件:pyc文件其实是PyCodeObject的一种持久化保存方式。

    我们先来简单看两个例子

    写一段简单的程序运行一下:

    1227373-20190313163445547-1171156814.png

    运行结果:

    1227373-20190313163457431-546479373.png

    我们发现在运行完test.py这个程序后,当前路径下并没有生成相应的pyc文件。那是为什么呢?

    我们再来做一个小测试,将test.py当做模块导入到test888.py文件中,然后在这个程序中运行print_hello这个程序:

    1227373-20190313163510907-372424870.png

    1227373-20190313163527333-583745653.png

    然后运行程序:

    1227373-20190313163538850-1330606062.png

    我们可以发现运行完test888.py文件后在当前路径下出现了一个名叫__pycache__的文件夹,里面包含了一个pyc文件,下面我们来分析一下这个过程到底发生了什么。

    pyc文件的目的

    回想上面我们在分析编译型语言和解释型语言的优缺点时,编译型语言的优点在于,我们可以在程序运行时不用解释,而直接利用已经翻译过的文件。也就是说,我们之所以要把py文件编译成pyc文件,最大的优点在于我们在运行程序时,不需要重新对该模块进行再次解释。

    所以,需要编译成pyc文件的应该是那些可以重用的模块,这于我们在设计类时是一样的目的。所以Python的解释器认为:只有import进来的模块,才是需要被重用的模块。

    这个时候也许有人会有疑问,我的test.py不是也需要运行吗,虽然不是一个模块,但是以后我每次运行也可以节省时间啊!

    OK,我们从实际情况出发,思考一下我们在什么时候才可能运行python xxx.py文件:

    1. 执行测试时;

    2. 开启一个Web进程时;

    3. 执行一个脚本时。

    我们来逐条分析,第一种情况就不多说了,这个时候哪怕所有的文件都没有pyc文件都是无所谓的。

    第二种情况,试想一个web.py的程序,通常是这样执行的:

    然后这个程序就类似于一个守护进程一样一直监视着8000端口,而一旦中断,只可能是程序被杀死或者其他的意外情况,那么你要做的是把整个Web服务重启,那么既然一直监视着,把PyCodeObject一直放在内存中就足够了,完全没有必要持久化到硬盘上。

    再来看看最后一个情况,执行一个程序脚本,一个程序的主入口其实很类似于Web程序中的Controller,也就是说,他负责的应该是Model之间的调度,而不包含任何的主逻辑在内,只是负责把参数转来转去而已,那么如果做算法的同学可以知道,在一段算法脚本中,最容易改变的就是算法的各个参数,那么这个时候将它持久化成pyc文件就未免有些画蛇添足了。

    所以我们可以这样理解Python解释器的意图,Python解释器只是把我们可能重用到的模块持久化成pyc文件。

    pyc文件的过期时间

    说完了pyc文件,可能有人会想到,每次Python解释器都把模块给持久化成pyc文件,那么当我的模块发生改变的时候,是不是都要手动的把之前的pyc文件remove掉呢?

    当然Python的设计者是不会犯这样的错误的,这个过程其实取决于PyCodeObject是如何写入pyc文件中的。

    我们仔细看一下Import模块的源码其实不难发现,它在写入pyc文件的时候,写了一个Long型变量,变量的内容则是文件的最近修改日期,同理,在pyc文件中,每次在载入之前都会检查一下py文件和pyc文件保存的最后修改日期,如果不一致则重新生成新的pyc文件。

    总结

    其实了解Python程序的执行过程对于大部分程序员来说意义都是不大的,那么真正有意义的是,我们可以从Python解释器的做法上学到一些处理问题的方式和方法:

    在Python中判断是否生成pyc文件和我们在设计缓存系统时是一样的,我们可以仔细想想,到底什么是值得扔在缓存里面的,什么是不值得的。

    在运行一个耗时的Python脚本时,我们如何能够做到稍微压榨一些程序的运行时间呢?就是将模块从主模块分开。(虽然往往这都不是瓶颈)

    在设计一个软件系统时,重用和非重用的东西是不是也可以分开来对待,这是软件设计原则的重要部分。

    在设计缓存系统(或者其他系统)时,我们如何来避免程序的过期,其实Python解释器为我们提供了一个特别常见而且有效的解决方案。

    展开全文
  • Python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态地逐行解释运行,即从.py文件的第一行开始逐行运行。 以Python为例,一个.py文件,从执行到输出要经历以下过程:step1 : .py文件编译成...

    Python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态地逐行解释运行,即从.py文件的第一行开始逐行运行。

    以Python为例,一个.py文件,从执行到输出要经历以下过程:step1 : .py文件编译成.pyc文件(字节码文件)step2 : .pyc文件发送至Python虚拟机(Python Virtual Machine,PVM),由其解释运行并输出结果

    展开全文
  • Python是一门脚本解释型语言

    千次阅读 2018-08-03 16:42:30
    step1 : .py文件编译成.pyc文件(字节码文件) step2 : .pyc文件发送至Python虚拟机(Python Virtual Machine,PVM),由其解释运行并输出结果 详细可参考: 《Python学习手册(第4版)》(Mark Lutz著,李军,...

    Python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态地逐行解释运行,即从.py文件的第一行开始逐行运行。

    以Python为例,一个.py文件,从执行到输出要经历以下过程:
    step1 : .py文件编译成.pyc文件(字节码文件)
    step2 : .pyc文件发送至Python虚拟机(Python Virtual Machine,PVM),由其解释运行并输出结果

    详细可参考:

    《Python学习手册(第4版)》(Mark Lutz著,李军,刘红伟译)第39页

    截图如下:
    这里写图片描述

    展开全文
  • Python 是一门怎样的语言

    千次阅读 2017-12-21 09:21:01
    面试题解释/编译?动态/静态?强/弱?Python 到底是一门怎样的语言?编译 or 解释?编译、解释都是指将(与...没错,编译型语言会将全部源代码一次性翻译完成,最终得到可执行文件,所以其主要特征就是「一次编译,多次
  • Python究竟是一门怎样的语言?Python 是一个高层次的结合了解释性、...Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。Python 是交互式语言: 这意味着,您可以在一个Pyth...
  • 先做个总结:Python是一门动态解释型的强类型定义语言。那何为动态?何为解释?何为强类型呢?我们需要了解编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言这6个概念就可知晓。编译型和解释型...
  • 面试题 解释/编译?动态/静态?强/弱?Python 到底是一门怎样的语言? 编译 or 解释? ...编译、解释都是指将(与人类亲和的)编程语言翻译成(计算机能够理解的)机器语言(Machine ...没错,编译型语言会将全部源...
  • Python程序的执行过程(解释型语言和编译型语言

    万次阅读 多人点赞 2018-03-30 11:41:10
    Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的.pyc文件的是什么呢?c应该是...
  • 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c...
  • 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c...
  • Python是一门解释型语言?我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的.pyc文件的是什么呢?c应该是...
  • 先做个总结:Python是一门动态解释型的强类型定义语言。那何为动态?何为解释?何为强类型呢?我们需要了解编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言这6个概念就可知晓。编译型和解释型...
  • 到底python是一门怎样的编程语言

    千次阅读 2018-05-23 16:07:42
    初学python笔记分享:到底python是一门怎样的编程语言Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些...
  • 先做个总结:Python是一门动态解释型的强类型定义语言。 那何为动态?何为解释?何为强类型呢? 我们需要了解编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言这6个概念就可知晓。 编译型和...
  • 解释型,从字面上看,编译和解释都有翻译的意思,它们的区别则在于...两种方式,前者就相当于编译型:一次把所有 代码转换成机器语言,然后写成可执行文件;而后者就相当于解释型:在程序运行的前一刻,还只有源程...
  • 2. Python 是一门什么样的语言 ...​ 优点:编译器一般会有预编译的过程对代码进行优化,因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。 ​ 缺点:编译之后
  • 解释型,从字面上看,编译和解释都有翻译的意思,它们的区别则在于...两种方式,前者就相当于编译型:一次把所有 代码转换成机器语言,然后写成可执行文件;而后者就相当于解释型:在程序运行的前一刻,还只有源程...
  • python是一门什么样的语言 编程语言主要分为编译型和解释型编程语言 编译型和解释型的区别是什么? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行...
  • 解释型,从字面上看,编译和解释都有翻译的意思,它们的区别则在于...两种方式,前者就相当于编译型:一次把所有 代码转换成机器语言,然后写成可执行文件;而后者就相当于解释型:在程序运行的前一刻,还只有源程...
  • 解释型,从字面上看,编译和解释都有翻译的意思,它们的区别则在于...两种方式,前者就相当于编译型:一次把所有 代码转换成机器语言,然后写成可执行文件;而后者就相当于解释型:在程序运行的前一刻,还只有源程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 606
精华内容 242
关键字:

python是一门编译型语言

python 订阅