夏のインターン講義「1営業日で書くJavaScriptコンパイラ」の設計と実装


20 7

1 JavaScript 稿調 JavaScriptJetSpider




Cookpad Summer Intern 2015 - Programming Paradigm from Minero Aoki 


JetSpider aamine/jetspider-course · GitHub

JetSpider VM aamine/jetspider-vm · GitHub


1 1 45








UX




UX

f:id:mineroaoki:20151020135407p:plain




3


JavaHaskell

PrologOCaml



x86






JavaScript

JavaScript 1 VM

goto





(一)調

(二)JavaOOP

(三)

(四)RubyRuby使

(五)VM


1LispHaskellOCaml23JavaC#C34RubyPython345PerlJavaScriptJavaScript



Haskell Haskell Ruby Ruby

RKelly RubyJavaScript 使

JavaScriptVM


JavaScriptRuby

VM VM JavaScriptVM


Google V8JavaScript

WebKitJSJavaScriptCoreWebKitWebKit

RhinoJVMVM

FirefoxJSSpiderMonkey


DukTapeJS SpiderMonkey

VM

VM 1VM VM使

SpiderMonkey Firefox  ./configure ; make  SpiderMonkey1

JetSpider VM


JavaScriptJetSpider JetSpider

f:id:mineroaoki:20151020135413p:plain
SpiderMonkeyVM使 SpiderMonkeyAPI JavaScriptAPI API

使API JSScript JS_ExecuteScript Java

JSScript grep XDReXternal Data Representation

XDRSun RPC XDR APIAPI使 SpiderMonkeyJS_XDRScript JSScript

extern  SpiderMonkey.diff 

RubyXDRJSScript Rubypack JetSpider
      def serialize_JSScript(f)
        f.uint32 JSXDR_MAGIC_SCRIPT_CURRENT
        f.uint16 local_variables.size
        f.uint16 arguments.size
        f.uint16 upvars.size
        f.uint16(padding = 0)
        f.uint32(*vars_bitmap)
        var_names.each do |name|
          f.jsstring name
        end
        code = bytecode()
        f.uint32 code.length
        f.uint32 prolog_length
        f.uint16 JS_VERSION
        (以下略)

f.uint32f.uint16pack使DSL

VM


VM

JetSpiderJavaScriptVM --dump-ast--dump-semVM--disassemble--traceVM

--dump-astAST
% ./bin/jetspider --dump-ast exp/arith.js
type: SourceElementsNode
value:
- type: FunctionDeclNode
  value: f
  arguments:
  - type: ParameterNode
    value: x
  function_body:
    type: FunctionBodyNode
    value:
      type: SourceElementsNode
      value:
      - type: ReturnNode
        value:
          type: AddNode
          left:
            type: NumberNode
            value: 1
          value:
            type: MultiplyNode
            left:
              type: ResolveNode
              value: x
            value:
              type: NumberNode
              value: 3

1



VM SpiderMonkey if

if
if (1 <3) {
    print(7);
} else {
    print(9);
}


main:
00000: 3f         one 
00001: dd 03      int8 3
00003: 14         lt  
00004: 07 00 10   ifeq 20 (16)
00007: d9 00 00   callgname "print"
00010: dd 07      int8 7
00012: 3a 00 01   call 1
00015: 02         popv
00016: 06 00 0d   goto 29 (13)
00019: bd         nullblockchain
00020: d9 00 00   callgname "print"
00023: dd 09      int8 9
00025: 3a 00 01   call 1
00028: 02         popv
00029: c5         stop



2 TDD

SpiderMonkey


print(1 + 2);


main:
00000: d9 00 00   callgname "print"
00003: dd 03      int8 3
00005: 3a 00 01   call 1
00008: 02         popv
00009: c5         stop



稿

調 調6



 / Minero Aoki