返回信息流请三思
如果你是在.net上直接写JS解释器,不建议自己写GC,而是直接用.net的GC。也就是把JS对象抽象成.net的对象。这样,解释器就只是一个普通的.net应用程序了。这种情况下,你只要恰当地设计JS对象的形状(即用什么样的.net类、对象来表达),以及如何存储JS级的局部变量(既然你的是解释器,这个灵活性很大),剩下的一切都交给.net就好了。
你还可以考虑用编译而不是解释的方式实现JS。这里“编译”指的是把JS编译成.NET字节码,编译出来的程序直接在.net CLR上运行。
下面的是高级话题,可以不看,也可以小心地看:
如果你一定要自己管理JS的内存,你可以使用unsafe和pointer(.net程序员真幸福,竟然有pointer可以用)。但是即使这样,你的用C#写的解释器仍然需要一个供C#自己用的GC。等于你的整个系统里有两个GC:一个是.net自己的,另一个是你的JS的。这样不是不可以,就是有些笨重,不实用。
如果你真的要自己写一个虚拟机,你需要一个有ahead-of-time编译功能的语言。C/C++/Rust是这样的语言。不是说C#不行。你可以用C#,但你的VM需要是metacircular的,也就是你要自己写一个VM来支持C#和本身,等于你重新发明了.net虚拟机。你可以自己写一个ahead-of-time的C#编译器,用C#写一个自己的VM。注意其中的GC组件不可以用GC,或者必须很小心地用GC;但其它部分可以随意GC。但这个工程量巨大,对你是一个非常大的挑战。
这是一条镜像帖。来源:北邮人论坛 / dot-net / #4787同步于 2016/9/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖
Re: 瞬间感觉自己整个人都被托管了
nuanyangyang
2016/9/3镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
果然暖神解了我的疑惑。
确实js的对象是抽象成C#对象的,我以前就觉得不用自己再做GC了,但是后来想了想有点没想过去,把自己弄懵逼了。我就是在想怎么实现js的new的时候瞬间迷惑了,现在看直接new就好了。这样就都有了。我的简易版浏览器内核雏形就要成了。[ema3]
【 在 nuanyangyang 的大作中提到: 】
: 请三思
: 如果你是在.net上直接写JS解释器,不建议自己写GC,而是直接用.net的GC。也就是把JS对象抽象成.net的对象。这样,解释器就只是一个普通的.net应用程序了。这种情况下,你只要恰当地设计JS对象的形状(即用什么样的.net类、对象来表达),以及如何存储JS级的局部变量(既然你的是解释器,这个灵活性很大),剩下的一切都交给.net就好了。
: ...................