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,一经查实,立即删除!

相关文章

遍历文档树

子节点 一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点1. tag的名字 操作文档树最简单的方法就是告诉它你想获取的tag的name.如果想获取…

[html] html5中的form怎么关闭自动完成?

[html] html5中的form怎么关闭自动完成? 设置form的autocomplete属性为off个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

如何开通支付宝

一、登录支付宝网站注册: 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才会记录)原因可…

[html] label都有哪些作用?并举相应的例子说明

[html] label都有哪些作用&#xff1f;并举相应的例子说明 label通常用来关联一个表单控件<label for"hobby">爱好</label> <input id"hobby" type"checkbox" value"0">个人简介 我是歌谣&#xff0c;欢迎和大家一…

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

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

java mysql 异步查询数据库_java 异步操作数据库

Autowiredprivate ThreadPoolTaskExecutor threadPoolTaskExecutor;threadPoolTaskExecutor.execute(new UpdateDbCdkeyStatus(AcvitityId, couponCode, money));/*** 记录coupon到数据库*/private class UpdateDbCdkeyStatus implements Runnable {private String couponCode;…

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

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

工作377-处理url拼接里面的参数方法

function GetRequest() {var url location.search; //获取url中"?"符后的字串var theRequest new Object();if (url.indexOf("?") ! -1) {var str url.substr(1);strs str.split("&");for(var i 0; i < strs.length; i ) {theRequ…

1020.数字识别

来源&#xff1a;oj.noi.cn时间限制: 1000 ms 空间限制: 262144 KB题目描述输入一个不多于四位的正整数&#xff0c;求出它是几位数&#xff0c;并分别打印出各位上的数字。输入输入一个不多于四位的正整数x。输出第一行输出x的位数num&#xff0c;接下来num行从高位到低位输出…

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

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

工作378-封装axios方法

const apiBaseUrl http://118.178.180.86:9000const service axios.create({baseURL: apiBaseUrl,timeout: 10000 });/*拦截器获取token地址*/ service.interceptors.request.use(function(config) {var Request new Object();Request GetRequest();let tokenRequest.token…

爬虫之request

目录 爬虫基本流程request和responserequestresponse演示解析方式requests库基本get请求1. 基本写法2. 带参数get请求3. 解析json4. 获取二进制数据5. 添加headers基本post请求响应状态码判断&#xff1a;高级操作beautifulsoup库爬取汽车之家示例爬虫基本流程 发起请求&#x…

工作379-回调日期补0操作

var data econsole.log(this.continuousDays, "continuousDays")data data.setDate(data.getDate() this.continuousDays);data new Date(e);console.log(data, "data")let dateYear1 data.getFullYear(); //获取年console.log(dateYear1, "date…

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

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

8月18日 小雨

小爱&#xff0c;昨天你睡的很可爱 呵呵 我今天没晚&#xff0c;居然提前20分钟自己醒了。 刚来公司&#xff0c;就收到经理通知&#xff0c;中午大家要去开发区吃饭&#xff0c;下午事都处理完就可能放假&#xff0c;HOHO。 提前告诉小爱&#xff0c;不要着急。 我爱你 转载于…

python tornado对接权限中心的sdk封装

# -*- coding: utf-8 -*- import jsonimport requests import logging as loggerfrom python.akskapp.scripts.api.baseHandler import Rclass AuthSdk(object):# 登录def loginToAuthcenter(self, username, password):resp Noneheaders {"Content-Type": "a…

mysql事务模式怎么查_Mysql InnoDB中的查询事务模式与锁定select ..for update

在 InnoDB 的行锁中使用所谓的 next-key locking。这就意味着&#xff0c;除了索引记录外&#xff0c;InnoDB 还可以锁定该索引记录前部“间隙” (gap) 以阻塞其它用户在索引记录前部的直接插入。next-key lock 意思是锁定一个索引记录以及该记录之前的间隙(gap)。gap lock 就是…

[jQuery] jQuery中如何将数组转化为json字符串,然后再转化回来?

[jQuery] jQuery中如何将数组转化为json字符串&#xff0c;然后再转化回来&#xff1f; var typeOf obj > Object.prototype.toString.call(obj); typeOf([1]); // "[object Array]" typeOf($([1])); // "[object Object]" $([1]).toArray();个人简…

.NET反射、委托技术与设计模式

转自&#xff1a;http://hi.baidu.com/nanashitou/blog/item/ad7346eed769ffffb2fb958a.html 1 反射技术与设计模式 反射&#xff08;Reflection&#xff09;是.NET中的重要机制&#xff0c;通过放射&#xff0c;可以在运行时获得.NET中每一个类型&#xff08;包括类、…