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…

Apache Druid(一)简介

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

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

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

设计事件驱动的微服务

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

express中获取url参数

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

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

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

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

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

欢乐纪中某B组赛【2019.1.28】

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

这应该是目前最快速有效的ASP.NET Core学习方式(视频)

ASP.NET Core都2.0了,它的普及还是不太好。作为一个.NET的老司机,我觉得.NET Core给我带来了很多的乐趣。Linux, Docker, CloudNative,MicroService,DevOps这些都能跟它很完美的结合,再加ASP.NE…

大叔公开课~微服务与持久集成

闲话多说 免费报名:http://www.genshuixue.com/teacher/classCourseDetail/171117794648么可以通过阅读原文报名 .Net Core来了,带给我们的是什么?跨平台,无疑是最大的亮点! Docker横空出世,让开发者和运维…

语音服务——腾讯云

腾讯语音服务文档 一、开通语音消息服务流程 (1)注册并认证 如果您还没有腾讯云账号,您需要 注册腾讯云 账号,并完成 企业实名认证。如果您已有企业认证的腾讯云账号,请直接进行下一步操作。 申请开通语音消息服务 …

Visual Studio交叉编译器提供对ARM的支持

只要ARM平台能够运行Windows,Visual Studio就有能力拓展ARM平台。在Visual Studio 2017 15.5预览版2中,该IDE通过使用GCC编译器,增加了对基于ARM的计算机和物联网(IoT)设备的支持力度,从而扩展了对ARM平台的…

我心中的ASP.NET Core 新核心对象WebHost(二)

这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置。我们给WebHostBuilder进行以下配置 UseKestrel 设置Kestrel为HttpServer ConfigureAppConfiguration 设置了配置文件 ConfigureLogging 配置了日志处理器…

Hadoop生态Flume(三)拦截器(Interceptor)介绍与使用(1)

转载自 Flume中的拦截器(Interceptor)介绍与使用(一) Flume中的拦截器(interceptor) 用户Source读取events发送到Sink的时候,在events header中加入一些有用的信息,或者对events的…

SOA对微服务的残余影响

近日,Tareq Abedrabbo在伦敦2017 Con微服务大会上说,SOA对微服务架构设计的残余影响仍然存在,包括技术选型和组织方面的问题。最直接的一个例子就是大多数企业仍然区分对待架构师和开发人员,架构师负责出规范,开发人员…

Hadoop生态Flume(四)拦截器(Interceptor)介绍与使用(2)

转载自 Flume中的拦截器(Interceptor)介绍与使用(二) lume中的拦截器(interceptor),用户Source读取events发送到Sink的时候,在events header中加入一些有用的信息,或者对…

协作更进一步:微软隆重介绍Visual Studio动态分享功能

微软刚刚在 Visual Studio Code 网站上宣布了“动态分享”(Live Share)功能,开发者们可以在 VS 2017 或 VS Code 中体验全新的实施协作。微软表示,Live Share 可让团队在相同的代码库上启用快速协作,而无需同步代码或配…

python打包exe文件

首先安装pyinstaller pip3 install pyinstaller接着导报指定文件 pyinstaller.exe -F 文件路径文件名 举例 pyinstaller.exe -F C:\Users\Tecna1205\Desktop\工作目录\Python工作目录\测试\3.3\test\tk.py 如果有图形界面,不想打开命令行,可在打包命令…

使用MS Test做单元测试

声明:本篇博客翻译自:http://www.c-sharpcorner.com/article/unit-testing-with-ms-tests-in-c-sharp/ 写在翻译之前: 依然清晰的记得刚工作的第一个项目中,在完成一个功能模块开发后,师傅让我把代码做一下单元测试。当…

Vue组件传参

父组件向子组件传参 数据&#xff1a; 父组件 <test :message"msg"></test>msg: Hello uniApp子组件&#xff08;test.vue&#xff09; <text>{{message}}</text>props:["message"]子组件向父组件传参 子组件&#xff1a; &…