接上篇: 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

Inside IronPython: IronPython AST语法树(2/2)相关推荐

  1. 【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )

    文章目录 一.利用注解进行 AST 语法树转换 1.定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 2.AST 转换接口实现 3.定义 Groovy ...

  2. 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

    文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...

  3. 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )

    文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...

  4. 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

    文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...

  5. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析

    这篇文章给大家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是AST AST是指抽象语法树(abstract syn ...

  6. python-js逆向之AST语法树初学(一)

    这两天看了什么是控制流平坦化,又研究了下ast语法数,如何把混淆乱序后的代码恢复之前的样子. 知识点:1.js包为 recast 2.Recast除了parse/print/builder以外, 还有 ...

  7. 关于css 的AST 语法树的理解

    css 处理插件大致分为压缩css和给css添加浏览器兼容前缀. cssmin 可以压缩css,大致原理是将使用正则将css 中的注释和空格删除. px2rem 插件是将css 中的px 转换为 re ...

  8. Vue源码解析之AST语法树(三)

    parse解析完之后,将生成的ast返回到baseCompile,接下来就是调用optimize方法对ast进行优化. var createCompiler = createCompilerCreat ...

  9. AST语法结构树初学者完整教程

    AST语法结构树初学者完整教程 编写你的第一个 Babel 插件 不太喜欢上来就讲大道理,先来个小栗子,做个简单而又实用的功能,做完后,理论你就理解一大半了. 我们需要antd里面的一个组件Butto ...

  10. java AST 表达式_java 编译时注解-AST 抽象语法树简介

    AST 语法入门 以前使用 Lombok 一直觉得是一个很棒的设计,可以同时兼顾注解的遍历和运行的性能. 运行时注解一直因为性能问题被人诟病. 自己尝试写过一些框架,但是耗费了比较多的精力,因为 AS ...

最新文章

  1. Metasploit irb命令使用技巧
  2. 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数(学习笔记:第7章 06)...
  3. 【收藏】怎样把 macOS 安装在移动硬盘或 U 盘里
  4. 配置MGR时修改了/etc/hosts但映射后的hostname不起作用
  5. 今年暑假不AC-贪心
  6. keras卷积处理rgb输入_CNN卷积神经网络模型搭建
  7. springmvc与mysql实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
  8. 训练日志 2018.9.5
  9. 周立功的linux开发板例程,USB NXP LPC1766 开发配套例程(周立功开发板自带例程) - 下载 - 搜珍网...
  10. CentOS Linux 7.9 (2009) 发布
  11. 币安宣布Terence Zeng担任大中华区业务负责人
  12. rpa打开浏览器_rpa.ie
  13. 配置web监控及报警
  14. latex 基本用法(五)
  15. vector 内部方法大全 学习(初学者的参考资料)
  16. 组装电脑配件选择教程
  17. 第三方SDK:SMSSDK
  18. 怎样在电脑上上传图片_怎样上传图片或照片
  19. cos三次方积分_COS分之一三次方积分
  20. 13 年的 Bug 调试经验总结(来自蜗牛学院)

热门文章

  1. Python 3.8.0a2 发布,面向对象编程语言
  2. 小扎不哭!FB又陷数据泄露风波,9000万用户受影响
  3. Office 365 系列之九:配置和体验 Exchange 和 Lync
  4. redis本地及远程登录
  5. scikit-learn决策树算法类库使用小结
  6. 【Git入门之五】版本管理
  7. 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt...
  8. 手机进水急救——爆米花可用来吸干水分
  9. linux 内核配置过程中遇到的问题
  10. coverage.py - python 单元测试覆盖率统计工具