ObjectScriptã¯ãçµã¿èŸŒã¿å¯èœã§éåžžã«è»œéãªæ°ãããªããžã§ã¯ãæåã®
ãªãŒãã³ãœãŒã¹ããã°ã©ãã³ã°èšèªã§ãã ObjectScriptã¯ãJavaScriptãLuaãRubyãPHPãªã©ã®èšèªã®æ©èœãæ¡åŒµããŸãã
ãã®èšäºã§å
ã®èšèªæ§æãèªãããšãã§ããŸãã
ObjectScript 0.99-vm3-æ°ããé«éä»®æ³ãã·ã³ãšæ°æ©èœã
ããã€ãã®æŒç®åã¯
clone, numberof
ããŸããããšãã°ã
clone, numberof
ãªã©ã¯é¢æ°ã«çœ®ãæããããŸãã 颿°ã®æåŸã®å€ãèªåçã«è¿ãããŸãã ãªããžã§ã¯ãã®ã¡ã³ããŒã«ã¢ã¯ã»ã¹ããããã®çããšã³ããª-
@varname
ã颿°ã宣èšããããã®æ°ããçãæ§æãªã©ã远å ããŸããã ãã®ä»
ããŒã1. ObjectScriptä»®æ³ãã·ã³ãç»é²ãã
åŸæ¥ãããã°ã©ãã³ã°èšèªã¯ã¹ã¿ãã¯ãããä»®æ³ãã·ã³ïŒJavaã.NetãActionScriptãããã³ãã®ä»ïŒã䜿çšããŸãã ãã®ãããªVMã¯ã
push, pop
ã³ãã³ãã䜿çšããŠå€ãã¹ã¿ãã¯ã«è¿œå ããå¿
èŠã«å¿ããŠåé€ããŸãã æ°åŠæŒç®ãèšç®ãããšããã¹ã¿ãã¯ã®æäžéšã«ãã2ã€ã®å€ãåŒæ°ãšããŠäœ¿çšãããæŒç®ã®çµæãåŒæ°ã眮ãæããŸãã ããšãã°ã次ã®ã³ãŒãïŒ
i = j + k
ã¹ã¿ãã¯äžã®VMã¯ã³ãã³ãã«ã³ã³ãã€ã«ãããŸãïŒ
push_local j - push_local k - operator + - set_local i - pop -
ObjectScriptã以åã¯ã¹ã¿ãã¯VMã䜿çšããŠããŸããããçŸåšã¯ããã§ã¯ãããŸããã ä»®æ³ãã·ã³ã¯å®å
šã«æžãçŽãããŸããã ObjectScriptã¯çŸåšãã¬ãžã¹ã¿ããŒã¹ã®ä»®æ³ãã·ã³ã䜿çšããäžèšã®äŸã¯1ã€ã®ã³ãã³ãã«ã³ã³ãã€ã«ãããŸãã
add i, j, k
ãããã°æ
å ±ã®ObjectScriptã¯ããã®ã³ãã³ããæ¬¡ã®ããã«ç€ºããŸãã
var i = var j [operator +] var k
ã¢ã¯ã·ã§ã³ãå®è¡ããããã®ã³ãã³ãæ°ã®éãïŒã¹ã¿ãã¯VMã«5ã€ãã¬ãžã¹ã¿ãŒ1ã«1ã€ïŒã¯ããã«ããããŸãã å®éãã¹ã¿ãã¯VMã³ãŒãã«ã¯ã¬ãžã¹ã¿ãŒåœä»€ãããå€ãã®åœä»€ããããVMåœä»€ã®æ°ã¯å€§ããç°ãªããŸãã ããšãã°ãObjectScript VM2ã®ä»¥åã®ã¹ã¿ãã¯ããŒãžã§ã³ã«ã¯ã36åã®ã³ãã³ãã§çŸåšã®VM3ã«å¯ŸããŠ111åã®ã³ãã³ãããããŸããã ã³ãã³ããå°ãªãã»ã©ãVMãåçŽã«ãªããä¿å®ãšæé©åã容æã«ãªããå¿
èŠã«å¿ããŠãããç°¡åãªJITïŒãã·ã³ã³ãŒããžã®ã³ã³ãã€ã«ïŒãå«ãããŸããŸãªããã°ã©ãã³ã°èšèªã§ã®å®è£
ã容æã«ãªããŸãã
倿°ã®å€ã倿ŽããäŸïŒ
i, j = j, i
ObjectScriptã¯ããã®ã³ãŒãã3ã€ã®ã³ãã³ãã«ã³ã³ãã€ã«ããŸãã
move: # = var j move: var j = var i move: var i = #
ããã§ãïŒã¯äžæå€æ°ã§å€§æåãšå°æåã䜿çšããããšãæå³ããŸãã ã³ãã³ããèŠããšã倿°ã®å€ã®å€æŽãæé©ãªæ¹æ³ã§çºçããæ¬¡ã®ã³ãŒããšå®å
šã«åçã§ããããšãããããŸãã
temp = j j = i i = temp
ä»®æ³ãã·ã³ã®ç»é²ãšã¯äœã§ããïŒ
ã¬ãžã¹ã¿ä»®æ³ãã·ã³ã¯ãå€ã®ã¹ã¿ãã¯ã§ã¯ãªãã¬ãžã¹ã¿å
ã®å€ã§æ©èœããŸãã ã¬ãžã¹ã¿ãŒã¯ãã¢ã¯ã»ã¹å¯èœãªãšãã«åžžã«ååšããäžæçãªããŒã«ã«å€æ°ã§ãã
ããã«ãããç»é²VMã®æåã®ãã€ã©ã€ããé衚瀺ã«ãªããŸãã ã¬ãžã¹ã¿ã¯åžžã«èªã¿åããšæžã蟌ã¿ã®æºåãã§ããŠãããVMã¯ãã®ãããªå€æ°ïŒã¬ãžã¹ã¿ïŒã®ååšããã®å²ãåœãŠãšç Žæ£ã«ã€ããŠäžèŠãªãã§ãã¯ãè¡ãå¿
èŠã¯ãããŸããã
2çªç®ã®ãã€ã©ã€ãã¯ãããã·ã¥ã³ãã³ããšãããã³ãã³ãããªãããšã§ãã ãã®ãããªã³ãã³ãã¯ãVMã«ãšã£ãŠéåžžã«é«äŸ¡ã§ãã ã¹ã¿ãã¯ã倿ŽããŠãã®æäžäœãå¶åŸ¡ããå¿
èŠãããå Žåãã¹ã¿ãã¯ã®ãªãŒããŒãããŒãšå®è£
ã®å¿
èŠæ§ãåžžã«ãã§ãã¯ããå¿
èŠããããŸãã ã¹ã¿ãã¯ãæäœããããã®ã³ãã³ããåãé€ããšãã¹ã¿ãã¯äžã®äžæçãªã·ã§ã«ã¿ãŒããã€ãã¹ããŠãæäœã®çµæãçµæã®å€æ°ã«ããã«ä¿åããããšãå¯èœã«ãªããŸãã
3çªç®ã®ãã€ã©ã€ãã¯ãJITãå«ããã¯ããã«å°ãªãã³ãã³ãæ°ãããç°¡åãªVMã®å®è£
ã§ãã
äžèšã®äŸãããããããã«ãã¹ã¿ãã¯ãããVMã®ã³ãã³ãã¯ã¢ãããã¯ã¢ã¯ã·ã§ã³ã§ãããVMã®ç»é²ã®ã³ãã³ããããåçŽã§ãããå æããã¹ããŒã¹ãå°ãªããªããŸãã ããšãã°ã
push
ã³ãã³ãã¯1ãã€ãã§ãšã³ã³ãŒãã§ããæ¬¡ã®ã³ãã³ãã¯æ¬¡ã®ãã€ãã§ãšã³ã³ãŒãã§ããŸãã ããã«ã¯ãã©ã¹ãšãã€ãã¹ããããŸãã
ã¹ã¿ãã¯VMã®å©ç¹ã¯ãåœä»€ãããå°ãªããã€ãã§ãšã³ã³ãŒããããçµæã®ã³ãŒããå æããã¹ããŒã¹ãå°ãªããªãããšã§ãã
ãã€ãã¹ã¯ãã³ãã³ãã®äžéšããäŸãã°
push_double, jump
ãªã©ã®ããã«1ãã€ãã§ãšã³ã³ãŒãããããšããŸã äžå¯èœã§ããããšã§ãããã®ãããªã³ãã³ãã¯ã远å ã®åŒæ°ãå¿
èŠãšããŸãã byte-int32ïŒãã©ã³ãžã·ã§ã³çšã ãªããªã ã¹ã¿ãã¯VMå
ã®ã³ãã³ãã¯äºãã«ç¶ããã©ã®ããã«ãæŽåãããªãããã2鲿°ãŸãã¯ãªãã»ããint32ã¯ãä»»æã®ã¢ãã¬ã¹ã®ã¡ã¢ãªå
ã«ååšã§ããŸãã ããã»ããµã®ã¢ãŒããã¯ãã£ã«ç²ŸéããŠãã人ã¯ãããã«ããã«æ³šæãæãã§ãããããªããªãã ãã®ãããªåŒæ°ã¯ãåäžã®ããã»ããµã³ãã³ãã§èªã¿åãããšã¯ã§ããŸããã ããšãã°ãã¡ã¢ãªå
ã®å¥æ°ã¢ãã¬ã¹ã§
dword
ãèªã¿åãããšãããšãARMã¢ãŒããã¯ãã£ã§äŸå€ãçºçããããã°ã©ã ã¯ãšã©ãŒã§çµäºããŸãã ã¢ãŒããã¯ããç°ãªãã°ããšã©ãŒãçºçããããããã©ãŒãã³ã¹ãåçã«äœäžããå¯èœæ§ããããŸãã ãããã£ãŠããã€ãã®ã¹ããªãŒã ãããã®ãããªãã«ããã€ãåŒæ°ãèªã¿åãã«ã¯ããã€ãããšã«å¿
èŠãªã ãã§ããªãã»ããã®ãããæŒç®ã䜿çšããŠæçµåŒæ°ã圢æããŸãã ããã«ãããVMã®é床ããããã«äœäžããŸãã
ã¬ãžã¹ã¿ãŒVMã§ã¯ãå€ãã®ã³ãã³ãã«3ã€ã®åŒæ°ãããã4ãã€ããïŒåŒæ°ãšãšãã«ïŒå æããŸãã äžèšã®åé¡ã解決ããããã«ãObjectScriptã®ãã¹ãŠã®ã³ãã³ãã¯æŽåãããŠãããå®éã«ã¯äœ¿çšãããŠããªããããããã£ãŠãåžžã«4ãã€ããå æããŸãã ããšãã°ãObjectScriptã®
move
ã³ãã³ãã«ã¯2ã€ã®åŒæ°ããããŸãã ãã ãããã®å Žåã§ããObjectScriptã¯æ¬¡ã®ããã«ãªããŸãã å€ãã®å Žåã
move
ã³ãã³ãã¯äºãã«ç¶ãã2ã€ã®é£ç¶ããã¬ãžã¹ã¿ãåããŸãã ãã®å ŽåãObjectScriptïŒæé©å段éïŒã¯ã2ã€ã®
move
ã§ã¯ãªã1ã€ã®
move2
ã³ãã³ããçæããŸãã
move2 R, A, B
ããã¯ã2ã€ã®
move
ã³ãã³ããšããŠå®è¡ãããŸãã
move R, A move R+1, B
ãã®å Žåã
move2
ã¯3ã€ã®åŒæ°ãããã4ãã€ããå®å
šã«äœ¿çšããŸãã ã³ãã³ãã®èª¿æŽã«ããã1ã€ã®ããã»ããµã³ãã³ãã§ã³ãã³ããèªã¿åãããšãã§ãããããVMã®é床ãåäžããŸãã
ä»ã®å©ç¹ãšäœµããŠãæ°ããã¬ãžã¹ã¿VM3ãåããObjectScriptã¯ã以åã®ã¹ã¿ãã¯VM2ããã3åé«éã«ãªããŸããã
ã¬ãžã¹ã¿VMã¯ã©ã®ããã«æ©èœããã¬ãžã¹ã¿ã¯ã©ãããæ¥ãã®ã
ObjectScriptã³ã³ãã€ã©ã¯ãããã°ã©ãã颿°ã§äœ¿çšããããŒã«ã«å€æ°ã ãã§ãªãããã¹ãŠã®äžæå€æ°ïŒã³ã³ãã€ã©ã«ãã£ãŠèšå®ãããïŒã«é¢ããæ
å ±ãåéããŸãã ãããã£ãŠãã¬ãžã¹ã¿ã¯é¢æ°å
ã®äžæçãªããŒã«ã«å€æ°ã§ãã VMã¯ããŒã«ã«å€æ°ãšã¬ãžã¹ã¿ãæããã€ã³ããã¯ã¹ã§ã¯å®å
šã«åçã§ãã ãã®ãããåãVMã³ãã³ãã§ããŒã«ã«å€æ°ãšã¬ãžã¹ã¿ã䜿çšã§ããæäœã®çµæãäžæå€æ°ããã€ãã¹ããŠããŒã«ã«å€æ°ã«ããã«ä¿åã§ããŸãã
ããšãã°ã次ã®ã³ãŒãïŒ
k = i - j*k / (x + y - z*i / j) + i
ObjectScriptã®ã³ã³ãã€ã«çµæïŒ
# (59) = var j (5) [operator *] var k (6) # (60) = var x (7) [operator +] var y (8) # (61) = var z (9) [operator *] var i (4) # (61) = # (61) [operator /] var j (5) # (60) = # (60) [operator -] # (61) # (59) = # (59) [operator /] # (60) # (58) = var i (4) [operator -] # (59) var k (10) = # (58) [operator +] var i (4)
æ¬åŒ§å
ã®ã€ã³ããã¯ã¹ã¯ãããŒã«ã«å€æ°ãŸãã¯ã¬ãžã¹ã¿ãé
眮ãããŠããå Žæã§ãïŒã€ã³ããã¯ã¹ã¯ã³ã³ãã€ã«æã«èšç®ãããŸãïŒã ãã¹ãŠã®ããŒã«ã«å€æ°ïŒäžæå€æ°-ã¬ãžã¹ã¿ãå«ãïŒã«ã€ããŠã³ã³ãã€ã©ã«ãã£ãŠã³ã³ãã€ã«ãããæ
å ±ã«ããããã®æ©èœãå®è¡ããããã«å¿
èŠãªæå€§ã¹ã¿ãã¯ãµã€ãºãèšç®ã§ããŸãã 颿°ãèµ·åãããšãã¹ã¿ãã¯ã®æäžäœãä¿åãããã³ã³ãã€ã©ãŒã«ãã£ãŠæ±ºå®ãããã¹ã¿ãã¯ãµã€ãºãäºçŽãããŸãã ã¬ãžã¹ã¿ïŒããŒã«ã«å€æ°ïŒãžã®ã€ã³ããã¯ã¹ã¯ãæ ŒçŽãããã¹ã¿ãã¯ã®æäžéšããã®çžå¯Ÿãªãã»ãããšããŠäœ¿çšãããŸããããã«ãããé£ãªãååž°çãªé¢æ°åŒã³åºããè¡ãããšãã§ããŸãã
ã¬ãžã¹ã¿ãŒVMã§ã®é¢æ°åŒã³åºã
颿°ãåŒã³åºãããã«ãObjectScriptã¯ã颿°ã®åŒæ°ãé
眮ããã¬ãžã¹ã¿ã®é£ç¶ã·ãŒã±ã³ã¹ãäºçŽããŸãã æ¬¡ã«ã颿°èªäœããæåã®åŒæ°ã®éå§äœçœ®ïŒã·ãŒã±ã³ã¹ã®éå§ïŒããã³ã·ãŒã±ã³ã¹å
ã®å€ã®æ°ã«é¢ããæ
å ±ãšãšãã«åŒã³åºãããŸãã æåã®åŒæ°ã¯æ°ãã颿°ã®ã¹ã¿ãã¯ã®å
é ã«ãªããåŒæ°ã¯æ¢ã«ã¹ã¿ãã¯å
ã®å¿
èŠãªãªãã»ããã«ãããããŒã«ã«å€æ°ã«ãªããŸãã 3ã€ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠé¢æ°ãåŒã³åºããšãã®è¡šç€ºäŸïŒ
func(i, k - x*y * (z + i), j*k)
ObjectScriptã®ã³ã³ãã€ã«çµæïŒ
begin call move: # (59) = var func (11) move: # (60) = const null (-1) move: # (61) = var i (4) # (63) = var x (7) [operator *] var y (8) # (64) = var z (9) [operator +] var i (4) # (63) = # (63) [operator *] # (64) # (62) = var k (10) [operator -] # (63) # (63) = var j (5) [operator *] var k (10) end call: start 59, params 5
颿°ã¯ãã€ã³ããã¯ã¹59ããå§ãŸã5ã€ã®å€ã®ã·ãŒã±ã³ã¹ã§å§ãŸããŸããæåã®2ã€ã®å€ã¯ããŠãŒãã£ãªãã£ãã©ã¡ãŒã¿ãã€ãŸã59-颿°èªäœã60-颿°ã®å ŽåïŒãã®å Žåã¯nullïŒã§ãã
move: # (59) = var func (11) move: # (60) = const null (-1)
次ã«ããã©ã¡ãŒã¿èªäœã転éãããã¬ãžã¹ã¿61ã63ã«é
眮ãããŸããæåã®ãã©ã¡ãŒã¿ã¯
i
倿°ã®ã¿ã§ãã¬ãžã¹ã¿61ã«ã³ããŒãããŸãã
move: # (61) = var i (4)
2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ãæ°åŠæŒç®
k - x*y * (z + i)
ã®çµæã§ãããã¬ãžã¹ã¿62ã«æ ŒçŽãããŸãã
# (63) = var x (7) [operator *] var y (8) # (64) = var z (9) [operator +] var i (4) # (63) = # (63) [operator *] # (64) # (62) = var k (10) [operator -] # (63)
3çªç®ã®ãã©ã¡ãŒã¿ãŒïŒ
j*k
ïŒã¯ã¬ãžã¹ã¿ãŒ63ã«ä¿ç®¡ãããŸãã
# (63) = var j (5) [operator *] var k (10)
ããã§ã·ãŒã±ã³ã¹ã®æºåãå®äºãã颿°ãåŒã³åºãããšãã§ããŸãã
䜿çšãããç»é²ä»®æ³ãã·ã³ã¯ã©ãã§ãã
Register VMã¯Lua 5.0以éã§ã䜿çšãããquakecïŒquake 1ããã³å€æ°ã®ããŒãçšã®ã¹ã¯ãªããããã°ã©ãã³ã°èšèªããããŸããïŒã«ã¯ãJavaçšã®ç»é²VMïŒDalvik VMãªã©ïŒããããŸãã æ£åŒã«ã¯ããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ãããC ++ / Cããã³ãã®ä»ã®èšèªã®ããã°ã©ã ã¯ãå
éšæäœçšã®ã¬ãžã¹ã¿ã¢ãã«ãšé¢æ°åŒã³åºãçšã®ã¹ã¿ãã¯ã䜿çšããŸãã
åèš
æ°ãã
Register ObjectScript Virtual Machine ïŒVM3ïŒã¯ã以åã®ã¹ã¿ãã¯VM2ã®3åã®1ã ãé«éã§ãVM2ã®111åã«å¯ŸããŠ36åã®ã³ãã³ããããããŸããã å°æ°ã®ããŒã ãVMã倧å¹
ã«ç°¡çŽ åããå¿
èŠã«å¿ããŠJITãå®è£
ããæ©äŒãå¢ãããŸãã
ã¹ã¿ãã¯ã¯ããŒã«ã«é¢æ°å€æ°ã«äœ¿çšãããååž°åŒã³åºãã®å¯èœæ§ãæäŸããŸãã å¿
èŠãªã¹ã¿ãã¯ãµã€ãºã¯ã颿°ãåŒã³åºããããšãã«äžåºŠäºçŽãããŸããVM3ã³ãã³ãèªäœã¯ã¹ã¿ãã¯ãå®è£
ããŸããã
ã¹ã¿ãã¯ã¯ObjectScript APIã§ã䜿çšãããã«ã¹ã¿ã ã³ãŒããšã®çµ±åãç°¡çŽ åããŸãã ObjectScript APIã¯å€æŽãããã以åã®ããŒãžã§ã³ãšå®å
šã«äºææ§ããããŸãã
ç¶ç¶
次ã®ããŒãã§ã¯ãObjectScriptã«ç»å Žããä»ã®æè¡é©æ°ã«ã€ããŠèª¬æããŸããããšãã°ãéä¹é¢æ°ã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
print "factorial(10) = " .. {|a| a <= 1 ? 1 : a * _F(a-1)}(10)
åºåãããŸãïŒ
factorial(10) = 3628800
ä»ã®å€ãã® ãã®ä»
ObjectScriptã«é¢ãããã®ä»ã®é¢é£èšäºïŒ