文章目录

  • 解释型语言?编译型语言?
    • 1. 为什么要有解释型语言?
    • 2. `.pyc`文件
    • 3 对于python是解释型还是编译型的判断
      • 3.1 字节码和机器语言的区别
      • 3.2 解释器和虚拟机
    • 4. 为什么要有解释型语言?(个人拙见)

前言:一个人,闲着没事,就喜欢胡思乱想,这一想就想出了很多东西,因此就充满了疑问,这又是一个百度的下午。看了很多篇博文,思路始终很是凌乱,不知道怎么写,有些内容看完就忘记了,但是我还是要进自己最大的努力去把下午看过的内容进行总结,这样也不枉费这一下午百度的流量。如果您和我一样,对python的运行有一些疑惑那么请您仔细阅读这篇文章,我写了很久,虽然我不能保证看完您就对python底层的运行机制彻底了解,但是应该也会有一个大体的流程,大致的框架。

解释型语言?编译型语言?

相信很多初学python的人都被告知python是一种解释性语言。那么我们要思考的第一个问题就是

什么是解释型语言?什么是编译型语言?python到底是解释型还是编译型?

  • 编译器

    计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序。将其他语言翻译成机器语言的工具,被称为编译器。

    编译器翻译的方式有两种:一个是编译,一个是解释。两种方式之间的区别在于翻译时间点的不同。当编译器以解释方式运行的时候,也称之为解释器。

  • 解释型语言:

    解释型语言,是在运行的时候将程序翻译成机器语言。

    解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低。

    通俗一点讲就是:由于计算机底层不能识别高级语言,因此我们写的代码需要被翻译成机器语言给计算机硬件,他们拿到机器语言后才能执行相关的操作;而解释性语言的原理就是翻译的时候,是逐行翻译的,也就是把你写的代码一行一行的翻译给机器,然后机器再执行;如果再次运行的话也是如此,机器不会因为执行过这个代码就会有所记忆,他依然需要解释器来为他逐行翻译代码。

  • 编译型语言:

    编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)

    程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。

    也就是编译器一口气将整个代码全部翻译成了机器语言,然后交给底层设备去执行。

  • 解释型和编译型的区别
    我们这么设想一个场景:
    现在有一个老板(高级语言),一个翻译(编译器),一个外国工人(计算机硬件)。

    老板想让工人按照自己的想法做一个产品,但是老板不会说外语,因此需要翻译将老板的想法告诉工人。

    那么就有两种翻译方式:

    1. 解释型翻译
      老板说一句,翻译翻译一句给工人,工人执行一步。
    2. 编译型翻译
      翻译将老板的所有想法翻译好成一个文本,然后交给工人,工人拿着文本看完开始干活。

1. 为什么要有解释型语言?

既然编译型语言速度更优,要求更低,那么为何还会有解释型语言的产生?

在这里,我们先不讨论为什么会有解释型语言的产生,我们先来看今天我引发这一系列问题的导火索—>.pyc文件。

2. .pyc文件

今天闲着没事干突然觉得,python文件中有一个__pycache__好不顺眼,就点开看了看,一看就是一下午:


我们发现在这里面竟然藏着一个test1.cpython-37.pyc。我很好奇,这是个啥?为啥只有test1的?test2呢?通过字面意思我们大概知道这个文件夹是一个python缓存文件夹,而.pyc是一个complied文件。

没错,这是一个complied类型的文件。当时我就懵了,说好的解释型语言呢?关键是这玩意打也打不开,用记事本打开还是乱码。(什么?不相信?不信就看看!)

这玩意谁能看懂?如果有能看懂的就请滑倒屏幕最下方点个赞然后走吧!
继续正文啊,这东西,一看就不是个正常的东西,那不正常的东西一定要用不一般的软件给他破了。

嗯,虽然这次我还是看不懂,但是他最起码看起来正常点了。对吧!
通过查阅资料,我知道这个pyc文件大有来头。
首先,这个东西他不是随随便便就有的,他的出现,有他出现的道理:
我们先看两张图:


我这么多python代码,才有两个有pyc文件,看着爆率多么低,至少也是ssr级别的。

可是这样就更懵了有木有,说好的解释型语言,突然蹦出来一个编译文件,完了还是凭概率给你beng出来。你以为玩游戏抽奖呢?

那么接下来我们就来解开pyc的神秘面纱!
首先我们来看一下产生pyc文件的条件:

  1. 当你写的py文件被别的py文件当做模块调用的时候,会生成.pyc文件。
  2. 可以执行python -m test.py来生成.pyc文件
  3. 利用py_compile来产生py文件
    import py_compilepy_compile.compile('test2.py')
    

那么.pyc这个东西是干什么用的呢?

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

对于Python编译器来说,PyCodeObject对象是其真正的编译结果,它存储在内存中,而pyc文件只是这个对象在硬盘上的表现形式。

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

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,先对.pyc文件和.py文件的最近一次的修改时间进行判断,如果.pyc文件的修改时间晚于.py文件,说明.py文件中的源代码未修改过,则Python会根据pyc文件中记录的编译结果直接建立内存中PyCodeObject对象,而不用再次对源码进行编译了,否则就重复上面的过程。而把py文件的编译结果保存到pyc文件,最大的优点在于在运行程序时,不需要对该源码重新进行编译。

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

因此我们知道,.pyc就像是一个缓存,便于我们下次使用的时候能够提取的更快。

3 对于python是解释型还是编译型的判断

那么,通过上面两千多字的描述,我们大概知道了,哦,原来python再被执行的时候,可能会被编译成.pyc文件。那么,为什么要称他为解释型语言?他既然有了编译成.pyc的这个过程(尽管不是一定会有),那么说他是解释型语言是不是有点勉强?

此时,我们再来看一下,百度百科给编译型语言的定义:

运行编译型语言是相对于解释型语言存在的,编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)

这里要对首先将源代码编译生成机器语言划重点。编译型语言是直接将高级语言翻译成为了机器语言。而我们的python是么?当然不是,我们的python是将高级语言翻译成了字节码。那么问题又来了?字节码和机器语言是一个东西么?

3.1 字节码和机器语言的区别

  • 机器语言
    这里先给出百度百科的定义:

    机器语言是机器能直接识别的程序语言或指令代码,勿需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。

    简单来说就是机器语言是我们底层设备直接能读懂的语言。

  • 字节码

    字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位。

    字节码,我们的底层设备是看不懂的,他需要被进一步翻译成机器语言才行。字节码主要为了实现和软件环境、与硬件环境无关的特定软件的运行。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。

    字节码是一种中间码,需要被虚拟机进一步翻译成为机器语言。

简书的一篇博文中有一张图片可以参考一下,来了解这个过程:

3.2 解释器和虚拟机

那么在谈到机器语言和字节码,我们又不得不提到python解释器python虚拟机

  • python解释器
    首先我们来谈谈python解释器:
    大家应该都知道cpython,1991年,第一个Python编译器(同时也是解释器)诞生。它是用C语言实现的,并能够调用C库(.so文件)。从一出生,Python已经具有了:类(class),函数(function),异常处理(exception),包括列表(list)和字典(dictionary)在内的核心数据类型,以及模块(module)为基础的拓展系统。

    当我们从Python官方网站下载并安装好Python后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。

    当然除了cpython以外,还有基于java的jpython,基于python的pypy等等。

    那么我们的python解释器的作用就是将我们的高级语言翻译成字节码。也就是.pyc文件。

  • 虚拟机
    注意:虚拟机的定义有2个,一种是类似Vmware的系统虚拟机,另一种是虚拟机称之为程序虚拟机。而我们这里谈到的就是第二种–程序虚拟机。

    而在这里我们的程序虚拟机的主要作用就是将解释器编译的字节码翻译成为机器能够识别的机器语言。

那么我们就知道了,我们的python需要先通过python解释器将代码翻译成为字节码,然后在通过虚拟机将字节码翻译为机器码。此时,我们的的机器才能够执行这些指令。

那么到此为止,我们在回头想我们的问题—python到底是解释型语言还是编译型语言?

我个人觉得,这要看如何定义了。
如果按照百度百科的定义:

运行编译型语言是相对于解释型语言存在的,编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)

我们又一次把他请出来了!我们注意到将源代码编译生成机器语言
因此这里对编译型语言的定义可能就是:直接将原码编译为机器语言。
而我们的python是先将原码编译为字节码,然后将字节码翻译为机器语言。
因此,python对于此定义来将可能不属于编译型语言的范畴。

如果另有一种定义说编译型语言就是先将高级语言转换为比他自己低级的语言。那么python可能就又属于编译型语言了。(但是好像并没有这种定义)

因此,我们就知道了为什么python是解释型语言而不是编译型语言了。

4. 为什么要有解释型语言?(个人拙见)

可能读者注意到这个标题我之前已经写过了,但是并未给出一个结论。因为我在前言说过,写这篇文章的时候,因为信息量对我来说很大,而且很难整理,我的思路也有些乱,而且刚开始抛出这个问题就是为了引出以上三个问题,我觉得只有先知道了解释型语言和编译型语言的区别字节码和机器语言的区别以及解释器和虚拟机的作用才能够更深的理解解释型语言的原理,更好的理解为什么要有解释型语言和编译型原因的区别。那么对于解释型语言的存在可能自己的心中也会有一些自己的想法。如果读者们觉得这个排版不好也请见谅,因为我是按照自己的思路来写的。

那么回归正题,为什要有解释型语言?
关于这个问题的答案我没有去查资料,我个人觉得像这么一个已经被普遍使用的东西被发明出来,肯定是有很多需求的。

虽然编译型语言的速度较优,对于机器的要求也比较低,但是他的跨平台性不好。也就是说如果你在windows下编译了一个c,如果把这个编译文件弄到linux下去运行是不行的。因此linux和windows对于机器码的识别是不同的。但是作为解释型语言的python则完成了跨平台的完美衔接。我们知道python是先被编译为字节码。而对于字节码来讲,无论是windows还是linux,各自平台上的虚拟机都能够识别这个字节码,并且翻译为自己底层机器可能识别的机器码。因此,你用python编写的脚本是可以跨平台使用的。

当然,解释型语言肯定还有很多其他需要的原因而被发明。上面这个观点也只是我个人的拙见。因为我的知识储备不够,所以也说不出来更深层次的原因。

到这里文章就结束了,在最后我把我参考的一些资料放在下面,意犹未尽的读者们可以看一下:
python是解释型语言么?
python是解释型语言么?
机器码和字节码
python虚拟机的运行原理
python是用c写的吗
python虚拟机是什么
什么是cpython
解释型语言
编译型语言
python解释器详解

Python?Python!(python是解释型还是编译型)相关推荐

  1. PHP是解释型还是编译型的?

    编译型语言 使用专门的编译器(类似于Windows下的Visual Studio).针对特定平台(操作系统)将某种高级语言源代码一次性"翻译"成该平台硬件执行的机器码(包括机器指令 ...

  2. Java是解释型还是编译型?

    有人说Java是编译型的.因为所有的Java代码都是要编译的,.java不经过编译就无法执行. 也有人说Java是解释型的.因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释型 ...

  3. JavaScript ( JS ) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言

    js是解释型语言? 跟编译型语言相比,解释型语言有几点不同: 1. 运行频率:解释器(Interpreter)一次只解释一行/一段代码,解释完就直接运行,运行后再继续解释下一行/一段代码,直到代码结束 ...

  4. python中动态语言静态语言的定义_作为程序开发,你所需要知道的编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的概念以及区别...

    作为程序开发,你所需要知道的编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言的概念以及区别! 在各式各样的开发过程当中,我相信各位开发小伙伴在开发过程中并没有太关注什么是解释性语言和编译性语 ...

  5. python语言的解释性特点指的是编写的程序不需要编译_解释性与编译型 Python2和python3的区别...

    一 基础: 1.解释型语言与编译型语言的区别 首先,我们编程都是用的高级语言(写汇编和机器语言的大牛除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算 ...

  6. python采用编译型方式执行_Python程序的执行过程 解释型语言和编译型语言

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

  7. python是一种解释型、面向什么的计算机程序设计语言_python语言是一种什么类型...

    python语言是一种什么类型,是一种,类型,语言,是在,程序 python语言是一种什么类型 易采站长站,站长之家为您整理了python语言是一种什么类型的相关内容. python语言是一种什么类型 ...

  8. Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。

    ##解释型/编译型 解释型相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行.比如Python/JavaScript / Perl /Shel ...

  9. python是一种面向____的高级语言_Python 基础教程Python是一种解释型、面向对象、动...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Python 基础教程 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底 ...

最新文章

  1. 文化部随机抽查50家网络表演平台 看看有没有那种内容
  2. AI目前的根本问题——缺乏 自由意志,无法分辨真正的善恶
  3. c++学习笔记之多文件操作
  4. html点击按钮弹出悬浮窗_网课助手1.0 支持悬浮窗搜题等多功能
  5. 【学生信息管理系统】——优化篇(二)
  6. dnn神经网络_机器学习-浅谈神经网络和Keras的应用
  7. python无符号转有符号_Python | 散布符号
  8. 贝索斯前妻再捐2.81亿美元
  9. linux ext3下删除mysql数据库的数据恢复案例
  10. 织梦响应式酒店民宿住宿类网站织梦模板(自适应手机端)
  11. vscode下载与安装教程
  12. java正则匹配_Java正则表达式详解
  13. 如何把谷歌浏览器设置成全黑主题
  14. Wide Deep模型
  15. 经典语录_生命的智慧
  16. 百度地图 web 开发 BMap.point格式
  17. 代谢组+基因组联合分析
  18. 折腾一下,Linux Mint 19 下工作
  19. 广东移动至2020年数据中心机柜规模将近10万架
  20. 使用icecast搭建在线电台并使用ffmpeg推流

热门文章

  1. 32k*16 薪,4 轮拿下腾讯 Offer !(附真题)
  2. Unity功能——Unity离线文档下载及使用
  3. 如何拒绝公司耍无赖?(2)
  4. 获取天气数据 (根据天气接口返回的数据)
  5. pandas —— pd read csv 与df to csv
  6. Pandas DataFrames筛选数据
  7. java斜椭圆_斜椭圆外接正矩形计算方法
  8. 微型计算机P42.4G表示,在微型计算机的配置中常看到“P42.4G”字样,其中数字2.4表示______。A.处理器的时钟频率是2.4GHzB....
  9. html桌面倒计时代码,JavaScript实现简单的数字倒计时
  10. Mac 连上无线网络,无法上网