
ãã®èšäºã§ã¯ãããŸããŸãªJITã³ã³ãã€ã©ã®å®è£ ã®è©³çŽ°ãšæäœãããã³æé©åæŠç¥ã«ã€ããŠèª¬æããŸããååã«è©³çްã«èª¬æããŸãããå€ãã®éèŠãªæŠå¿µã¯çç¥ããŸããã€ãŸãããã®èšäºã«ã¯ãå®è£ ãšèšèªã®æ¯èŒã§åççãªçµè«ã«éããã®ã«ååãªæ å ±ããããŸããã
JITã³ã³ãã€ã©ã®åºæ¬ãçè§£ããã«ã¯ããã®èšäºããèªã¿ãã ããã
å°ããªã¡ã¢ïŒ
, , , - . , JIT ( ), , . , , , , . - , , .
- Pypy
- GraalVM C
- OSR
- JIT
()
LuaJITã¯ãããããã¬ãŒã¹ã䜿çšããŸãã Pypyã¯ã¡ã¿ãã¬ãŒã¹ãå®è¡ããŸããã€ãŸããã·ã¹ãã ã䜿çšããŠãã¬ãŒã¹ããã³JITã€ã³ã¿ãŒããªã¿ãŒãçæããŸãã PypyãšLuaJITã¯ãæš¡ç¯çãªPythonãšLuaã®å®è£ ã§ã¯ãªããã¹ã¿ã³ãã¢ãã³ã®ãããžã§ã¯ãã§ããç§ã¯LuaJITãé©ãã»ã©é«éã§ãããšç¹åŸŽã¥ããããèªäœãæéã®åçèšèªå®è£ ã®1ã€ãšããŠèª¬æããŸã-ãããŠç§ã¯çµ¶å¯Ÿã«ãããä¿¡ããŠããŸãã
ãã¬ãŒã¹ãéå§ããã¿ã€ãã³ã°ãçè§£ããããã«ãã€ã³ã¿ãŒããªã¿ãŒã«ãŒãã¯ãããã«ãŒããæ¢ããŸãïŒãããã³ãŒãã®æŠå¿µã¯ãã¹ãŠã®JITã³ã³ãã€ã©ãŒã«å ±éã§ãïŒïŒã次ã«ãã³ã³ãã€ã©ã¯ã«ãŒããããã¬ãŒã¹ãããå®è¡å¯èœãªæäœãèšé²ããŠãé©åã«æé©åããããã·ã³ã³ãŒããã³ã³ãã€ã«ããŸãã LuaJITã§ã¯ãã³ã³ãã€ã«ã¯ãLuaJITã«åºæã®åœä»€ã®ãããªäžé衚çŸãæã€ãã¬ãŒã¹ã«åºã¥ããŠããŸãã
Pypyã§ãã¬ãŒã¹ãå®è£ ããæ¹æ³
Pypyã¯ã1619åã®å®è¡åŸã«é¢æ°ã®ãã¬ãŒã¹ãéå§ãã1039åã®å®è¡åŸã«ã³ã³ãã€ã«ããŸããã€ãŸãã颿°ãããé«éã«åäœãéå§ããã«ã¯ã颿°ã®çŽ3000åã®å®è¡ãå¿ èŠã§ãããããã®å€ã¯PypyããŒã ã«ãã£ãŠæ éã«éžæãããŠãããäžè¬ã«ã³ã³ãã€ã©ã®äžçã§ã¯ãå€ãã®å®æ°ãæ éã«éžæãããŠããŸãã
åçèšèªã¯æé©åãå°é£ã«ããŸãã以äžã®ã³ãŒã
Falseã¯ãåžžã«falseã«ãªããããããå³å¯ãªèšèªã§éçã«åé€ã§ããŸãããã ããPython 2ã§ã¯ãããã¯å®è¡æãŸã§ä¿èšŒã§ããŸããã
if False:
print("FALSE")
ã€ã³ããªãžã§ã³ãããã°ã©ã ã®å Žåããã®æ¡ä»¶ã¯åžžã«falseã«ãªããŸããæ®å¿µãªãããå€
Falseã¯åå®çŸ©ã§ããåŒã¯ã«ãŒãã«ãªããå¥ã®å Žæã§åå®çŸ©ã§ããŸãããããã£ãŠãPypyã¯ãã¬ãŒãããäœæã§ããŸãããã£ãã§ã³ããŒã倱æããå ŽåãJITã¯è§£éã«ãŒãã«ãã©ãŒã«ããã¯ããŸããPypyã¯ãã®åŸãšåŒã°ããå¥ã®å®æ°ïŒ200ïŒã䜿çšããŠãã¬ãŒã¹ææ¬²ãã«ãŒãã®çµäºåã«æ°ãããã¹ã®æ®ãã®éšåãã³ã³ãã€ã«ãããã©ãããæ±ºå®ããŸãããã®ãµããã¹ã¯ããªããžãšåŒã°ããŸãã
ããã«ãPypyã¯ãããã®å®æ°ãåŒæ°ãšããŠæäŸããŸãããããã®å®æ°ã¯ãå®è¡æã«ã«ã¹ã¿ãã€ãºããŠãæ§æã®å±éãã€ãŸãã«ãŒãæ¡åŒµãã€ã³ã©ã€ã³åãè¡ãããšãã§ããŸããããã«ãã³ã³ãã€ã«ãå®äºããåŸã«è¡šç€ºã§ããããã¯ãæäŸããŸãã
def print_compiler_info(i):
print(i.type)
pypyjit.set_compile_hook(print_compiler_info)
for i in range(10000):
if False:
pass
print(pypyjit.get_stats_snapshot().counters)
äžèšã§ã¯ãé©çšãããã³ã³ãã€ã«ã®ã¿ã€ãã衚瀺ããããã®ã³ã³ãã€ã«ããã¯ãåããçŽç²ãªPythonããã°ã©ã ãäœæããŸããããã®ã³ãŒãã¯ãæåŸã«é²åŸ¡åŽã®æ°ã瀺ãããŒã¿ãåºåããŸãããã®ããã°ã©ã ã§ã¯ã1ã€ã®ã«ãŒãã³ã³ãã€ã«ãš66ã®ãã£ãã§ã³ããŒãååŸããŸãããåŒã
ifåçŽãªã¢ãŠããªãã«ãŒããã¹ã«çœ®ãæãããšãããforæ®ãã®ãã£ãã§ã³ããŒã¯59人ã ãã§ããã
for i in range(10000):
pass # removing the `if False` saved 7 guards!
ãããã®2è¡ãã«ãŒã
forã«è¿œå ããããšã§ã2ã€ã®ã³ã³ãã€ã«ãåŸããããã®ãã¡ã®1ã€ã¯ãããªããžãã¿ã€ãã§ããã
if random.randint(1, 100) < 20:
False = True
åŸ ã£ãŠãããªãã¯ã¡ã¿ãã¬ãŒã¹ã«ã€ããŠè©±ããŠããŸããïŒ
ã¡ã¿ãã¬ãŒã¹ã®èåŸã«ããèãæ¹ã¯ããã€ã³ã¿ãŒããªã¿ãŒãäœæããŠã³ã³ãã€ã©ãŒãç¡æã§å ¥æããããŸãã¯ãã€ã³ã¿ãŒããªã¿ãŒãJITã³ã³ãã€ã©ãŒã«å€ããããšèª¬æã§ããŸããã³ã³ãã€ã©ãŒãæžãã®ã¯é£ããã§ãããããŠããªãããããç¡æã§æã«å ¥ããããšãã§ããã°ãã¢ã€ãã¢ã¯ã¯ãŒã«ã§ãã Pypyã«ã¯ãã€ã³ã¿ãŒããªã¿ãŒãšã³ã³ãã€ã©ãŒããå«ãŸããŠããŸããããåŸæ¥ã®ã³ã³ãã€ã©ãŒãæç€ºçã«å®è£ ããŠããŸããã
Pypyã«ã¯RPythonããŒã«ïŒPypyçšã«æ§ç¯ïŒããããŸããéèš³ãæžãããã®ãã¬ãŒã ã¯ãŒã¯ã§ãããã®èšèªã¯äžçš®ã®Pythonã§ãããéçã«åä»ããããŠããŸããéèš³ãæžãå¿ èŠãããã®ã¯ãã®èšèªã§ãããã®èšèªã¯ãæšæºã®ã©ã€ãã©ãªãŸãã¯ããã±ãŒãžãå«ãŸããŠããªããããåä»ãPythonããã°ã©ãã³ã°çšã«èšèšãããŠããŸããã RPythonããã°ã©ã ã¯ãã¹ãŠæå¹ãªPythonããã°ã©ã ã§ãã RPythonã³ãŒãã¯Cã«å€æãããŠãããã³ã³ãã€ã«ãããŸãããããã£ãŠããã®èšèªã®ã¡ã¿ã³ã³ãã€ã©ã¯ãã³ã³ãã€ã«ãããCããã°ã©ã ãšããŠååšããŸãã
metatraceã®ãã¬ãã£ãã¯ã¹ãmetaãã¯ãããã°ã©ã ã§ã¯ãªããã€ã³ã¿ãŒããªã¿ãŒã®å®è¡æã«ãã¬ãŒã¹ãå®è¡ãããããšãæå³ããŸããä»ã®ã€ã³ã¿ãŒããªã¿ãŒãšã»ãŒåãããã«åäœããŸãããæäœã远跡ã§ãããã¹ãæŽæ°ããããšã§ãã¬ãŒã¹ãæé©åããããã«èšèšãããŠããŸããããã«ãã¬ãŒã¹ãããšãã€ã³ã¿ãŒããªã¿ãŒãã¹ãããæé©åãããŸããååã«æé©åãããã€ã³ã¿ãŒããªã¿ãŒã¯ãç¹å®ã®ãã¹ã«åŸããŸãããŸããRPythonã®ã³ã³ãã€ã«ã«ãã£ãŠååŸãããããã®ãã¹ã§äœ¿çšããããã·ã³ã³ãŒãã¯ãæçµçãªã³ã³ãã€ã«ã§äœ¿çšã§ããŸãã
ã€ãŸããPypyã®ãã³ã³ãã€ã©ãã¯ã€ã³ã¿ããªã¿ãã³ã³ãã€ã«ãããããPypyã¯ã¡ã¿ã³ã³ãã€ã©ãšåŒã°ããããšããããŸããæé©åãããã€ã³ã¿ãŒããªã¿ãŒã®ãã¹ã»ã©ãå®è¡ããŠããããã°ã©ã ãã³ã³ãã€ã«ããŸããã
ã¡ã¿ãã¬ãŒã¹ã®æŠå¿µã¯çŽããããããã«æããããããããŸããããã®ããã説æã®ããã«ããšã ããçè§£ããéåžžã«è²§åŒ±ãªããã°ã©ã ãäœæ
a = 0ããŸããa++toã
# interpreter written with RPython
for line in code:
if line == "a = 0":
alloc(a, 0)
elif line == "a++":
guard(a, "is_int") # notice how in Python, the type is unknown, but after being interpreted by RPython, the type is known
guard(a, "> 0")
int_add(a, 1)
ãã®ããããµã€ã¯ã«ãå®è¡ãããšã次ã®ããã«ãªããŸãã
a = 0
a++
a++
ãã©ãã¯ã¯æ¬¡ã®ããã«ãªããŸãã
# Trace from numerous logs of the hot loop
a = alloc(0) # guards can go away
a = int_add(a, 1)
a = int_add(a, 2)
# optimize trace to be compiled
a = alloc(2) # the section of code that executes this trace _is_ the compiled code
ãã ããã³ã³ãã€ã©ã¯ç¹å¥ãªåå¥ã®ã¢ãžã¥ãŒã«ã§ã¯ãªããã€ã³ã¿ããªã¿ã«çµã¿èŸŒãŸããŠããŸãããããã£ãŠãè§£éãµã€ã¯ã«ã¯æ¬¡ã®ããã«ãªããŸãã
for line in code:
if traces.is_compiled(line):
run_compiled(traces.compiled(line))
continue
elif traces.is_optimized(line):
compile(traces.optimized(line))
continue
elif line == "a = 0"
# ....
JVMã®æŠèŠ
ç§ã¯GraalããŒã¹ã®TruffleRubyèšèªã§4ãæéå·çããããã«å€¢äžã«ãªããŸããã
ïŒãããããã«æ€çŽ¢ããããããã®ããã«åœåãããã¹ããããããã¹ãããïŒã¯ãæšæºã®Javaã®ã€ã³ã¹ããŒã«ã«ä»å±ããŠããä»®æ³ãã·ã³ã§ãããã«ãã¬ãã«ã³ã³ãã€ã«ãå®è£ ããããã®ããã€ãã®ã³ã³ãã€ã©ãå«ãŸããŠããŸããHotspotã®250,000è¡ã®ã³ãŒãããŒã¹ã¯ãªãŒãã³ã§ã3ã€ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒããããŸããDevã¯JITã³ã³ãã€ã«ã«å¯Ÿå¿ããŸããäžéšã®ãã³ãããŒã¯ã§ã¯ãC ++ implsïŒãã®å Žå
Hotspotã§äœ¿çšãããæŠç¥ã¯ãåŸç¶ã®JITã³ã³ãã€ã©ãèšèªä»®æ³ãã·ã³ãã¬ãŒã ã¯ãŒã¯ãç¹ã«Javascriptãšã³ãžã³ã®å€ãã®äœæè ã«åœ±é¿ãäžããŸããã Hotspotã¯ãScalaãKotlinãJRubyãJythonãªã©ã®JVMèšèªã®æ³¢ãçã¿åºããŸããã JRubyãšJythonã¯ããœãŒã¹ã³ãŒããJVMãã€ãã³ãŒãã«ã³ã³ãã€ã«ããHotspotãå®è¡ããRubyãšPythonã®æ¥œããå®è£ ã§ãããããã®ãããžã§ã¯ãã¯ãã¹ãŠãPypyã®å Žåã®ããã«ããã¹ãŠã®ããŒã«ãå®è£ ããªããŠããPythonããã³RubyèšèªïŒPythonãããRubyïŒãé«éåããããšã«æ¯èŒçæåããŠããŸãããããã¹ãããã¯ãåçæ§ã®äœãèšèªçšã®JITã§ãããšããç¹ã§ããŠããŒã¯ã§ãïŒãã ããæè¡çã«ã¯Javaã§ã¯ãªãJVMãã€ãã³ãŒãçšã®JITã§ãïŒã

GraalVMã¯ãJavaã³ãŒããåããJavaVMã§ããä»»æã®JVMèšèªïŒJavaãScalaãKotlinãªã©ïŒãå®è¡ã§ããŸãããŸããSubstrateVMãä»ããŠAOTã§ã³ã³ãã€ã«ãããã³ãŒããæäœããããã®NativeImageããµããŒãããŠããŸãã Twitterã®ScalaãµãŒãã¹ã®ããªãã®éšåãGraalã§å®è¡ãããŠããŸããããã¯ãä»®æ³ãã·ã³ã®å質ã«ã€ããŠèªã£ãŠããŸããJavaã§èšè¿°ãããŠããŸãããããæå³ã§ã¯JVMãããåªããŠããŸãã
ãããŠãããã ãã§ã¯ãããŸããïŒ GraalVMã¯TruffleãæäŸããŸãïŒASTïŒæœè±¡æ§æããªãŒïŒã€ã³ã¿ãŒããªã¿ãŒãäœæããããšã«ãã£ãŠèšèªãå®è£ ããããã®ãã¬ãŒã ã¯ãŒã¯ãéåžžã®JVMèšèªã®ããã«JVMãã€ãã³ãŒããçæãããå ŽåãTruffleã«ã¯æç€ºçãªæé ã¯ãããŸãããããããTruffleã¯åã«ã€ã³ã¿ãŒããªã¿ãŒã䜿çšããGraalãšéä¿¡ããŠããããã¡ã€ãªã³ã°ãšããããéšåã¹ã³ã¢ãªã³ã°ã䜿çšããŠãã·ã³ã³ãŒããçŽæ¥çæããŸããéšåçãªè©äŸ¡ã¯ãäžèšã§èšãã°ããã®èšäºã®ç¯å²ãè¶ ããŠããŸãããã®ã¡ãœããã¯ããã€ã³ã¿ãŒããªã¿ãŒãäœæããã³ã³ãã€ã©ãŒãç¡æã§å ¥æããŠãã ããïŒããšããã¡ã¿ãã©ããã³ã°ã®å²åŠã«æºæ ããŠããŸãããã¢ãããŒããç°ãªããŸãã
TruffleJS â Truffle- Javascript, V8 , , V8 , Google , . TruffleJS «» V8 ( JS-) , Graal.
JIT-
C
JITå®è£ ã§ã¯ãCæ¡åŒµæ©èœã®ãµããŒãã«åé¡ãçºçããããšããããããŸãã LuaãPythonãRubyãPHPãªã©ã®æšæºã€ã³ã¿ãŒããªã¿ãŒã«ã¯C APIãããããŠãŒã¶ãŒã¯ãã®èšèªã§ããã±ãŒãžãäœæã§ãããããå®è¡ãå€§å¹ ã«é«éåãããŸããå€ãã®ããã±ãŒãžã¯Cã§èšè¿°ãããŠããŸã
randãããšãã°ãnumpyã®ãããªæšæºã®ã©ã€ãã©ãªé¢æ°ã§ãããããã®Cæ¡åŒµæ©èœã¯ãã¹ãŠãè§£éãããèšèªãé«éã«ããããã«éèŠã§ãã
Cæ¡åŒµæ©èœã¯ãããã€ãã®çç±ã§ä¿å®ãå°é£ã§ããæãæçœãªçç±ã¯ãAPIãå éšå®è£ ã念é ã«çœ®ããŠèšèšãããŠããããšã§ããããã«ãã€ã³ã¿ãŒããªã¿ãŒãCã§èšè¿°ãããŠãããšãCæ¡åŒµæ©èœã®ä¿å®ã容æã«ãªããããJRubyã¯Cæ¡åŒµæ©èœããµããŒãã§ããŸããããJavaæ¡åŒµæ©èœçšã®APIã¯ãããŸãã Pypyã¯æè¿ãCæ¡åŒµæ©èœã®ãµããŒãã®ããŒã¿çããªãªãŒã¹ããŸããããHyrumã®æ³åã®ããã«æ©èœãããã©ããã¯ããããŸããã LuaJITã¯ãCæ¡åŒµæ©èœã®è¿œå æ©èœãå«ãCæ¡åŒµæ©èœããµããŒãããŠããŸãïŒLuaJITã¯çŽ æŽãããã§ãïŒïŒ
Graalã¯ãGraalVMã§LLVMãã€ãã³ãŒããå®è¡ããŠTruffleã«å€æãããšã³ãžã³ã§ããSulongã䜿çšããŠãã®åé¡ã解決ããŸãã LLVMã¯ããŒã«ããã¯ã¹ã§ãããCãLLVMãã€ãã³ãŒãã«ã³ã³ãã€ã«ã§ããããšãç¥ã£ãŠããå¿ èŠããããŸãïŒJuliaã«ã¯LLVMããã¯ãšã³ãããããŸãïŒïŒãå¥åŠãªããšã§ããã解決çã¯ã40幎以äžã®æŽå²ãæã€åªããã³ã³ãã€ã«æžã¿èšèªã䜿çšããŠããããè§£éããããšã§ãããã¡ãããé©åã«ã³ã³ãã€ã«ãããCã»ã©é«éã«ã¯å®è¡ãããŸããããããã€ãã®å©ç¹ããããŸãã

LLVMãã€ãã³ãŒãã¯ãã§ã«éåžžã«äœã¬ãã«ã§ããã€ãŸããCã«é¢ããŠãã®äžé衚çŸã«JITãé©çšããããšã¯éå¹ççã§ã¯ãããŸãããäžéšã®ã³ã¹ãã¯ããã€ãã³ãŒããæ®ãã®Rubyããã°ã©ã ãšäžç·ã«æé©åã§ãããšããäºå®ã«ãã£ãŠè£ãããŸãããã³ã³ãã€ã«ãããCããã°ã©ã ãæé©åããããšã¯ã§ããŸããã ..ããããã®ã¡ã¢ãªã¹ããªãããã€ã³ã©ã€ã³åããããã³ãŒãã¹ããªãããªã©ã¯ãã¹ãŠãRubyã³ãŒãããCãã€ããªãåŒã³åºã代ããã«ãCããã³Rubyã³ãŒãã«é©çšã§ããŸãã TruffleRuby Cæ¡åŒµæ©èœã¯ãããã€ãã®ç¹ã§CRubyCæ¡åŒµæ©èœãããé«éã§ãã
ãã®ã·ã¹ãã ãæ©èœããããã«ã¯ãTruffleãå®å šã«èšèªã«äŸåãããCãJavaããŸãã¯Graalå ã®ä»ã®èšèªãåãæ¿ãããªãŒããŒããããæå°éã«ãªãããšãç¥ã£ãŠããå¿ èŠããããŸãã
GraalãSulongãšé£æºããæ©èœã¯ãèšèªã®é«ãäºææ§ãå¯èœã«ããå€èšèªæ©èœã®äžéšã§ããããã¯ã³ã³ãã€ã©ã«ãšã£ãŠè¯ãã ãã§ãªãã1ã€ã®ãã¢ããªã±ãŒã·ã§ã³ãã§è€æ°ã®èšèªãç°¡åã«äœ¿çšã§ããããšã蚌æããŠããŸãã
è§£éãããã³ãŒãã«æ»ããšãããé«éã§ã
JITã«ã¯ã€ã³ã¿ããªã¿ãšã³ã³ãã€ã©ãå«ãŸããŠãããJITã¯ã€ã³ã¿ããªã¿ããã³ã³ãã€ã©ã«ç§»åããŠåŠçãé«éåããããšãç¥ã£ãŠããŸãã Pypyã¯ãªã¿ãŒã³ãã¹ã®ããªããžãäœæããŸãããGraalãšHotspotã®èгç¹ããã¯ãããã¯æé©åè§£é€ã§ããå®å šã«ç°ãªãæŠå¿µã«ã€ããŠè©±ããŠããããã§ã¯ãããŸããããæé©åè§£é€ãšã¯ãåçèšèªã®å¿ ç¶æ§ã«å¯Ÿãã解決çã§ã¯ãªããæèçãªæé©åãšããŠã€ã³ã¿ãŒããªã¿ãŒã«æ»ãããšãæå³ããŸãã HotspotãšGraalã¯ãæé©åè§£é€ãç¹ã«Graalãå€çšããŸããããã¯ãéçºè ãã³ã³ãã€ã«ãå³å¯ã«å¶åŸ¡ã§ããæé©åã®ããã«ã³ã³ãã€ã«ãããã«å¶åŸ¡ããå¿ èŠãããããã§ãïŒããšãã°ãPypyãšæ¯èŒããŠïŒãæé©åè§£é€ã¯JSãšã³ãžã³ã§ã䜿çšãããŸãããChromeãšNode.jsã®JavaScriptã¯ããã«äŸåããŠãããããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
æé©åè§£é€ããã°ããé©çšããã«ã¯ãã³ã³ãã€ã©ãšã€ã³ã¿ãŒããªã¿ãŒãã§ããã ãæ©ãåãæ¿ããããšãéèŠã§ããæãåçŽãªå®è£ ã§ã¯ãã€ã³ã¿ãŒããªã¿ãŒã¯æé©åè§£é€ãå®è¡ããããã«ã³ã³ãã€ã©ãŒã«ã远ãã€ããå¿ èŠããããŸãã远å ã®è€éãã¯ãéåæã¹ããªãŒã ã®æé©åè§£é€ã«é¢é£ããŠããŸãã Graalã¯ãã¬ãŒã ã®ã»ãããäœæãããããçæãããã³ãŒããšç §åããŠã€ã³ã¿ãŒããªã¿ãŒã«è¿ããŸããã»ãŒããã€ã³ãã䜿çšãããšãJavaã¹ã¬ãããäžæåæ¢ããŠããããã«ã¡ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã忢ããå¿ èŠããããŸããïŒããšèšãããšãã§ããŸããããã«ãããã¹ã¬ããåŠçã«å€ãã®ãªãŒããŒããããå¿ èŠãªããªããŸããããã¯ããªãç²éã§ããããšã倿ããŸããããæé©åè§£é€ãé©åãªæŠç¥ãšãªãã®ã«ååãªéãã§æ©èœããŸãã

Pypyããªããžã³ã°ã®äŸãšåæ§ã«ã颿°ã®ã¢ã³ããŒããããæé©åè§£é€ã§ããŸããé²åŸ¡åŽã倱æãããšãã§ã¯ãªããã²ãªã©ããããé©çšããããšãã«æé©åè§£é€ã³ãŒãã远å ããããããããšã¬ã¬ã³ãã§ãã
JITã®æé©åè§£é€ã®è¯ãäŸïŒå€æãªãŒããŒãããŒã¯éå ¬åŒã®çšèªã§ããç¹å®ã®ã¿ã€ãïŒããšãã°
int32ïŒãå
éšçã«è¡šãã/å²ãåœãŠãããŠããããã«å€æããå¿
èŠãããç¶æ³ã«ã€ããŠè©±ãint64ãŸãã TruffleRubyã¯ãV8ãšåæ§ã«ãæé©åãè§£é€ããŠãããè¡ããŸãã
ããšãã°ãRuby
var = 0ã§è³ªåãããšã次ã®ããã«ãªããŸãint32ïŒRubyã¯ãããFixnumandãšåŒã³BignumãŸããã衚èšã¯int32andã䜿çšããŸãint64ïŒãã§æäœãå®è¡ããvarãå€ã®ãªãŒããŒãããŒãçºçãããã©ããã確èªããå¿
èŠããããŸãããããããã§ãã¯ããããšã¯1ã€ã§ããããªãŒããŒãããŒãåŠçããã³ãŒãã®ã³ã³ãã€ã«ã¯ãç¹ã«æ°å€æŒç®ã®é »åºŠãèãããšãã³ã¹ããããããŸãã
ã³ã³ãã€ã«ãããåœä»€ãèŠãªããŠãããã®æé©åè§£é€ã«ãã£ãŠã³ãŒãã®éãã©ã®ããã«åæžãããããããããŸãã
int a, b;
int sum = a + b;
if (overflowed) {
long bigSum = a + b;
return bigSum;
} else {
return sum;
}
int a, b;
int sum = a + b;
if (overflowed) {
Deoptimize!
}
TruffleRubyã§ã¯ãç¹å®ã®æäœã®æåã®å®è¡ã®ã¿ãæé©åãããŠããªããããæäœããªãŒããŒãããŒãããã³ã«ãªãœãŒã¹ã浪費ããããšã¯ãããŸããã
WETã³ãŒãã¯é«éã³ãŒãã§ããã€ã³ã©ã€ã³åãšOSR
function foo(a, b) {
return a + b;
}
for (var i = 0; i < 1000000; i++) {
foo(i, i + 1);
}
foo(1, 2);
ãããã®ããªã¬ãŒã®ãããªäºçްãªããšã§ãããV8ã§ã¯æé©åãããŠããŸããïŒ
--trace-deoptããã³ãªã©ã®ãªãã·ã§ã³ã䜿çšãããšã--trace-optJITã«é¢ããå€ãã®æ
å ±ãåéããããåäœã倿Žãããã§ããŸãã Graalã«ã¯éåžžã«äŸ¿å©ãªããŒã«ãããã€ããããŸãããå€ãã®äººãã€ã³ã¹ããŒã«ããŠããã®ã§ãV8ã䜿çšããŸãã
æé©åè§£é€ã¯
foo(1, 2)ããã®åŒã³åºããã«ãŒãå
ã§è¡ããããããäžå¯è§£ãªæåŸã®è¡ïŒïŒããéå§ãããŸãã ãé話ã«å¯Ÿããã¿ã€ãã®ãã£ãŒãããã¯ãäžååã§ãããšããã¡ãã»ãŒãžã衚瀺ãããŸãïŒæé©åè§£é€ã®çç±ã®å®å
šãªãªã¹ãã¯ããã«ããããçç±ããªãããšããé¢çœãçç±ããããŸãïŒãããã«ããããªãã©ã«1ãšã衚瀺ããå
¥åãã¬ãŒã ãäœæãããŸã2ã
ã§ã¯ããªãæé©åãè§£é€ããã®ã§ããããã V8ã¯åãã£ã¹ããè¡ãããã®ã¹ããŒãååã§ããïŒããã¯æã«
iã¿ã€ãããããŸãintegerããªãã©ã«ãæž¡ãããŸãintegerã
ãããçè§£ããããã«ãæåŸã®è¡ãã«çœ®ãæããŸããã
foo(i, i +1)ããã ããæé©åè§£é€ã¯åŒãç¶ãé©çšãããŸããä»åã®ã¿ãããã€ããªæäœã®ã¿ã€ããã£ãŒãããã¯ãäžååã§ãããšããã¡ãã»ãŒãžãç°ãªããŸãããªãïŒïŒçµå±ã®ãšãããããã¯ã«ãŒãã§å®è¡ãããæäœãšãŸã£ããåãã§ãããåã倿°ã䜿çšããŸãã
çãã¯ãç§ã®å人ããªã³ã¹ã¿ãã¯çœ®æïŒOSRïŒã«ãããŸããã€ã³ã©ã€ã³åã¯åŒ·åãªã³ã³ãã€ã©æé©åïŒJITã ãã§ãªãïŒã§ããã颿°ã¯é¢æ°ã§ã¯ãªããªããã³ã³ãã³ãã¯åŒã³åºãã®å Žæã«æž¡ãããŸãã JITã³ã³ãã€ã©ã¯ãå®è¡æã«ã³ãŒãã倿Žããããšã§é床ãäžããããã«ã€ã³ã©ã€ã³åã§ããŸãïŒã³ã³ãã€ã«ãããèšèªã¯éçã«ã€ã³ã©ã€ã³åããããšããã§ããŸããïŒã
// partial output from printing inlining details
[compiling method 0x04a0439f3751 <JSFunction (sfi = 0x4a06ab56121)> using TurboFan OSR]
0x04a06ab561e9 <SharedFunctionInfo foo>: IsInlineable? true
Inlining small function(s) at call site #49:JSCall
ãããã£ãŠãV8ã¯ã³ã³ãã€ã«ãã
fooãã€ã³ã©ã€ã³ã«ã§ãããã©ããã倿ããOSRãšã€ã³ã©ã€ã³ã«ãªããŸãããã ããããã¯ããããã¹ã§ãããã€ã³ã©ã€ã³åã®æç¹ã§æåŸã®è¡ããŸã ã€ã³ã¿ãŒããªã¿ãŒã«ãªãããããšã³ãžã³ã¯ã«ãŒãå
ã®ã³ãŒãã«å¯ŸããŠã®ã¿ãããå®è¡ããŸãããããã£ãŠãV8ã¯fooã«ãŒãã§äœ¿çšãããã®ã§ã¯ãªããã€ã³ã©ã€ã³ããŒãžã§ã³ã§äœ¿çšãããããã颿°ã®ã¿ã€ãã«é¢ããååãªãã£ãŒãããã¯ããŸã ãããŸãããé©çšãããå Žå--no-use-osrãæåéããŸãã¯iããæž¡ããŠããæé©åãè§£é€ãããããšã¯ãããŸããããã ããã€ã³ã©ã€ã³åããªããšãããã100äžåã®ç¹°ãè¿ãã§ãå®è¡é床ãèããé
ããªããŸãã JITã³ã³ãã€ã©ã¯ããœãªã¥ãŒã·ã§ã³ãªãããã¬ãŒããªãã®ã¿ã®ååãå®éã«å
·äœåããŠããŸããæé©åè§£é€ã«ã¯è²»çšãããããŸãããã¡ãœããã®æ€çŽ¢ãšã€ã³ã©ã€ã³åã®ã³ã¹ããšã¯æ¯èŒã§ããŸããããã®å Žåã¯ãã®æ¹æ³ãæšå¥šãããŸãã
è£å°ã¯ä¿¡ããããªãã»ã©å¹æçã§ãïŒäžèšã®ã³ãŒããããã€ãã®ãŒãã远å ããŠå®è¡ããŸããããã€ã³ã©ã€ã³åããªãã«ãããšãå®è¡é床ã4åé ããªããŸããã

ãã®èšäºã¯JITã«é¢ãããã®ã§ãããã€ã³ã©ã€ã³åã¯ã³ã³ãã€ã«ãããèšèªã§ã广çã§ãããã¹ãŠã®LLVMèšèªã¯ç©æ¥µçã«ã€ã³ã©ã€ã³åã䜿çšããŸããLLVMããããè¡ãããã§ãããžã¥ãªã¢ã¯LLVMãªãã§ã€ã³ã©ã€ã³åãããŠããŸãããããã¯åœŒå¥³ã®æ¬è³ªã§ããJITã¯ãã©ã³ã¿ã€ã ãã¥ãŒãªã¹ãã£ãã¯ã䜿çšããŠã€ã³ã©ã€ã³åã§ããOSRã䜿çšããŠéã€ã³ã©ã€ã³åã¢ãŒããšã€ã³ã©ã€ã³åã¢ãŒããåãæ¿ããããšãã§ããŸãã
JITãšLLVMã«é¢ããæ³šèš
LLVMã¯ãã³ã³ãã€ã«é¢é£ã®ããŒã«ã倿°æäŸããŸãã Juliaã¯ãRustãSwiftãCrystalãšåæ§ã«ãLLVMã§åäœããŸãïŒããã¯å€§ããªããŒã«ããã¯ã¹ã§ãããèšèªããšã«äœ¿ç𿹿³ãç°ãªãããšã«æ³šæããŠãã ããïŒã LLVMã«ã¯éèŠãªåçJITãçµã¿èŸŒãŸããŠããŸããããããã¯JITããµããŒãããå€§èŠæš¡ã§ãã°ããããããžã§ã¯ãã§ãããšèšãã°ååã§ãã JavaScriptCoreã³ã³ãã€ã«ã®ç¬¬4ã¬ãã«ã§ã¯ããã°ããã®éLLVMããã¯ãšã³ãã䜿çšãããŠããŸãããã2幎以å ã«çœ®ãæããããŸããããã以æ¥ããã®ããŒã«ãããã¯ãäž»ã«åçç°å¢ã§åäœããããã«èšèšãããŠããªããããåçJITã«ã¯ããŸãé©ããŠããŸããã Pypyã¯5ã6å詊ããŸããããJSCã«èœã¡çããŸããã LLVMã§ã¯ãå²ãåœãŠã®ã·ã³ã¯ãšã³ãŒãã®ç§»åãå¶éãããŠããŸãããç¯å²æšè«ã®ãããªåŒ·åãªJITæ©èœã䜿çšããããšãäžå¯èœã§ããïŒãã£ã¹ãã®ãããªãã®ã§ãããå€ã®ç¯å²ãããã£ãŠããŸãïŒãããããããã«éèŠãªã®ã¯ãLLVMã䜿çšãããšãã³ã³ãã€ã«ã«å€ãã®ãªãœãŒã¹ãè²»ããããããšã§ãã
åœä»€ããŒã¹ã®äžé衚çŸã®ä»£ããã«ãããèªäœã倿Žãã倧ããªã°ã©ããããå Žåã¯ã©ããªããŸããïŒ
äžé衚çŸãšããŠãLLVMãã€ãã³ãŒããšPython / Ruby / Javaãã€ãã³ãŒãã«ã€ããŠèª¬æããŸããããããã¯ãã¹ãŠãæç€ºã®åœ¢ã§ããçš®ã®èšèªã®ããã«èŠããŸããHotspotãGraalãããã³V8ã¯ãäœã¬ãã«ã®ASTã§ãããSeaof Nodesãäžé衚çŸïŒHotspotã§å°å ¥ïŒã䜿çšããŸãããããã¡ã€ãªã³ã°ã®éèŠãªéšåã¯ããã£ãã«äœ¿çšãããªãïŒãŸãã¯ããããã¿ãŒã³ã®å Žåã¯éè€ããïŒç¹å®ã®ãã¹ã®æŠå¿µã«åºã¥ããŠãããããããã¯å¹æçãªãã¥ãŒã§ãããããã®ASTã³ã³ãã€ã©ã¯ASTããŒãµãŒãšã¯ç°ãªãããšã«æ³šæããŠãã ããã
æ®æ®µã¯ãå®¶ã§ãã£ãŠã¿ããïŒããšããç«å Žã貫ããŠããŸãããã°ã©ããèããã®ã¯ãšãŠãé¢çœããã³ã³ãã€ã©ã®ä»äºãçè§£ããã®ã«éåžžã«åœ¹ç«ã€ããšãå€ãã®ã§ãããããªãé£ããã§ããããšãã°ãç¥èãäžè¶³ããŠããã ãã§ãªããè³ã®èšç®èœåã®ããã«ããã¹ãŠã®ã°ã©ããèªã¿åãããšã¯ã§ããŸããïŒã³ã³ãã€ã©ãªãã·ã§ã³ã¯ãèå³ã®ãªãåäœãåãé€ãã®ã«åœ¹ç«ã¡ãŸãïŒã

V8ã®å Žåããã©ã°ä»ãã®D8ããŒã«ã䜿çšããŸã
--print-astãGraalã®å Žåã¯ã«ãªããŸã--vm.Dgraal.Dump=Truffle:2ãããã¹ããç»é¢ã«è¡šç€ºãããŸãïŒã°ã©ããååŸããããã«ãã©ãŒããããããŸãïŒãV8éçºè
ãããžã¥ã¢ã«ã°ã©ããçæããæ¹æ³ã¯ããããŸããããOracleã«ã¯ãåã®å³ã§äœ¿çšãããŠãããçæ³çãªã°ã©ãããžã¥ã¢ã©ã€ã¶ãŒãããããŸããIGVãåã€ã³ã¹ããŒã«ããåããªãã£ãã®ã§ããœãŒã¹ãéããããSeafoamã§çæãããChrisSeatonããã°ã©ããååŸããŸããã
ã§ã¯ãJavaScriptASTãèŠãŠã¿ãŸãããã
function accumulate(n, a) {
var x = 0;
for (var i = 0; i < n; i++) {
x += a;
}
return x;
}
accumulate(1, 1)
d8 --print-ast test.js颿°ã«ã®ã¿é¢å¿ããããŸããã
ãã®ã³ãŒããå®è¡ããŸããaccumulateãäžåºŠã ãåŒã³åºãããã€ãŸããASTãååŸããããã«ã³ã³ãã€ã«ãåŸ
ã€å¿
èŠããªãããšã確èªããŠãã ããã
ASTã¯æ¬¡ã®ããã«ãªããŸãïŒéèŠã§ãªãè¡ãããã€ãåé€ããŸããïŒã
FUNC at 19
. NAME "accumulate"
. PARAMS
. . VAR (0x7ff5358156f0) (mode = VAR, assigned = false) "n"
. . VAR (0x7ff535815798) (mode = VAR, assigned = false) "a"
. DECLS
. . VARIABLE (0x7ff5358156f0) (mode = VAR, assigned = false) "n"
. . VARIABLE (0x7ff535815798) (mode = VAR, assigned = false) "a"
. . VARIABLE (0x7ff535815840) (mode = VAR, assigned = true) "x"
. . VARIABLE (0x7ff535815930) (mode = VAR, assigned = true) "i"
. BLOCK NOCOMPLETIONS at -1
. . EXPRESSION STATEMENT at 38
. . . INIT at 38
. . . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) "x"
. . . . LITERAL 0
. FOR at 43
. . INIT at -1
. . . BLOCK NOCOMPLETIONS at -1
. . . . EXPRESSION STATEMENT at 56
. . . . . INIT at 56
. . . . . . VAR PROXY local[1] (0x7ff535815930) (mode = VAR, assigned = true) "i"
. . . . . . LITERAL 0
. . COND at 61
. . . LT at 61
. . . . VAR PROXY local[1] (0x7ff535815930) (mode = VAR, assigned = true) "i"
. . . . VAR PROXY parameter[0] (0x7ff5358156f0) (mode = VAR, assigned = false) "n"
. . BODY at -1
. . . BLOCK at -1
. . . . EXPRESSION STATEMENT at 77
. . . . . ASSIGN_ADD at 79
. . . . . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) "x"
. . . . . . VAR PROXY parameter[1] (0x7ff535815798) (mode = VAR, assigned = false) "a"
. . NEXT at 67
. . . EXPRESSION STATEMENT at 67
. . . . POST INC at 67
. . . . . VAR PROXY local[1] (0x7ff535815930) (mode = VAR, assigned = true) "i"
. RETURN at 91
. . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) "x"
ãããè§£æããããšã¯å°é£ã§ãããããŒãµãŒã®ASTã«äŒŒãŠããŸãïŒãã¹ãŠã®ããã°ã©ã ã«åœãŠã¯ãŸãããã§ã¯ãããŸããïŒããããŠã次ã®ASTã¯Acorn.jsã䜿çšããŠçæãããŸãã
é¡èãªéãã¯ã倿°ã®å®çŸ©ã§ããããŒãµãŒã®ASTã«ã¯ããã©ã¡ãŒã¿ãŒã®æç€ºçãªå®çŸ©ã¯ãªããã«ãŒã宣èšã¯ããŒãã«é ãããŠããŸã
ForStatementãã³ã³ãã€ã©ã¬ãã«ã®ASTã§ã¯ããã¹ãŠã®å®£èšãã¢ãã¬ã¹ãšã¡ã¿ããŒã¿ã§ã°ã«ãŒãåãããŸãã
ã³ã³ãã€ã©ASTããã®ã°ãããåŒã䜿çšããŸã
VAR PROXYãããŒãµãŒã®ASTã¯ã倿°ã®å·»ãäžãïŒå·»ãäžãïŒãè©äŸ¡ïŒè©äŸ¡ïŒãªã©ã®ããã«ãååãšå€æ°ïŒã¢ãã¬ã¹ã«ããïŒã®é¢ä¿ãå€å¥ã§ããŸããããããã£ãŠãã³ã³ãã€ã©ã®ASTã¯PROXYãåŸã§å®éã®å€æ°ã«é¢é£ä»ãããã倿°ã䜿çšããŸãã
// This chunk is the declarations and the assignment of `x = 0`
. DECLS
. . VARIABLE (0x7ff5358156f0) (mode = VAR, assigned = false) "n"
. . VARIABLE (0x7ff535815798) (mode = VAR, assigned = false) "a"
. . VARIABLE (0x7ff535815840) (mode = VAR, assigned = true) "x"
. . VARIABLE (0x7ff535815930) (mode = VAR, assigned = true) "i"
. BLOCK NOCOMPLETIONS at -1
. . EXPRESSION STATEMENT at 38
. . . INIT at 38
. . . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) "x"
. . . . LITERAL 0
ãããŠãããã¯ãGraalã䜿çšããŠååŸãããåãããã°ã©ã ã®ASTãã©ã®ããã«èŠãããã§ãïŒ

èŠãç®ã¯ãã£ãšã·ã³ãã«ã§ããèµ€ã¯å¶åŸ¡ãããŒã瀺ããéã¯ããŒã¿ãããŒã瀺ããç¢å°ã¯æ¹åã瀺ããŸãããã®ã°ã©ãã¯V8ã®ASTãããåçŽã§ãããããã¯Graalãããã°ã©ã ã®åçŽåã«åªããŠããããšãæå³ãããã®ã§ã¯ãªãããšã«æ³šæããŠãã ãããããã¯ãåçæ§ãã¯ããã«äœãJavaã«åºã¥ããŠçæãããã ãã§ãã RubyããçæãããåãGraalã°ã©ãã¯ãæåã®ããŒãžã§ã³ã«è¿ããªããŸãã
Graalã®ASTãã³ãŒãã®å®è¡ã«å¿ããŠå€ããã®ã¯ããããã§ãããã®ã°ã©ãã¯ã颿°ãæé©åãããªãããã«ã©ã³ãã ãªãã©ã¡ãŒã¿ãŒã䜿çšããŠç¹°ãè¿ãåŒã³åºãããå Žåã«ãOSRãç¡å¹ã«ããŠã€ã³ã©ã€ã³åããŠçæãããŸãããããŠããã³ãã¯ããªãã«ããããã®ã°ã©ããæäŸããŸãïŒ Graalã¯ç¹æ®ãªASTã䜿çšããŠããã°ã©ã ãæé©åããŸãïŒV8ã¯åæ§ã®æé©åãè¡ããŸãããASTã¬ãã«ã§ã¯è¡ããŸããïŒãã°ã©ããGraalã«ä¿åãããšãæé©åã®ã¬ãã«ãç°ãªã10ãè¶ ããã¹ããŒã ãåŸãããŸããããŒããæžãæãããšãããããã¯èªåèªèº«ãä»ã®ããŒãã«çœ®ãæããŸãïŒå°éåããŸãïŒã
äžã®ã°ã©ãã¯ãåçã«åæå®ãããèšèªã«ç¹åããåªããäŸã§ãïŒOneVMããRuleThem Allã2013å¹Žã«æ®åœ±ãããåçïŒããã®ããã»ã¹ãååšããçç±ã¯ãéšåçãªè©äŸ¡ãã©ã®ããã«æ©èœãããã«å¯æ¥ã«é¢é£ããŠããŸã-ããã¯ãã¹ãŠå°éåã«é¢ãããã®ã§ãã
Hooray JITãã³ãŒããã³ã³ãã€ã«ããŸããïŒããäžåºŠã³ã³ãã€ã«ããŸãããïŒãããŠãŸãïŒ
äžèšã§ããã«ãã¬ãã«ãã«ã€ããŠã話ããŸããããããã«ã€ããŠã話ããŸããããèãæ¹ã¯åçŽã§ããå®å šã«æé©åãããã³ãŒããäœæããæºåããŸã ã§ããŠããªããŠããè§£éã«ã³ã¹ãããããå Žåã¯ãããæé©åãããã³ãŒããçæããæºåãã§ããããããªã³ã³ãã€ã«ããŠããæçµã³ã³ãã€ã«ã§ããŸãã
Hotspotã¯ãC1ãšC2ã®2ã€ã®ã³ã³ãã€ã©ãåããéå±€åJITã§ãã C1ã¯ã¯ã€ãã¯ã³ã³ãã€ã«ãå®è¡ããŠã³ãŒããå®è¡ããæ¬¡ã«å®å šãªãããã¡ã€ãªã³ã°ãå®è¡ããŠã³ãŒããC2ã§ã³ã³ãã€ã«ããŸããããã¯ãå€ãã®ãŠã©ãŒã ã¢ããã®åé¡ã解決ããã®ã«åœ¹ç«ã¡ãŸããæé©åãããŠããªãã³ã³ãã€ã«æžã¿ã³ãŒãã¯ããšã«ããè§£éãããé«éã§ãããŸããC1ãšC2ã¯ãã¹ãŠã®ã³ãŒããã³ã³ãã€ã«ããããã§ã¯ãããŸããã颿°ãååã«åçŽã«èŠããå Žåãé«ã確çã§C2ã¯åœ¹ã«ç«ãããå®è¡ããã§ããŸããïŒãããã¡ã€ãªã³ã°ã®æéãç¯çŽã§ããŸãïŒïŒã C1ãã³ã³ãã€ã«ã§ããžãŒç¶æ ã®å Žåããããã¡ã€ãªã³ã°ãç¶è¡ã§ããC1ã®äœæ¥ã¯äžæãããC2ã§ã®ã³ã³ãã€ã«ãéå§ãããŸãã

JavaScript Coreã«ã¯ããã«å€ãã®ã¬ãã«ããããŸãïŒå®éã3ã€ã®JITããããŸãã JSCã€ã³ã¿ãŒããªã¿ãŒã¯ãããã€ãã®ã©ã€ããããã¡ã€ãªã³ã°ãå®è¡ããŠãããããŒã¹ã©ã€ã³JITãDFGïŒããŒã¿ãããŒã°ã©ãïŒJITãæåŸã«FTLïŒFaster than LightïŒJITã«ç§»åããŸããéåžžã«å€ãã®ã¬ãã«ããããããæé©åè§£é€ã®æå³ã¯ã³ã³ãã€ã©ããã€ã³ã¿ãŒããªã¿ãŒãžã®ç§»è¡ã«éå®ãããªããªããDFGã§å§ãŸãããŒã¹ã©ã€ã³JITã§çµããæé©åè§£é€ãå®è¡ã§ããŸãïŒããã¯ãããã¹ãããC2-> C1ã®å Žåã«ã¯åœãŠã¯ãŸããŸããïŒããã¹ãŠã®æé©åè§£é€ã𿬡ã®ã¬ãã«ãžã®ç§»è¡ã¯ãOSRïŒStack OverrideïŒã䜿çšããŠå®è¡ãããŸãã
ããŒã¹ã©ã€ã³JITã¯çŽ100åã®å®è¡åŸã«æ¥ç¶ããDFG JITã¯çŽ1000åã®å®è¡åŸã«æ¥ç¶ããŸãïŒäžéšã®äŸå€ãé€ãïŒãããã¯ãJITãã³ã³ãã€ã«ãããã³ãŒããåãPypyïŒçŽ3000åã®å®è¡ãå¿ èŠïŒãããã¯ããã«é«éã«ååŸããããšãæå³ããŸããéå±€åã«ãããJITã¯ã³ãŒãå®è¡ã®æéãæé©åã®æéãšçžé¢ãããããšããããšãã§ããŸããåã¬ãã«ã§ã©ã®ãããªæé©åïŒã€ã³ã©ã€ã³åããã£ã¹ããªã©ïŒãå®è¡ãããã«ã€ããŠã¯ãããŸããŸãªããªãã¯ãããããããã®æŠç¥ãæé©ã§ãã
圹ç«ã€æ å ±æº
- LuaJITã®ãã¬ãŒã¹ã³ã³ãã€ã©ãMikePallããã©ã®ããã«æ©èœããã
- LaurieTrattã«ããVMãžã®ã¡ã¿ãã¬ãŒã¹ã®åœ±é¿
- Pypy Escape Analysis
- LaurieTrattã«ããVMã«ãŠãŒã¶ãŒãæºè¶³ããªãçç±
- JSãšã³ãžã³ã«ã€ããŠïŒ
- æé©åè§£é€ã«ã€ããŠïŒ
- Graal:
- :
- :