Spiga

Jscex使用BSD授权协议正式发布

2011-04-22 00:18 by Jeffrey Zhao, 8209 visits, 收藏, 编辑

这次打算把Jscex好好搞一下了,其实很少会有技术方面的障碍能“轮到”我们去突破,但我觉得Jscex的确有机会,HTML 5、Node.js各个都是红火的玩意儿。前几天我花了两个晚上用半生不熟的中式英语写了一篇自认为比较完整的说明文字放到了Github上的项目首页上,没想到几个小时后便收到了StratifiedJS(一个与Jscex目标有些类似的项目)作者的邮件,提到了一些关于StratifiedJS的事情。我向他咨询了StratifiedJS的某些细节问题,也向他简单介绍了Jscex的实现原理。如今Jscex已经使用BSD授权协议正式发布(中文站也会在近期推出),再进行一些细节上的优化便要开始作推广了。

最近的一次优化便是去除不必要的Delay方法调用。Delay的目的是延迟某段代码的执行时间,确保它只会在合适的时间执行,这对于非“延迟”及有副作用的语言来说十分重要。在F#中Delay方法的签名如下(Jscex与之类似):

// async.Delay
((unit -> Async<'a>) -> Async<'a>)

Delay函数可以不断嵌套,从效果说来讲不会有所区别,例如:

builder.Delay(function () {
    return builder.Delay(function () {
        return builder.Delay(function () {
            return builder.Loop(...);
        });
    });
});

上面这段代码和直接一个builder.Loop相比不会对结果产生任何影响,但是显然,从生成代码的整洁、美观程度(这涉及到可调试性)及性能都会有所损耗。之前的Jscex编译器会生成不必要的Delay(当然也不会有上面那么夸张),那是因为以前的代码生成器只是直接遍历从UglifyJS解析器那里获得的AST,以此来生成代码。新的编译器重新调整了结构和策略,会先将UglifyJS的AST转化为一个中间形式——我把它叫做Jscex AST,然后再让代码生成器从Jscex AST生成代码。新的生成器在工作时,会略过某些delay节点,直接从它的自节点中生成代码,以此达到去除不必要的Delay方法调用的目的。

举例来说,一个快速排序的Jscex函数:

var bubbleSortAsync = eval(Jscex.compile("async", function (array) {
    for (var x = 0; x < array.length; x++) {
        for (var y = 0; y < array.length - x; y++) {
            var r = $await(compareAsync(array[y], array[y + 1]));
            if (r > 0) {
                $await(swapAsync(array, y, y + 1));
            }
        }
    }
}));

它会生成如下的代码(与之前的结果相比省去了一些Delay方法调用):

var bubbleSortAsync = (function (array) {
    var $_builder_$ = Jscex.builders["async"];
    return $_builder_$.Start(this, $_builder_$.Delay(function () {
        return $_builder_$.Delay(function () {
            var x = 0;
            return $_builder_$.Loop(
                function () {
                    return x < array.length;
                },
                function () {
                    x++;
                },
                $_builder_$.Delay(function () {
                    return $_builder_$.Delay(function () {
                        var y = 0;
                        return $_builder_$.Loop(
                            function () {
                                return y < (array.length - x);
                            },
                            function () {
                                y++;
                            },
                            $_builder_$.Delay(function () {
                                return $_builder_$.Bind(compareAsync(...), function (r) {
                                    return $_builder_$.Delay(function () {
                                        if (r > 0) {
                                            return $_builder_$.Bind(swapAsync(...), function () {
                                                return $_builder_$.Normal();
                                            });
                                        } else {
                                            return $_builder_$.Normal();
                                        }
                                    });
                                });
                            }),
                            false
                        );
                    });
                }),
                false
            );
        });
    }));
})

当然,Jscex还是有进一步优化的空间。例如包括保留“没有bind操作”的代码块,以及“嵌套Jscex函数”等等。最近一段时间应该会不断有一些更新。如果您在用JavaScript开发异步程序,也不妨一起来使用Jscex吧,它毫无疑问能显著改善您的编程生活。

广告时间:第四届nBazaar技术交流会将于4月23日(本周六)于畅星大厦(上海市浦东新区碧波路888号,地铁二号线张江高科站下,步行10分钟可达)副楼3楼会议厅举行,在此欢迎您的到来,请于下午1点前准时入场。没有报名的朋友也可以现场报名。由于领导支持,我们将在现场送出市场价999元的盛大Bambook一台作为幸运观众的礼品,此外图灵出版社也赞助了十几本图书将会送给积极发言的观众。更多详细信息请参考活动首页

原文:Jscex使用BSD授权协议正式发布

Add your comment

18 条回复

  1. #1楼 wrafe      2011-04-22 01:02
    趁大家都在熟睡的时候,先抢个沙发坐坐!^O^
     回复 引用 查看   
  2. #2楼 xujiajay      2011-04-22 06:40
    我板凳 哈哈
     回复 引用 查看   
  3. #3楼 大石头      2011-04-22 07:13
    脚本语言在运行时解析自己,非常有意思!
     回复 引用 查看   
  4. #4楼 bluewin      2011-04-22 08:58
    欢迎老赵归来
     回复 引用 查看   
  5. #5楼 kkun      2011-04-22 09:21
    Bambook一台。。。话说这封电纸书性价比很高
     回复 引用 查看   
  6. #6楼 testzhangsan      2011-04-22 09:32
    如果你的英文都是“半生不熟的中式英语”的话,那我的英语就是“全生不熟的中式英语”
     回复 引用 查看   
  7. #7楼 贺臣      2011-04-22 09:33
    技术交流会来不了啊,真的很悲催!强制性参加公司活动,55555
     回复 引用 查看   
  8. #8楼 彦斌      2011-04-22 09:34
    能力有限,看不懂这是什么,用在哪里
    我去下载一个看下。
     回复 引用 查看   
  9. #9楼 Leon Weng      2011-04-22 09:48
    BamBook的软件要是都免费诱惑就更大了。
    恭喜!
     回复 引用 查看   
  10. #10楼 xiao ming      2011-04-22 10:12
    讲的非常好,不过BamBook还是第一次听说
    BamBook、kindle、汉王等那个更好呢,呵呵
     回复 引用 查看   
  11. #11楼 C#.NET通用权限管理系统组件      2011-04-22 11:22
    强烈支持老赵多写文章,多来博客园。
     回复 引用 查看   
  12. #12楼 Orison      2011-04-29 09:24
    今天一个框架 明天一个框架 后天又出来两个框架... 哎
     回复 引用 查看   
  13. #13楼 ︶ㄣ這玍萿 铷呲傫      2011-04-29 11:29
    允许我在这叫您一声老赵,今天我才看到您的那篇关于北大青鸟的文章,我想表达的就是对您的支持,我也是培训机构里面出来的,我是真的从心里鄙视他们,为了赚钱什么都敢说、什么广告都敢打、他们经常说的一点就是什么比大学里面有实践经验 他们都是理论,可是从我在上班中深深感觉到没有理论你真的什么都不是,只会你懂得,思想更本没法拓展出去,更本就不知道里面的原理,遇到问题经常是在网上找一段代码解决了事、其实有理论真的很好,一年以后彼此的距离就明显了
     回复 引用 查看   
  14. #14楼[楼主] Jeffrey Zhao      2011-04-29 16:22
    @Orison
    框架和类库没有分清楚啊,哈哈。
     回复 引用 查看   
  15. #15楼 天行健 自强不息      2011-04-29 18:04
    顶!终于又在这儿看到你的文章了,可惜现在水平不限,看不太懂
     回复 引用 查看   
  16. #16楼 (张超)      2011-05-05 23:40
    虽然没看懂
    沙发是必要的
     回复 引用 查看   
  17. #17楼 秦时 明月      2011-05-13 11:56
    楼主,你这东西可以用来做些什么?
     回复 引用 查看   
  18. #18楼[楼主] Jeffrey Zhao      2011-05-13 14:23
    @秦时 明月
    先看看说明吧。
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2024408 iIIso7keiIc=