Mono的新解释器

Mono即将通过它的JIT编译器和静态编译器以及一个.net解释器以带来一些新的方式来运行你的代码.

2001年Mono项目诞生之时,我们为.net指令集实现了一个解释器用基于它实现了一个在Linux上的自托管的.net开发环境.

当时我们把解释器定义为一个用来构建JIT编译器的临时工具. 那个解释器(mint)和JIT引擎(mono)并行存在至我们将JIT引擎移植到我们支持的所有平台上

当有了泛型之后,同时维护解释器和JIT引擎带来巨大工程量,同时我们看不到太多它存在的价值以及为它做很多额外工作的意义,所以我们删除了解释器

我们后来为.net代码引入了全静态编译. 这是一项用来支持不允许动态代码生成的平台的技术, iOS是它诞生的主要原因,但是这项技术同时为Mono打来了通向PlayStation和Xbox等游戏主机的大门

全静态编译的最大缺点是可执行输出需要在每一次更新代码里重新生成,这是一个漫长的过程同时不适用于一些交互式开发 

例如, 一些游戏开发者希望能在不触发全静态编译的情况下调整他们的游戏代码. 全静态编译使得这个场景无法实现, 所以他们不得不通过在他们游戏代码中嵌入一种脚本语言来实现快速迭代和调整他们项目的目的

.NET 动态能力的缺乏使得很多想将.net作为教学或者原型工具的人丧失了兴趣. 很多像Xamarin Workbooks的东西, 或者简单的脚本无法使用.net语言而不得不从其他平台寻找解决方案.

Frank Krueger构建他的Continuous IDE的时候就非常需要在iOS上有类似的环境以致于他使用F#实现了自己的.net解释器最终给iPad带来了完整的.net开发环境 

为了解决这些问题同时支持MS内部的一些产品,我们决定重启Mono解释器项目,  它将伴随着一个twist归来.

 

新的Mono解释器 

我们复活了Mono解释器并升级了它对.net的支持, 添加了对泛型的支持并将它升级到最新版的.net, 下一步准备为它添加混合模拟执行的支持

这是Mono在现在可以支持WebAssembly的方式之一 (另外一种就是通过LLVM静态编译) 

这个解释器目前已经是Mono主线的一部分而且已经通过了我们大部分测试,你可以通过从源代码编译Mono而现在就可以开始通过以下方式使用它: 

$ mono --interpreter yourassembly.exe

 

混合执行模式 

目前解释器本身已经成形,我们正在努力的实现通过配置使得我们可以将解释代码和静态编译代码或者JIT后的代码混合,我们称之为混合模式执行

对于iOS, PalyStatition以及Xbox之类的平台来说,这意味着你可以预编译你的核心库或者核心程序, 同时又可以支持动态加载和执行代码. 得到你所有的核心库通过LLVM优化的好处的同时仍然具备灵活的运行动态代码的能力.

这将允许游戏开发者们在他们的系统中使用.net语言来实现原型,测试以及调整他们的游戏而不需要重新编译程序.

它还将为使用. NET 语言的设备上运行可脚本化应用程序打开大门

 

将来的工作

我们正在通过扩展解释器的能力以满足很多有意思的场景,下面是一些摆在我们面前的项目:

 

静态编译Mono的提升

在全AOT编译的Mono版本(iOS, 游戏主机)上我们无法发布任何System.Reflection.Emit的实现,因为平台无法支持,但是现在我们有了解释器,我们可以支持了.

下面是几个相关的应用.

 System.Linq.Expressions API被广泛用于像Entity Framework或者使用C#编译器将表达式转化为表达式树等高级场景下,你也许见过类似以下场景的代码

Expression sum = a + b;
var adder = sum.Compile ();
adder ();

在全AOT场景下, 我们支持Entity Framework和上面逻辑的方式是为Expression类制作一个解释器. 这个表达式解释器有很多限制,而且影响很大.

通过启用解释器支持下的System.Reflection.Emit我们可以删除很多代码.

这也会允许为.net构建的脚本语言可以在静态编译环境下运行, 比如IronPython, IronRuby and IronScheme.

为了达到这些目的, 我们正在努力的为混合模式执行工作. 这意味着解释代码可以与已有的静态编译代码协同工作

 

更好的隔离

在上面我提到了我们之前没做好的一个场景就是通过热加载代码使开发人员可以实时部署和调整他们的游戏代码

我们即将通过完成对AppDomains的支持来满足这个需求

 

正在研究的混合模式选项

 这个解释器是运行一些代码的轻量选择. 我们发现一些特殊程序在被解释时的速度超过了被JIT引擎执行的速度

 我们计划去探索一种混合执行方式,有时被称为分层编译

 我们可以让解释器执行已知的性能不敏感代码 - 比如, 静态构造器或者其他只执行一次的初始化代码以助于减少内存占用以及代码生成和执行时间.

 另外一个考虑是先在解释模式下运行代码, 当我们超过了某些门槛时切换到JIT引擎来执行,或者使用Attribute来标记哪些方法值得去优化.

原文地址:http://www.cnblogs.com/Crazy7/p/7833202.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

欢乐纪中某B组赛【2019.1.27】

前言 写完T1T1T1和T2T2T2颓了半天 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC2222017myself2017myself2017myself2302302301001001001001001003030304442017xxy2017xxy2017xxy2002002001001001001001001000001111112017zyc2017zy…

forever以及pm2相关命令

sudo npm install forever -g 启动 forever start app.js forever list 停止单个 forever stop [pid] 停止所有 forever stopall pm2 相关命令 查看某个进程的信息 启动进程 pm2 start app.js查看所有进程信息 pm2 list停止进程 pm2 stop 0 ##0为id删除进程 // pm2 de…

Apache Druid(一)简介

翻译自 Apache Druid Apache Druid(正在孵化)是一个开源的分布式数据存储。德鲁伊的核心设计结合了OLAP /分析数据库,时间序列数据库和搜索系统的思想,为广泛的用例创建了一个统一的系统。Druid将这三个系统中的每个系统的关键特…

jzoj4235-序列【斐波那契数列】

正题 题目大意 两个操作, 询问最前面的可以组成三角形的三个数,和修改一个数。 解题思路 我们考虑答案最后面可以到多少。 a,b,ab,ab∗2,a∗2b∗3a,b,ab,ab*2,a*2b*3a,b,ab,ab∗2,a∗2b∗3 其实就是斐波那契数列,然后因为输出的数都不会很大…

[ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了

发现问题 在将 FineUIMvc(支持ASP.NET MVC 5.2.3)升级到 ASP.NET Core 2.0 的过程中,我们发现一个奇怪的现象: 通过项目引用 FineUICore 工程一切正常,但是将 FineUICore 编译后,通过程序集的引用方式就会报…

cookie、session、sessionid 与jsessionid

转载自 cookie、session、sessionid 与jsessionid cookie、session、sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解。 我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案…

Failed to load http://localhost:3000/products: The 'Access-Control-Allow-Origin' header has a value

用node写了个接口,但是启动前端的时候一直请求不到数据,报错 Failed to load http://localhost:3000/products: The ‘Access-Control-Allow-Origin’ header has a value ‘http://127.0.0.1:3000’ that is not equal to the supplied origin. 后来在n…

jzoj4226-A【图论】

正题 题目大意 给出mmm条边,nnn个点,求至少加入多少条边可以让每个点的度数不超过kkk。不可以有自环,可以有重边 解题思路 计算出每个点还差几条边。 然后如果需要加入多余边(一边是有用的,一边是没用的),那么肯定仅…

设计事件驱动的微服务

事件驱动的微服务是一个未受到应有探讨的领域,在近日举行的Con伦敦2017微服务大会上,Greg Young表达了这样的观点。同时,他还特别强调,不应该对所有的微服务都使用事件驱动模式。相反,他建议逐个服务进行考察&#xff…

写一个http服务器

http-server 这是一个http服务程序 http-server是server程序,提供socket连接&#xff0c;http报文处理 http-test是应用层配置处理的例子&#xff0c;提供业务层处理 git地址&#xff1a;https://github.com/90duc/http-server 1、加入依赖 <dependency><groupId>…

express中获取url参数

问号传参获取参数 获取 http://127.0.0.1:3001/user?id10&namezs 中的查询参数&#xff1a; 直接使用 req.query 获取参数即可&#xff1b; 注意&#xff1a;URL 地址栏中通过 查询字符串 传递的参数&#xff0c;express 框架会直接解析&#xff0c;大家只需使用 req.que…

jzoj4227-B【dp,字符串】

正题 题目大意 给定一个后缀数组&#xff0c;和每个地方填不同的字母可以获得的不同权值&#xff0c;求最大权值之和。 解题思路 先用后缀数组aaa计算出每个后缀的排名RankRankRank数组。 然后考虑dpdpdp&#xff0c;首先我们发现对于aia_iai​&#xff0c;每个cai≤cai1c_{…

处理ASP.NET Core中的HTML5客户端路由回退

在使用由Angular&#xff0c;React&#xff0c;Vue等应用程序框架构建的客户端应用程序时&#xff0c;您总是会处理HTML5客户端路由&#xff0c;它将完全在浏览器中处理到页面和组件的客户端路由。几乎完全在浏览器中... HTML5客户端路由在客户端上工作的很好&#xff0c;但是当…

Druid SQL查询数据timeStamp时区问题

一、Druid默认时区 默认使用UTC0000&#xff0c;数据存储的时间timeStamp为UTC0000 二、北京时间 在中国&#xff0c;使用UTC0800&#xff0c;查询时间需要设置时区或者将时区转换为UTC0000时间 以下查询是UTC0000时间&#xff0c;查询结果的dateTime也是UTC0000时间需要进行…

Promise解决异步操作问题

问题: 当有多个回调函数后&#xff0c;就无法保证其输出的顺序性了&#xff0c;而采用嵌套的方式虽可以解决这个问题&#xff0c;但是代码样式太丑&#xff0c;且很乱&#xff0c;Promise的出现就是为了解决这个问题 多个回调函数 var fs require(fs);fs.readFile(./files/1.…

jzoj4228-C【dp】

正题 题目大意 每个点往可以往4个方向之一发射光&#xff0c;要求光不可以相交且不可以经过别的点&#xff0c;求方案总数。 解题思路 将点按xxx排序&#xff0c; 设fl,r,u,d,if_{l,r,u,d,i}fl,r,u,d,i​表示放到第iii个点&#xff0c;最上面的向下发射的点为lll&#xff0c…

TFS在项目中DevOps落地进程(下)

紧接上篇 TFS在项目中Devops落地进程&#xff08;上&#xff09; 再接着说TFS相关之前先插入一个番外篇&#xff0c;虽然跟TFS关系不大但跟DevOps关系很大&#xff0c;觉得有必要在此乱入一下。 番外篇--监控之Application Insights 我们之前并没有任何监控类产品&#xff08;我…

Js如何判断undefined和null

判断是否为undefined var example undefined; if (typeof(example) "undefined") {console.log("undefined") }判断是否为null var example null; if (!example && typeof(example)!undefined && example!0) {console.log("nu…

Spring Data之MongoDB配置

一、重写基类扩展功能 package com.mk.mongodb.repository;import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Aggregation…

欢乐纪中某B组赛【2019.1.28】

前言 心态爆炸 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD3332017myself2017myself2017myself1901901901001001005050500004040401313132017zyc2017zyc2017zyc1701701707070706060600004040401313132017hzb2017hzb2017hzb1701…