syntaxTree

Go 中对栈中函数进行内联

混江龙づ霸主 提交于 2020-05-05 08:36:00
上一篇文章 中我论述了叶子内联leaf inlining是怎样让 Go 编译器减少函数调用的开销的,以及延伸出了跨函数边界的优化的机会。本文中,我要论述内联的限制以及叶子内联与栈中内联mid-stack inlining的对比。 内联的限制 把函数内联到它的调用处消除了调用的开销,为编译器进行其他的优化提供了更好的机会,那么问题来了,既然内联这么好,内联得越多开销就越少, 为什么不尽可能多地内联呢? 内联可能会以增加程序大小换来更快的执行时间。限制内联的最主要原因是,创建许多函数的内联副本会增加编译时间,并导致生成更大的二进制文件的边际效应。即使把内联带来的进一步的优化机会考虑在内,太激进的内联也可能会增加生成的二进制文件的大小和编译时间。 内联收益最大的是 小函数 ,相对于调用它们的开销来说,这些函数做很少的工作。随着函数大小的增长,函数内部做的工作与函数调用的开销相比省下的时间越来越少。函数越大通常越复杂,因此优化其内联形式相对于原地优化的好处会减少。 内联预算 在编译过程中,每个函数的内联能力是用 内联预算 计算的 1 。开销的计算过程可以巧妙地内化,像一元和二元等简单操作,在抽象语法数Abstract Syntax Tree(AST)中通常是每个节点一个单位,更复杂的操作如 make 可能单位更多。考虑下面的例子: package main func small()

神奇的Scala Macro之旅(二)- 一个实例

大兔子大兔子 提交于 2020-05-02 10:23:44
优化的日志方式 package macros_demo import scala.language.experimental.macros import org.slf4j._ import scala.reflect.macros.whitebox. Context object Macros { implicit class LoggerEx( val logger: Logger) { def DEBUG( msg: String) : Unit = macro LogMacros. DEBUG1 def DEBUG( msg: String, exception: Exception) : Unit = macro LogMacros. DEBUG2 } object LogMacros { def DEBUG1( c: Context)( msg: c. Tree) : c. Tree = { import c.universe._ val pre = c.prefix q """ val x = $pre.logger if( x.isDebugEnabled ) x.debug($msg) """ } def DEBUG2(c : Context)( msg: c. Tree, exception: c. Tree) : c. Tree = { import c

PHP7的新特性和源码结构

我是研究僧i 提交于 2020-04-29 15:50:36
一、PHP7的新特性 返回值类型声明 类型声明有两种模式: ①弱类型校验模式(默认):当传入的参数不符合声明类型时,会首先尝试转换类型。 ②严格类型校验模式:当传入的参数不符合声明类型时,直接报错。 声明严格模式的语法: declare(strict_types=1); //1严格类型校验模式,0弱类型校验模式 int,float,string,bool,array,class,interface,callable array,class,interface,callable ----------以下均为PHP7+新特性---------- 可空类型: 在参数或返回值类型声明前面加上“?”,表示参数值或返回值要么是null,要么是声明的类型。 <?php function 函数名(?paraType ...$variable) : ?returnType { #code... } 注:参数类型和返回值类型可以不同时为可空类型,但当参数值为 null 时,则参数和返回值类型必须同时为可空类型。 二、PHP7程序的执行过程 1.PHP代码经过 词法分析 转换为有意义的Token; 2.Token经过 语法分析 生成AST(Abstract Synstract Syntax Tree,抽象语法树); 3.AST生成对应的opcode,被虚拟机执行。 三、PHP7的源码结构 来源:

PHP7的新特性和源码结构

China☆狼群 提交于 2020-04-29 11:58:54
一、PHP7的新特性 返回值类型声明 类型声明有两种模式: ①弱类型校验模式(默认):当传入的参数不符合声明类型时,会首先尝试转换类型。 ②严格类型校验模式:当传入的参数不符合声明类型时,直接报错。 声明严格模式的语法: declare(strict_types=1); //1严格类型校验模式,0弱类型校验模式 int,float,string,bool,array,class,interface,callable array,class,interface,callable ----------以下均为PHP7+新特性---------- 可空类型: 在参数或返回值类型声明前面加上“?”,表示参数值或返回值要么是null,要么是声明的类型。 <?php function 函数名(?paraType ...$variable) : ?returnType { #code... } 注:参数类型和返回值类型可以不同时为可空类型,但当参数值为 null 时,则参数和返回值类型必须同时为可空类型。 二、PHP7程序的执行过程 1.PHP代码经过 词法分析 转换为有意义的Token; 2.Token经过 语法分析 生成AST(Abstract Synstract Syntax Tree,抽象语法树); 3.AST生成对应的opcode,被虚拟机执行。 三、PHP7的源码结构 来源:

vue参考---VUE程序运行过程

蓝咒 提交于 2020-04-29 10:06:55
vue参考---VUE程序运行过程 一、总结 一句话总结: template->ast(abstract syntax tree)->render->virtual dom->UI 1、runtime-compiler 和 runtime-only 的运行原理(运行过程)? runtime-compiler:template->ast(abstract syntax tree)->render->virtual dom->UI runtime-only:性能更高、代码量更少:render->virtual dom->UI 2、npm install vue-loader vue-template-compiler --save-dev中的vue-template-compiler的作用是什么? vue-template-compiler将vue中的template转换成render 3、Runtime-Compiler和Runtime-only的选择使用情况? 如果在之后的开发中,你依然使用template,就需要选择Runtime-Compiler 如果你之后的开发中,使用的是.vue文件夹开发,那么可以选择Runtime-only 二、VUE程序运行过程 博客对应课程的视频位置: 来源: oschina 链接: https://my.oschina.net/u/4323704

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

最后都变了- 提交于 2020-04-11 19:49:58
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从 这里 下载。 一、实现的效果 我们先来看看实现的效果。如下所示的是一个MVC应用的主页,我们可以在文本框中通过编写C#代码定义一个有效的Controller类型,然后点击“Register”按钮,定义的Controller类型将自动注册到MVC应用中 由于我们采用了针对模板为“{controller}/{action}”的约定路由,所以我们采用路径“/foo/bar”就可以访问上图中定义在FooController中的Action方法Bar,下图证实了这一点。 二、动态编译源代码 要实现如上所示的“针对Controller类型的动态注册”,首先需要解决的是针对提供源代码的动态编译问题,我们知道这个可以利用Roslyn来解决。具体来说,我们定义了如下这个ICompiler接口,它的Compile方法将会对参数sourceCode提供的源代码进行编译

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

不问归期 提交于 2020-04-09 04:52:52
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从 这里 下载。 一、实现的效果 我们先来看看实现的效果。如下所示的是一个MVC应用的主页,我们可以在文本框中通过编写C#代码定义一个有效的Controller类型,然后点击“Register”按钮,定义的Controller类型将自动注册到MVC应用中 由于我们采用了针对模板为“{controller}/{action}”的约定路由,所以我们采用路径“/foo/bar”就可以访问上图中定义在FooController中的Action方法Bar,下图证实了这一点。 二、动态编译源代码 要实现如上所示的“针对Controller类型的动态注册”,首先需要解决的是针对提供源代码的动态编译问题,我们知道这个可以利用Roslyn来解决。具体来说,我们定义了如下这个ICompiler接口,它的Compile方法将会对参数sourceCode提供的源代码进行编译

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

北城以北 提交于 2020-04-09 00:55:32
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从 这里 下载。 一、实现的效果 我们先来看看实现的效果。如下所示的是一个MVC应用的主页,我们可以在文本框中通过编写C#代码定义一个有效的Controller类型,然后点击“Register”按钮,定义的Controller类型将自动注册到MVC应用中 由于我们采用了针对模板为“{controller}/{action}”的约定路由,所以我们采用路径“/foo/bar”就可以访问上图中定义在FooController中的Action方法Bar,下图证实了这一点。 二、动态编译源代码 要实现如上所示的“针对Controller类型的动态注册”,首先需要解决的是针对提供源代码的动态编译问题,我们知道这个可以利用Roslyn来解决。具体来说,我们定义了如下这个ICompiler接口,它的Compile方法将会对参数sourceCode提供的源代码进行编译

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

与世无争的帅哥 提交于 2020-04-08 21:15:04
原文: [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型? 昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从 这里 下载。 一、实现的效果 我们先来看看实现的效果。如下所示的是一个MVC应用的主页,我们可以在文本框中通过编写C#代码定义一个有效的Controller类型,然后点击“Register”按钮,定义的Controller类型将自动注册到MVC应用中 由于我们采用了针对模板为“{controller}/{action}”的约定路由,所以我们采用路径“/foo/bar”就可以访问上图中定义在FooController中的Action方法Bar,下图证实了这一点。 二、动态编译源代码 要实现如上所示的“针对Controller类型的动态注册”,首先需要解决的是针对提供源代码的动态编译问题,我们知道这个可以利用Roslyn来解决。具体来说

两周自制脚本语言-第4天 用于表示程序的对象

这一生的挚爱 提交于 2020-02-27 02:09:34
第4天 用于表示程序的对象 程序分割为单词后,接下来是构造抽象语法树。 4.1 抽象语法树的定义 抽象语法树(AST,Abstract Syntax Tree)是一种用于表示程序结构的树形结构。 词法分析 (分割单词)-> 语法分析(构造抽象语法树) BinaryExpr对象用于表示双目运算表达式。 双目运算表达式指的是四则运算等一些通过左值和右值计算新值的运算。 4.2 设计节点类 抽象语法树的所有节点都是ASTree的子类 ASTLeaf类是叶节点(不含树枝的节点)的父类 ASTList是含有树枝的节点对象的父类 其他类都是ASTList或ASTLeaf类的子类 NumberLiteral与Name类用于表示叶节点,BinaryExpr类用于表示含有树枝的节点,他们分别是上述两个类的子类 ASTree类的主要方法 ASTLeaf child(int i) //返回第i个子节点 int numChildren() //返回子节点的个数(如果没有子节点则返回0) Iterator<ASTree> children() //返回一个用于遍历子节点的iterator BinaryExpr类同样也有left和right这两个字段 这两个字段并不直接在BinaryExpr类中定义,而是通过其父类ASTList类的children字段定义。 如代码清单4.6所示