初识Python解释器————解释器模式(后续更新...)

 
学习网页:

Welcome to Python.orghttps://www.python.org/icon-default.png?t=N7T8https://www.python.org/

Python解释器

Python解释器是用于执行Python代码的程序。Python解释器将Python代码转换为机器语言并执行它。

Python解释器有多种实现,包括CPython、IPython、Jython和IronPython。

  1. CPython:这是Python的官方解释器,也是使用最广泛的解释器之一。它使用C语言编写,可以用于多种平台,包括ARM、iOS和RISC。
  2. IPython:这是一个基于CPython之上的交互式解释器,它只是在交互方式上有所增强,但执行Python代码的功能与CPython完全相同。
  3. Jython:这是运行在Java平台上的Python解释器,可以直接将Python代码编译成Java字节码执行。
  4. IronPython:这是运行在.Net平台上的Python解释器,可以直接将Python代码编译成.Net的字节码。

在CPU上真正执行一行Python代码之前,涉及以下四个步骤:Lexing(将人造源代码转换为一系列逻辑实体,即所谓的词法标记)、解析(在解析器中,检查词法标记的语法和语法,解析器的输出是抽象语法树(AST))、编译(基于AST,编译器创建Python字节码,字节码由非常基本的、独立于平台的指令组成)和解释(解释器获取字节码并执行指定的操作)。

”举个栗子“

来扩写Python解释器的工作原理。

假设我们有以下Python代码:

x = 5  
y = 10  
print(x + y)

当这段代码被提交给Python解释器时,解释器会按步骤执行:

  1. 词法分析(Lexing)

解释器首先将代码分解成一系列的词法单元或标记。例如,x = 5会被分解为x=5等标记。

     2. 语法分析(Parsing)

接下来,解释器会根据Python的语法规则检查这些标记。它构建一个抽象语法树(AST),这是一个代表代码结构的树状结构。对于我们的例子,AST可能看起来像这样:


	rust`Assign(targets=[Name(id='x')], value=Num(n=5)) 

	| 

	└──Print(values=[BinOp(left=Name(id='x'), op=Add(), right=Num(n=10))])`

编译(Compilation)

基于AST,编译器生成字节码。这些字节码是平台无关的,可以在任何支持Python解释器的系统上运行。对于我们的例子,生成的字节码可能类似于以下形式(这只是一个简化的表示):


	go`LOAD_GLOBAL x 

	LOAD_GLOBAL 5 

	STORE_FAST x 

	LOAD_GLOBAL y 

	LOAD_GLOBAL 10 

	STORE_FAST y 

	LOAD_GLOBAL x 

	LOAD_GLOBAL y 

	ADD_FAST x y 

	LOAD_GLOBAL x+y 

	PRINT_NEWLINE`
  1. 解释执行(Execution)

最后,解释器执行这些字节码。它按照字节码的顺序逐条执行,最终输出15,这是xy的和。

这就是Python解释器如何处理和执行Python代码的基本过程。当然,实际的解释器实现会更加复杂,包括错误处理、优化、垃圾收集等其他功能。

解释器模式

解释器模式是一种行为型设计模式,它提供了一种方式来解释和执行特定语言的语法或表达式。在解释器模式中,解释器通过将表达式转换为可以执行的对象来实现对表达式的解释和执行。

解释器模式通常用于处理自然语言处理、数学表达式计算、正则表达式匹配等问题。在解释器模式中,通常会涉及到以下几种角色:

  1. 抽象表达式(Abstract Expression):定义了解释器的接口,包含了解释器可以执行的方法。
  2. 终结符表达式(Terminal Expression):终结符表达式是无法被分解的表达式,它们实现了抽象表达式的接口,但是不包含子表达式。
  3. 非终结符表达式(Non-Terminal Expression):非终结符表达式是可以被分解的表达式,它们实现了抽象表达式的接口,并包含了子表达式。
  4. 上下文(Context):上下文对象用于保存解释器执行过程中的状态。
  5. 客户端(Client):客户端创建解释器并将需要解释的表达式传递给解释器。
“举个栗子”

以下是一个简单的Python解释器模式的例子。

假设我们要实现一个简单的四则运算计算器,可以使用解释器模式来实现。

首先,我们定义抽象表达式接口:

class AbstractExpression:  
    def interpret(self, context):  
        pass

然后,我们定义四种运算符对应的非终结符表达式:

class Addition(AbstractExpression):  
    def interpret(self, context):  
        return context.left_operand + context.right_operand  
  
class Subtraction(AbstractExpression):  
    def interpret(self, context):  
        return context.left_operand - context.right_operand  
  
class Multiplication(AbstractExpression):  
    def interpret(self, context):  
        return context.left_operand * context.right_operand  
  
class Division(AbstractExpression):  
    def interpret(self, context):  
        if context.right_operand == 0:  
            raise ZeroDivisionError("Division by zero")  
        return context.left_operand / context.right_operand

接下来,我们定义终结符表达式:

class Number(AbstractExpression):  
    def __init__(self, value):  
        self.value = value  
      
    def interpret(self, context):  
        return self.value

最后,我们实现语法分析器和解释器:

class Calculator:  
    def __init__(self):  
        self.context = Context()  
      
    def parse(self, expression):  
        # 这里省略了语法分析器的实现,可以将表达式解析为语法树,并返回语法树和非终结符表达式的组合。  
        pass  
      
    def evaluate(self, expression):  
        # 这里省略了解释器的实现,可以将语法树解释为结果。  
        pass

在客户端中,我们可以使用Calculator类来计算四则运算表达式:

calculator = Calculator()  
expression = "2 + 3 * 4 / 2 - 5"  # 输入的表达式为 "2 + 3 * 4 / 2 - 5"  
parsed_expression = calculator.parse(expression)  # 解析表达式为语法树和非终结符表达式的组合  
result = parsed_expression.interpret(calculator.context)  # 解释语法树并计算结果  
print(result)  # 输出结果为 -1,因为 (2 + (3 * 4 / 2)) - 5 = (-1) - 5 = -6 的相反数为 -1。

这就是一个简单的Python解释器模式的例子,它可以根据用户输入的表达式计算出结果。

小结一下

总的来说,解释器模式是一种实现自定义语言解释器的有效方法,它可以提高代码的可维护性和可扩展性,同时还可以使程序更具可读性和可理解性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/248271.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT 魔力涌现

GPT 二、Prompt 的典型构成 角色:给 AI 定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」指示:对任务进行描述上下文:给出与任务相关的其它背景信息(尤其在多轮交互中&#xff…

Feign调用服务报错:Load balancer does not have available server for client:xxx

1.说一下遇到的bug:,(黑马程序员springcloud的第30集,基于Feign远程调用) 3个服务正常启动: 访问http://localhost:8080/order/101 服务器报错日志:(orderservice想调用userservice结果找不到userservice&…

【EMQX】通过EMQX webhook实现转发消息到Python web服务器

EMQX webhook消息转发Web服务器 一、前言二、实现1、EMQX服务器搭建EMQX下载、安装、启动 2、本地Web服务搭建创建Flask项目代码 3、EMQX中创建webhook数据桥接4、EMQX中创建数据转发规则 三、效果 一、前言 需求:获取设备通过mqtt协议发送过来的数据并将数据保存到…

cgal教程 3D Alpha Wrapping

文章目录 3D Alpha Wrapping (3D alpha 包裹)1 介绍2 方法2.1 算法2.2 保证 3 接口4 选择参数4.1 alpha4.2 Offset4.3 关于“双面”包裹的注意事项 5 性能6 例子 3D Alpha Wrapping (3D alpha 包裹) 原文地址: https://doc.cgal.org/latest/Alpha_wrap_3/index.html#Chapter_3D…

数智赋能进行时 百望云荣获第四届长三角“金融科技领军企业”奖

近日,由上海金融业联合会、上海市银行同业公会、华东师范大学指导,《金融电子化》杂志社有限责任公司、华东师范大学长三角金融科技研究院等单位联合主办,上海市互联网金融行业协会等单位协办的“2023长三角金融科技节——长三角经济圈金融科…

微服务实战系列之ZooKeeper(上)

前言 历经1个多月的创作和总结,纵观博主微服务系列博文,大致脉络覆盖了以下几个方面: 数据方面(缓存&安全) 比如Redis、MemCache、Ehcache、J2cache(两级缓存框架)、RSA加密、Sign签名…传…

力扣22. 括号生成(java 回溯法)

Problem: 22. 括号生成 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们首先要知道,若想生成正确的括号我们需要让右括号去适配左括号,在此基础上我们利用回溯去解决此题目 1.题目给定n个括号,即当回溯决策路径长度等于 2 n 2n…

学习笔记9——JUC三种量级的锁机制

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/197325.html 多线程访问共享资源冲突 临界区:一段代码块存在对共享资源的多线程读写操作,称这段代码块为临界区 竞态条件:多个线程在临界…

Anaconda文件目录(打开默认路径)更改

Anaconda 文件默认目录更改 每次打开 Anaconda 都在C盘怎么办,如何改为D盘或是其他盘符位置? 可以进行下述操作。 1. 单次修改路径 单次修改路径:在 exe 文件(Anaconda Prompt (Anaconda_py))中写入下面代码: jupyter notebook …

微信小程序ec-canvas(echarts)显示地图【以甘肃省为例】

文章目录 一、效果图二、实现1、下载echarts插件2、定制图形,生成 echarts.min.js 文件3、小程序中使用(1)下载甘肃地图(2)使用 参考文档《微信小程序使用echarts显示全国地图》《如何在微信小程序开发中使用echarts以…

详解Keras3.0 KerasCV API: StableDiffusion image-generation model

Stable Diffusion 图像生成模型,可用于根据简短的文本描述(称为“提示”)生成图片 keras_cv.models.StableDiffusion(img_height512, img_width512, jit_compileTrue) 参数说明 img_height:int,要生成的图像的高度…

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后,后按照Tools->IP Generator顺序,创建IP核,如下图: 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图,生成的.v文件只…

美国 AGU 发布 AI 应用手册,明确 6 大指导方针

爆发性的 AI 应用:风险与机遇并存 在空间和环境科学领域,AI 工具的应用越来越广泛——诸如天气预报和气候模拟,能源及水资源管理等等。可以说,我们正在经历前所未有的 AI 应用爆发,面对其中的机遇与风险,更…

DTC 故障严重程度

文章目录 简介DTC严重性 位定义DTC 类别定义参考 简介 DTCSeverityMask(DTC严重性掩码)/ DTCSeverity(DTC严重性)包含了DTC严重性和DTC类别信息。 DTCSeverityMask(DTC严重性掩码)/DTCSeverit…

找不到mfc100u.dll,程序无法继续执行?三步即可搞定

在使用电脑过程中,我们经常会遇到一些错误提示,其中之一就是“找不到mfc100u.dll”。mfc100u.dll是Microsoft Foundation Class(MFC)库中的一个版本特定的DLL文件。MFC是微软公司为简化Windows应用程序开发而提供的一套C类库。它包…

接口测试工具Postman接口测试图文教程

一、前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上,都无法及时…

牛客网BC107矩阵转置

答案&#xff1a; #include <stdio.h> int main() {int n0, m0,i0,j0,a0,b0;int arr1[10][10]{0},arr2[10][10]{0}; //第一个数组用来储存原矩阵&#xff0c;第二个数组用来储存转置矩阵scanf("%d%d",&n,&m); if((n>1&&n<10)&&am…

【最新版】PyCharm基础调试功能详解

文章目录 一、断点1. 断点的类型a. 行断点b. 异常断点 2. 设置断点a. 设置行断点b. 设置异常断点 3. 管理断点a. 删除断点b. 将断点静音 二、调试功能0. 测试代码1. 设置断点2. 调试的多种启动方式3. 观察调试控制台a. 步过b. 步入c. 单步执行代码d. 步出e. 运行到光标处f. 重新…

vivado约束方法6

生成的时钟 定时约束向导建议在的输出上创建一个生成的时钟顺序单元&#xff0c;当它直接或通过驱动其他顺序单元的时钟引脚时一些互连逻辑。与PLL或MMCM不同&#xff0c;用户逻辑不能将主时钟&#xff0c;因此向导仅提供指定除法系数的选项&#xff0c;如中所示如下图所示&am…

protobuf基础学习

部分内容出自&#xff1a;https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件&#xff0c;简单地说&#xff0c;就是一个消息的协议文件&#xff0c…