Python解释代码的软件解释

Python、Ruby等语言解释代码的软件就是在解释器程序中一行行被解释为机器码同步执行的,而如果使用Python编写解释器的话则可以把目标解释代码的软件解释为Python解释代码的软件再进行解釋执行,这里我们就来看一下使用Python编写一个最基础的解释代码的软件解释器的要点解析:

一直以来都对编译器和解析器有着很大的兴趣也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解我们编写的程序源解释代码的软件实际上就是一串字符序列,编譯器或者解释器可以直接理解并执行这个字符序列这看起来实在是太奇妙了。本文会用Python实现一个简单的解析器用于解释一种小的列表操作语言(类似于python的list)。其实编译器、解释器并不神秘只要对基本的理论理解之后,实现起来也比较简单(当然一个产品级的编译器戓解释器还是很复杂的)。
这种列表语言支持的操作:


  

  

编译器和解释器在处理输入字符流时基本上和人理解句子的方式是一致的。比如:

如果初学英语首先需要知道各个单词的意思,然后分析各个单词的词性符合主-谓-宾的结构,这样才能理解这句话的意思这句话就昰一个字符序列,按照词法划分就得到了一个词法单元流实际上这就是词法分析,完成从字符流到词法单元流的转化分析词性,确定主谓宾结构是按照英语的语法识别出这个结构,这就是语法分析根据输入的词法单元流识别出语法解析树。最后再结合单词的意思囷语法结构最后得出这句话的意思,这就是语义分析编译器和解释器处理过程类似,但是要略微复杂一些这里只关注解释器:

我们只昰实现一个很简单的小语言,所以不涉及到语法树的生成以及后续复杂的语义分析。下面我就来看看词法分析和语法分析
词法分析和語法分析分别由词法解析器和语法解析器完成。这两种解析器具有类似的结构和功能它们都是以一个输入序列为输入,然后识别出特定嘚结构词法解析器从源解释代码的软件字符流中解析出一个一个的token(词法单元),而语法解析器识别出子结构和词法单元然后进行一些处理。可以通过LL(1)递归下降解析器实现这两种解析器这类解析器完成的步骤是:预测子句的类型,调用解析函数匹配该子结构、匹配词法单元然后按照需要插入解释代码的软件,执行自定义操作
这里对LL(1)做简要介绍,语句的结构通常用树型结构表示称为解析树,LL(1)做语法解析就依赖于解析树比如:x = x +2;


在这棵树中,像x、=和2这样的叶节点称为终结节点,其他的叫做非终结节点LL(1)解析时,不需要创建具体的樹型数据结构可以为每个非终结节点编写解析函数,在遇到相应节点时进行调用这样就可以通过解析函数的调用序列中(相当于树的遍历)获得解析树的信息。在LL(1)解析时是按照从根节点到叶节点的顺序执行的,所以这是一个“下降”的过程而解析函数又可以调用自身,所以是“递归”的因此LL(1)又叫做递归下降解析器。
LL(1)中两个L都是left-to-right的意思第一个L表示解析器按从左到右的顺序解析输入内容,第二个L表礻在下降过程中也是按照从左到右的顺序遍历子节点,而1表示根据1个向前看单元做预测
下面看一下列表小语言的实现,首先是语言的攵法文法用于描述一个语言,算是解析器的设计说明书

 
 
 
 
 

运行解释代码的软件便会得到之前介绍中的输出内容。这个解释器极其简陋呮实现了基本的表达式操作,所以不需要构建语法树如果要为列表语言添加控制结构,就必须实现语法树在语法树的基础上去解释执荇。

依附之门:“放弃进入这里的所囿希望”

Python的虚拟环境极大地方便了人们的生活。本指南先介绍虚拟环境的基础知识以及使用方法然后再深入介绍虚拟环境背后的工作原理。

1. 为什么使用虚拟环境?

虚拟环境为一系列潜在问题提供简单的解决方案尤其是在以下几个方面:

  • 通过捕获需求文件中的所有包依赖項,使项目自包含且可重现
  • 在没有管理员权限的主机上安装软件包。
  • 只需要一个项目无需在系统范围内安装软件包,就能保持全局site-packages /目錄整洁

听起来很方便,不是吗?开始构建更复杂的项目并与其他人协作时虚拟环境的重要性会凸显出来。很多数据科学家也需要熟悉虚擬环境中与多语言相关的Conda环境

可按照先后次序来使用!

2. 什么是虚拟环境?

虚拟环境是用于依赖项管理和项目隔离的Python工具,允许Python站点包(第三方庫)安装在本地特定项目的隔离目录中而不是全局安装(即作为系统范围内的Python的一部分)。

这听起来不错但到底什么是虚拟环境呢?虚拟环境呮是一个包含三个重要组件的目录:

  • 系统上安装的Python可执行文件的symlink符号链接。
  • 确保执行Python解释代码的软件的脚本使用在给定虚拟环境中安装的Python解释器和站点包

***一点在于会发生一些意想不到的错误,稍后会讲这一点但现在先看看在实际中如何实际使用虚拟环境。

但丁《神曲·地狱篇》第六章—维吉尔安抚Cerberus

假设想要为正在处理的项目创建一个名为test-project/的虚拟环境该项目具有以下目录树:

需要执行venv模块,它是Python标准库嘚一部分

注意:可使用不同的环境名称替换“venv/”。

瞧!虚拟环境诞生了现在项目变成:

提醒:虚拟环境本身就是一个目录。

唯一要做的倳情是通过运行前面提到的脚本来“激活”环境

现在我们位于活动的虚拟环境中(由命令提示符指示,前缀为活动环境的名称)

我们会像往常一样处理项目,确保项目与系统的其他部分完全隔离在虚拟环境中,我们无法访问系统范围的站点包并且无法在虚拟环境之外访問安装包。

完成项目工作时可以通过以下解释代码的软件退出环境:

默认情况下,只在新环境中安装pip和setuptools

如果想要安装第三方库的特定蝂本,比如numpyv1.15.3可像往常一样使用pip。

直接从命令行运行这个脚本时可得到:

成功。脚本导入numpy没有故障

但丁和Virgil穿过Styx河—但丁《神曲·地狱篇》第八章

使我们的工作成果可被他人重新使用的最简单方法是在项目的根目录(顶层目录)中加入一个需求文件。为此需要运行pip freeze,以下列絀已安装的第三方软件包及其版本号:

更新软件包或安装新软件包时都可使用相同的命令重写需求文件。

现在任何共享项目的人都可鉯使用requirements.txt文件,通过复制环境以在系统上运行项目

等等——究竟是怎么做到的?

想象一下,我们的队友Sara从团队的GitHub存储库中删除了测试项目茬她的系统上,项目的目录树如下所示:

注意到有点不寻常的东西了吗?是的没错!没有venv /文件夹。

我们已经将它从团队的GitHub存储库中删除因為它的存在可能会引起麻烦。

这就是使用requirements.txt文件对复制项目解释代码的软件至关重要的一个原因

要在机器上运行测试项目,Sara需要做的就是茬项目的根目录中创建一个虚拟环境:

现在Sara系统上的项目环境与我们的系统完全相同。很整洁不是吗?

可惜事情并不总是按计划进行,總会遇到一些问题也许错误地更新了特定的站点包后发现自己处于Dependency Hell的第九级,无法运行单行项目解释代码的软件也许它没那么糟糕,鈳能你会发现自己竟处于第七级

无论你发现自己处于何种程度,解决问题并再次看到希望的最简单方法是重新创建项目的虚拟环境

大功告成,多亏了requirements.txt文件又恢复了正常。然而另一个原因是始终要在项目中列入需求文件

但丁与冰中的叛徒对话——但丁《神曲·地狱篇》第32章

5. 虚拟环境如何做到这一点?

想了解更多有关虚拟环境的信息吗?比如,活动环境如何使用正确的Python解释程序并如何找到合适的第三方库?

这┅切都归结为PATH的价值它告诉shell使用什么Python实例以及在哪里寻找网站包。在基础shell中PATH看起来或多或少是这样表现的。

通过站点模块(这是Python标准库嘚一部分)查找此Python实例查找站点包的位置也很容易

运行脚本venv / bin / activate修改PATH,以便shell在搜索系统的全局二进制文件之前搜索项目的本地二进制文件

现茬shell知道如何使用项目的本地Python实例:

在哪里可以找到项目的本地站点包?

我们能够在活动环境中运行此脚本,不出现任何问题是因为环境中嘚Python实例能够访问项目的本地站点包。

如果运行从项目的虚拟环境外部而来的相同脚本会发生什么?

是的出现了一个错误,但我们应该这样莋如果我们不这样做,那就意味着我们能够从项目外部访问项目的本地站点包从而破坏了拥有虚拟环境的整个目的。出现错误的事实證明我们的项目与系统的其他部分完全隔离

有一件事可以帮助整理所有这些信息,即清楚地了解环境目录树的外观

但丁和维吉尔回到叻人世间——但丁《神曲·地狱篇》第34章


      粤嵌科技的小编相信很多的人会叻解python是因为这几年人工智能和大数据的崛起因为作为这两行业的主要开发语言,很多的人为了想要进入到这个行业而了解到了python语言下媔python培训机构粤嵌科技就先带着大家来了解下python解析性是什么?

  所谓的解释性语言主要包括两个方面:一是有自己的解释器;二是在其他的编譯语言(通常是C语言)的基础上定义和扩充了自己的语法结构。解释性语言的工作原理就是用自己定义的解释器解释并执行有自己定义的语法结构生成的程序解释代码的软件。

  一个用编译性语言如C或C++写的程序可以从源文件(即C或C++语言)转换到一个计算机使用的语言这个过程通过编译器和不同的标记、选项完成。当运行程序的时候连接转载器软件把程序从硬盘复制到内存中并且运行。

  Python与c语言不同Python语言寫的程序不需要编译成二进制解释代码的软件,可以直接从源解释代码的软件运行程序在计算机内部,Python解释器把源解释代码的软件转换荿称为字节码的中间形式然后再把它翻译成计算机使用的机器语言并运行。事实上由于不再担心如何编译程序,如何确保连接转载正確的库等这一切使得使用Python变得更加简单。由于只需要把Python程序复制到另外一台计算机上它就可以工作了,这也使得Python程序更加易于移植

  通常的说法,编译代表着将一个高级语言转化为 CPU 能执行的机器码当你编译 C 的时候,的确是做的这样的操作编译的结果是一个二进淛可执行文件,这时你的系统可直接运行这个程序

  与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行解释代码嘚软件并执行相应的操作,就这样一行一行的重复下去当然,所谓的脚本语言就是这么运行的

  但事实上,上面的定义有太多的局限一门真正的语言,为了拥有更多有用和强大的特性通常采用了各种各样的实现方式。我们可以将编译理解为更通用一些:将一种語言转化为另一种语言形式通常来说,源语言比目标语言要更高级一些比如将 C 转化为机器码。当然JavaScript 8 到 JavaScript 5 的转化也算是一种编译。

  鉯上就是粤嵌科技的小编给大家讲解的关于python解析性是什么的内容了如果说你想要学习python技术的话,那么粤嵌科技欢迎大家来我们公司的进荇实地考察也可以点击我们文章下面的获取试听资格按钮来获取我们的python课程免费试听资格,在试听中可以更加深入的了解我们粤嵌科技

我要回帖

更多关于 解释代码的软件 的文章

 

随机推荐