V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
guushen
V2EX  ›  问与答

理论上,可以用纯 JavaScript 来实现 JavaScript 引擎么?(只限于目前基于 ECMAScript 5.1 版本 spec 的,CommonJS 不在考虑范围内,如 Node)

  •  
  •   guushen · 2014-03-15 02:41:34 +08:00 · 4178 次点击
    这是一个创建于 3708 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人暂时对静态语言以及编译机制不太了解,如今比较流行的JS引擎V8采用的语言为C++ & JS,其中大部分C++代码实现了引擎的底层核心,一些不涉及硬件的外围API和wrapper之类的用JS来写。其实JS引擎就相当于一门语言的“编译器”,既然能用C语言本身来写C的编译器,那么我的问题就是「从理论上说能否用JS语言本身来实现JS引擎呢?」谢谢!

    PS:本人觉得不能。
    第 1 条附言  ·  2014-03-15 19:31:21 +08:00
    有个疑惑就是用JS来写JS解析器的话,怎么操作硬件呢,如变量地址分配、GC等。

    看了各位回复我考虑了下,同一段JS代码在浏览器中运行,用C++解析器来解析,最终在内存中得到2进制的机器码,那么换做用JS本身来写解析器的话,只要利用它将要执行的JS代码转为相当的机器码就行了,是这样么?谢谢!
    12 条回复    1970-01-01 08:00:00 +08:00
    dreampuf
        1
    dreampuf  
       2014-03-15 02:52:50 +08:00   ❤️ 1
    jybox
        2
    jybox  
       2014-03-15 03:43:51 +08:00   ❤️ 2
    理论上肯定没问题啊,任何一个图灵完备的语言都可以实现自举。
    kurtis
        3
    kurtis  
       2014-03-15 08:39:01 +08:00   ❤️ 1
    eval
    jsonline
        4
    jsonline  
       2014-03-15 08:43:00 +08:00 via Android   ❤️ 1
    当然可以啊
    Mutoo
        5
    Mutoo  
       2014-03-15 09:28:25 +08:00   ❤️ 1
    js是解析型语言,解析器的难度比编译器低太多了。js要解析自己完全是小菜一叠。

    实际上js可以做的事情多着,可以看看js延伸出来的
    paperscript (http://paperjs.org)
    processing.js(http://processingjs.org)
    甚至 gameboy emulator (http://imrannazar.com/GameBoy-Emulation-in-JavaScript)
    还有更牛的 ECMAScripten(https://github.com/kripken/emscripten/wiki) 能把cpp直接变成js跑
    zoowii
        6
    zoowii  
       2014-03-15 09:32:47 +08:00   ❤️ 1
    可以啊。用JS实现一个JS的编译器,然后自举
    mantianyu
        7
    mantianyu  
       2014-03-15 09:48:39 +08:00 via iPad   ❤️ 1
    @kurtis eval 应该是把里面的参数直接送给解释器取得执行结果吧,感觉不一定是js自己解释里面的内容
    zoowii
        8
    zoowii  
       2014-03-15 11:39:45 +08:00   ❤️ 1
    @dreampuf 我也创建过一个这个js.js项目,不过因为没时间去做这个玩具后来删掉了。竟然真有人做了
    Numbcoder
        9
    Numbcoder  
       2014-03-15 16:45:26 +08:00   ❤️ 1
    JS 是图灵完备的,当然可以!
    guushen
        10
    guushen  
    OP
       2014-03-15 19:07:47 +08:00
    @Mutoo 感谢回复,我觉得JS本身不能直接操作硬件,如果用JS语言本身来写JS解析器的话,最基础的比如,如何分配变量地址呢?我不是很懂,谢谢!
    guushen
        11
    guushen  
    OP
       2014-03-15 19:08:49 +08:00
    @dreampuf 感谢,我研究下!
    yangff
        12
    yangff  
       2014-03-15 20:01:13 +08:00
    vm.js...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3296 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:41 · PVG 21:41 · LAX 06:41 · JFK 09:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.