Inside IronPython: IronPython AST语法树(2/2)

接上篇: Inside IronPython: IronPython AST语法树(1/2)

ASTs简介:

当 ipy.exe 执行demo.py的时候,IronPython语言自身的实现和DLR共同参与源代码的编译处理。从基本层面上来讲,编译器是流水化作业的:从语法解析器生成描述源代码的特定数据结构开始。这个数据结构是个抽象语法树(abstract syntax tree),简称为AST。编译器在完成代码分析阶段后将转换AST或者建立新的数据结构,然后再基于此结果,编译器产生机器码或者虚拟机的中间语言(IL)。

IronPython首先产生一个特定于IronPython的抽象语法树,然后再把这个语法树转换成DLR的语法树。一些语言有自己的语法树的原因是这样可以更好的支持对代码进行分析,也能更好的支持一些基于自有AST的工具(工具需要一个更接近于源代码的AST。许多语言的AST也许和DLR的AST比较相似,但是DLR的AST包含更多关于确切语义含义的信息。你可以认为DLR AST是编译器需要的多个转换中较晚阶段需要的那个。

非常有趣的是DLR使用了和CLR Jit编译技术相似的缓式编译技术:并不是一下子编译全部的代码。这样在第一次运行的时候我们会有一点点的性能损耗,但是以后执行时可以运行的更快。

查看IronPython的AST

回到VS IDE中,按F5执行程序,在断点处暂停(其实在你安装的IronPython中,第一次到达断点时,并不是处理demo.py文件,而是一个名叫site.py的文件。因为在我们的...\Bin\Debug目录下根本没有这个文件,所以就直接处理demo.py文件了)。接下来我们按F10单步执行程序,直到执行了:ast = parser.ParseFile(true);。现在我们就可以在“监视”窗口中查看IronPython的AST了。

由于空间问题, 我只在图中展开了ast.Body的部分成员。AST的根节点是SuiteStatement,表示了一系列的语句,它有一个成员:Statements。展开Statements中的第一个成员,将看到这个成员是个FunctionDefinition类型的节点,它有一个Body成员(又是一个SuiteStatement类型):表示函数的定义,我们可以看到它有一个Name 成员,并且最后它的名字将绑定到结果函数对象。我们展开demo.py中所有元素,它们之间的关系如下图所示:

这样我们就能直观的看到AST树,大部分的节点都有子节点。图中给出了各个节点的类型信息(例如FunctionDefinition类型的节点有一个SuiteStatement类型的子节点。有些节点包含了用缩进和花括号描述的子节点信息。

转载于:https://www.cnblogs.com/Jifangliang/archive/2008/07/30/1256041.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何开通支付宝

一、登录支付宝网站注册: 1、注册支付宝账户 1)进入支付宝网站https://www.alipay.com/点击“免费注册”按钮 进入支付宝网站https://www.alipay.com/,如果图片有不显示的,请刷新一下,或者将鼠标放到红叉的位置&#x…

mysql的aborted_mysql参数:aborted_connects过大

mysql参数:aborted_connects过大(2015-12-31 11:32:08)标签:mysql运维it如果一个客户端在成功连接之后,不正常中断或结束,Aborted_connects将会增加1,并会将日志记录到error日志里。(log_warning设置为2才会记录)原因可…

小白学docker(1)---docker安装

最近学习下docker,并且工作需要,就总结下。 1、Docker安装 a、先查看下CentOS版本 b、查看下Linux内核版本 c、执行wget -qO- https://get.docker.com/|sh 其实就是一个执行脚本来快速安装开发环境docker d、启动sudo systemctl docker start 执行命令确…

.NET平台依赖注入机制及IoC的设计与实现

我们设计的分层架构,层与层之间应该是松散耦合的。因为是单向单一调用,所以,这里的“松散耦合”实际是指上层类不能具体依赖于下层类,而应该依赖于下层提供的一个接口。这样,上层类不能直接实例化下层中的类&#xff0…

php嵌套查询mysql语句_mysql 查询嵌套

问题描述 为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景。 从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且…

征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备

技能献祭,Get 新技能:传奇技能——应用篇,增加新装备与绑特效跟航家学技能,用正式服带你飞,底部有配套学习资源场景:游戏中装备的属性是可以修改的,基础攻防属性可以直接在物品数据库中修改&…

本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...

原文:https://stackabuse.com/quicksort-in-python/作者:Marcus Sanatan译者:老齐欢迎在 bilibili 搜索 freeCodeCamp 官方账号或者直接访问 https://space.bilibili.com/335505768 观看我们的技术视频介绍快速排序是一种流行的排序算法&…

vscode标记_高效扩展工具让 VS Code 如虎添翼

Codelf 变量命名神器Star:10688https://github.com/unbug/codelf新建项目,变量,类,方法,接口都需要命名,一个好的命名可以一眼看出这个地方的功能,CodeIf 一键起名不再难,输入关键词…

CSS 有关Position = absolute (绝对定位 是相对于谁而言)

css中有绝对定位法&#xff0c;以前一直搞不懂绝对定位是相对于谁而言的绝对定位。 现在搞清楚了&#xff0c;不是相对于父元素&#xff0c;也不是相对于BODY。 而是相对于所属元素树中&#xff0c;相邻最近的那个显示标识了position属性的元素。 比如 Code<div id"a&q…

mysql gui vim_vim(一): 小技巧

1) 如何yank字符然后再查找 ( / Ctrl - R 0 ) The most recently yanked text will be stored in the 0 and registers (if no register was explicitly specified e.g. by xy ). Then you can paste the text of any that register in the last line (eith1) 如何yank字符然后…

LeetCode Smallest Range

数据范围是3500,3500也就是说n的平方是可以接受的。这里告诉你就是有序的,也就是在提醒你可能会是一个类似于二分的算法,所以的话其实基于这两个认识的话我们就可以利用一个枚举叫二分的算法来解决这道题。怎么做呢&#xff1f;就首先的话我们要枚举一端,一端的话我们可以把所有…

Web前端3.0时代,“程序猿”如何“渡劫升仙”

Web前端入行门槛低&#xff0c;很多人在成为前端工程师后很容易进入工作的舒适区&#xff0c;认为该熟悉的业务已熟悉了&#xff0c;然后就是重复用轮子&#xff0c;这样很容易让自己的成长处于原地打转以及低水平重复的状态。 想要不被行业抛弃&#xff0c;就要努力提升自己。…

mysql用 fifo 记录日志_MySQL一丢丢知识点的了解

1. MySQL体系结构从概念上讲&#xff0c;数据库是文件的集合&#xff0c;是依照某种数据模型组织起来并存放于二级存储器中的数据集合&#xff1b;数据库实例是程序&#xff0c;是位于用户与操作系统之间的一层数据管理软件&#xff0c;用户对数据库数据的任何操作&#xff0c;…

HttpHandler

概述HttpHandler是一个HTTP请求的真正处理中心&#xff0c;也正是在这个HttpHandler容器中&#xff0c;ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行&#xff0c;并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。 IHttpHandler是什么 I…

小程序云开发搜索功能的实现正则_码code | 如何借助小程序云开发实现小程序支付功能...

转载来源&#xff1a;编程小石头我们在做小程序支付相关的开发时&#xff0c;总会遇到这些难题。小程序调用微信支付时&#xff0c;必须要有自己的服务器&#xff0c;有自己的备案域名&#xff0c;有自己的后台开发。这就导致我们做小程序支付时的成本很大。本节就来教大家如何…

python接口自动化(二十五)--unittest断言——下(详解)

简介 本篇还是回归到我们最初始的话题&#xff0c;想必大家都忘记了&#xff0c;没关系看这里&#xff1a;传送门 没错最初的话题就是登录&#xff0c;由于博客园的登录机制改变了&#xff0c;本篇以我找到的开源免费的登录API为案例&#xff0c;结合 unittest 框架写 2 个用例…

mysql-bin磁盘满数据库重启不_liunx磁盘空间满了,导致mysql数据库无法启动

如何启动/遏制/重启MySQLA、1、启动圆式1、哄骗 service 启动&#xff1a;service mysqld start2、哄骗 mysqld 脚本启动&#xff1a;/etc/inint.d/mysqld start3、哄骗 safe_mysqld 启动&#xff1a;safe_mysqld&二、遏制1、哄骗 service 启动&#xff1a;service mysqld …

[导入]C# Tips 2 右键单击listBox时弹出右键菜单并选中单击的行

C#,Listbox,右键,菜单,选中文章来源:http://blog.csdn.net/geyunfei_hit/archive/2008/07/16/2661153.aspx 转载于:https://www.cnblogs.com/geyunfei/archive/2008/10/08/1306335.html

python真的可以减少工作强度_用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!...

前几天有一个读者说最近要整理几千份文件&#xff0c;头都要整秃了&#xff0c;不知道能不能用Python解决&#xff0c;我们来看一下&#xff0c;你也可以思考一下。由于涉及文件私密所以具体内容已做脱敏处理。大概是这样&#xff0c;一个文件夹下有多份会议通知信息(本文以 7 …

Jmeter之逻辑控制器(Logic Controller)

一、简单控制器&#xff08;Simple Controller&#xff09;&#xff1a; 作用&#xff1a;这是Jmeter里最简单的一个控制器&#xff0c;它可以让我们组织我们的采样器和其它的逻辑控制器&#xff08;分组功能&#xff09;&#xff0c;提供一个块的结构和控制&#xff0c;并不具…