【发布时间】:2011-10-14 16:15:40
【问题描述】:
我将如何编写一个轻量级的 javascript 到 javascript 解析器。可以转换一些sn-ps代码的简单东西。
我想基本上将函数中的内部范围对象公开。
像这样的
var outer = 42;
window.addEventListener('load', function() {
var inner = 42;
function magic() {
var in_magic = inner + outer;
console.log(in_magic);
}
magic();
}, false);
将编译为
__Scope__.set('outer', 42);
__Scope__.set('console', console);
window.addEventListener('load', constructScopeWrapper(__Scope__, function(__Scope__) {
__Scope__.set('inner', 42);
__Scope__.set('magic',constructScopeWrapper(__Scope__, function _magic(__Scope__) {
__Scope__.set('in_magic', __Scope__.get('inner') + __Scope__.get('outer'));
__Scope__.get('console').log(__Scope__.get('in_magic'));
}));
__Scope__.get('magic')();
}), false);
这背后的动机是序列化函数和闭包的状态,并使它们在不同的机器(客户端、服务器、多台服务器)之间保持同步。为此,我需要[[Scope]]
问题:
- 我可以在不编写完整的 JavaScript 的情况下进行这种编译器 ->(略有不同)JavaScript 编译器吗?
- 我将如何编写这样的编译器?
- 我可以重复使用现有的 js -> js 编译器吗?
【问题讨论】:
-
我提到了动机。我需要对闭包范围的编程访问,以便我可以在不同的物理机器上序列化和同步闭包。
-
嗯,但你最终不会序列化几乎所有内容吗?词法作用域是非常“父母”的,而不是块作用域。你试图写一个像样的节点模块来实现水平可扩展性?
-
@davin 是的。我确实会序列化所有内容。目的是能够向后兼容。
-
您可能想要重构编译后的代码是如何输出的。目前没有办法区分
myvariable='string'和var myvariable='mystring'。 -
我希望我能增加更多的赏金,因为我对实际做到这一点的简单方法非常感兴趣......
标签: javascript parsing compiler-construction