写点什么

.NET 平台上的 JavaScript 引擎

  • 2010-11-10
  • 本文字数:1916 字

    阅读完需:约 6 分钟

长久以来,在.NET 平台上只能通过 JScript.NET 执行 ECMAScript /JavaScript 代码,但是该项目一直是.NET 语言中的二等公民,甚至 Mono 中的对应项目也已经无人维护。不过在 JScript.NET 逐渐淡出人们视线的时候,.NET 平台上也出现了一些新的 JavaScript 执行引擎,虽不完善,但值得关注。

Jint 是一个相对较早的纯托管代码实现的 JavaScript 执行引擎,基于 MIT 授权协议开源,它的目标是为.NET 应用程序提供 JavaScript 代码的执行及互操作能力。您可以将一个.NET 对象传入应用程序,或是使用.NET 类库。Jint 使用 ANTLR 解析 JavaScript 代码以避免 CodeDomProvider 可能带来的内存泄漏。目前 Jint 处于 0.8.9 版本,可以支持 JavaScript 的一些高级技巧,但仍处于 ECMAScript 3.0 语言特性的实现阶段。

Jurassic 同样是一个开源的托管 JavaScript 执行引擎,使用 MS-PL 授权协议。它的目标是成为.NET 平台上功能最强,最为标准的 JavaScript 引擎。具官方页面描述,Jurassic 引擎:

  • 支持 ECMAScript 3 和 ECMAScript 5 的功能
  • 简单但强大的 API
  • 将 JavaScript 编译为.NET 字节码(CIL),而非解释执行
  • 纯.NET 实现,无原生代码
  • 支持 Visual Studio 的基础集成调试功能
  • 使用轻量级代码生成技术,所有的动态代码均可被回收

性能评测上看,Jurassic 优于Jint,但还远远落后于著名的V8 引擎。此外,Jurassic 依赖.NET 4,并支持Silverlight,在它的项目页面中您可以看到一个Silverlight 版的JavaScript 控制台。

IronJS 是一个.NET 平台中的新军,由 Fredrik Holmström 开发。IronJS 之前同样使用 ANTLR 来解析代码,但如今的解释器已经使用 F#编写。IronJS 构建于 DLR 之上,因此可以轻易地与 IronPython,IronRuby 等语言进行互操作。IronJS 最重视的一点便是“性能”,从作者博客上的各项评测结果来看,甚至领先于以速度见长的V8。不过IronJS 仍处于早期Alpha 阶段,并没有提供完整的功能。

同样基于DLR 的还有 RemObjects Script for .NET ,可惜它并不是开源产品(不过公开了源代码),且授权协议要求我们最多在5 台机器上安装代码,且只供自己使用。

除此之外,老赵在博客介绍到,他在构建新版博客的时候,使用 IKVM.NET 运行 Java 实现的 Rhino 引擎,并成功执行了 showdown.js (JavaScript 实现的 Markdown 转化器)及一些自定义的过滤逻辑:

有趣的是,.NET 平台下最靠谱的 JavaScript 执行引擎居然是 Rhino JavaScript,最近一次发布是在 2009 年 3 月,不过实现的十分完整。要说缺点,可能就是使用起来比较麻烦,还有,这是个 Java 项目。

嗯,我没有开玩笑,我们完全可以在.NET 平台下使用 Rhino JavaScript:

复制代码
var cx = Context.enter();
try
{
var scope = cx.initStandardObjects();
cx.evaluateString(scope, @"var checkName = function(name) { return /^\w{3,10}$/.test(name); }", "checkName.js", 1, null);
var func = (Function)scope.get("checkName", scope);
Console.WriteLine(Context.toString(func.call(cx, scope, scope, "jeffz")));
Console.WriteLine(Context.toString(func.call(cx, scope, scope, "hello world"));
}
finally
{
Context.exit();
}

因为我们有 IKVM.NET。mono 等.NET 开源社区上有大量宝藏,就看您能利用多少了。我用 ikvmc 把 js.jar 转化为 RhinoJs.dll 之后就可以直接使用,效果很好,对调试也有很好的支持(如果 JavaScript 执行时出现了错误,则 VS 会直接带您至出错的那行)。性能也是比较令人满意的,在我的 Mac OSX 上安装的 Ubuntu Server 10.10 虚拟机,单线程转化并过滤博客上最近的 3800 条评论,大约耗时 20 秒。试验时 Host 上还开着一个 Windows 7 虚拟机,还有大量浏览器等应用程序,并不十分空闲。

您可能知道,我的博客目前是基于 mono 2.6 的,其中比较有特色的地方便是评论功能了,我使用 Markdown 标记,并提供了实时的预览功能,这自然需要在客户端解释 Markdown 标记,并进行过滤。目前,我还在服务器使用了 C#实现的 Markdown 转化器及过滤逻辑,但在某些特殊情况下结果会有所不同,且需要维护两套代码。不久以后,我会将把博客升级为 ASP.NET 4.0 及 mono 2.8(C# 4.0 的 dynamic 特性在某些情况下的确比较方便),并且在服务器端使用 IKVM.NET + Rhino JavaScript 执行相同转化代码。从效果上来看还是十分令人满意的。

IKVM.NET 是一个在.NET 环境下运行 Java 程序的项目,它可以将 Java 字节码转化为.NET IL,并提供了一套 JDK 核心类库的.NET 实现。IKVM.NET 支持微软.NET 平台及 Mono,并可以成功运行包括 Eclipse、Jython、JBoss 在内的大型 Java 应用程序。老赵之前也分享过他基于IKVM.NET 使用 Lucene 2.9.0 Google Closure Compiler 的经验。

2010-11-10 11:095187
用户头像

发布了 157 篇内容, 共 54.4 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

蓝易云:Linux Debian11服务器安装SSH,创建新用户并允许SSH远程登录,及SSH安全登录配置!

百度搜索:蓝易云

运维 SSH 云服务器 计算 Debian

Kafka的灵魂伴侣Logi-KafkaManger(3)之运维管控--集群列表

石臻臻的杂货铺

kafka

中国GPT用户的第三阶段:揭秘你不知道的道与术

豆哥

ChatGPT 文心一言

我设计的专注背单词小程序更新了,欢迎交流功能UI设计

一点点小创意

技术 产品设计 用户体验 页面布局 色彩搭配

Nautilus Chain 引入 $NAUT 通证,延续 $ZBC 的价值

股市老人

在HTML里,attribute和property有什么区别?

Lee Chen

前端

华为828 B2B企业节,开启企业数字化转型新篇章

YG科技

Arbitrum 公链 arb 代币质押项目挖矿系统开发

l8l259l3365

Kafka灵魂伴侣Logi-KafkaManger(4)之运维管控–集群运维(数据迁移和集群)

石臻臻的杂货铺

kafka

打工人要的安慰,GPT 给不了

豆哥

AI 打工人 ChatGPT 工具人 自我意识

2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p , 它们表示一个长度为 n 且下标从 0 开始的数组 arr , 数组中除了下标为 p 处是 1

福大大架构师每日一题

福大大架构师每日一题

国产GPT到底哪家强?看看专家怎么选

豆哥

AI 评测 ChatGPT 文心一言 国产大模型

开启企业数字化转型新篇章,华为云828企业节来了

YG科技

Nautilus Chain 引入 $NAUT 通证,延续 $ZBC 的价值

威廉META

数字货币合约交易系统开发

V\TG【ch3nguang】

金九银十!GitHub星标137k霸榜,国外友人直呼太卷了!

程序员万金游

Java 面试 #java #程序员 #Java面试题 #Mysql

方便的音频控制软件 SoundSource 免激活最新版

胖墩儿不胖y

音频编辑 音频处理工具 编辑音频 音频控制

谁在利用虚拟人做局?

自象限

电商直播 虚拟人

ChatGPT 掐网线,文心一言打太极:马斯克说得不错,这是要造反啊

豆哥

AI 马斯克 ChatGPT 文心一言 灵魂拷问

少林寺、玄武湖景区签约、鲸鱼陪诊上架元服务,鸿蒙生态共繁荣

最新动态

红巨人调色降噪插件合集:Red Giant Magic Bullet Suite 最新激活版

mac大玩家j

Mac软件 视频处理工具 红巨星降噪插件

测试团队绩效考核的关键指标

老张

OKR 绩效考核

Nautilus Chain 引入 $NAUT 通证,延续 $ZBC 的价值

鳄鱼视界

Python 基本操作

小万哥

Python 程序员 软件 后端 开发

两届 TOKEN 2049 之间,孙宇晨和波场的布局与野心

股市老人

Kafka的灵魂伴侣Logi-KafkaManger(5)之运维管控–平台管理(用户管理和平台配置)

石臻臻的杂货铺

kafka

Nautilus Chain 引入 $NAUT 通证,延续 $ZBC 的价值

西柚子

秒合约交易系统app开发,微交易系统开发

V\TG【ch3nguang】

学习 CodeWhisperer 的一些总结

亚马逊云科技 (Amazon Web Services)

Java 人工智能

.NET平台上的JavaScript引擎_.NET_赵劼_InfoQ精选文章