ãã®èšäºã®ãã¹ãŠã®ãœãŒã¹ã³ãŒããšäŸã¯ããã¡ãããå
¥æã§ããŸã ãPyPyãããžã§ã¯ããåããŠèŠããšãããããäœã§ããããçè§£ããã®ã«æéãããããŸããã æ¬¡ã®2ã€ã®èŠçŽ ã§æ§æãããŸãã
-ããã°ã©ãã³ã°èšèªã®ã€ã³ã¿ãŒããªã¿ãŒãäœæããããã®ããŒã«ã®ã»ããã
-ãã®ããŒã«ãããã䜿çšããPythonå®è£
ã
ã»ãšãã©ã®äººã¯ããããPyPyã¯ç¬¬2éšã«éããªããšèããŠããŸããããã®ã¬ã€ãã¯Pythonã€ã³ã¿ãŒããªã¿ãŒã«é¢ãããã®ã§ã¯ãããŸããã ããã¯ããªãã®èšèªã®éèš³ãæžãæ¹æ³ã«ã€ããŠã§ãã
ãã®ã¬ã€ãã¯ãPyPyãã©ã®ããã«æ©èœããã©ã®ãããªãã®ã§ããããããããçè§£ããããã®ãã®ã§ãã ããªãã¯PyPyã«ã€ããŠã»ãšãã©ç¥ããªããšæ³å®ããŠããã®ã§ãæåããå§ããŸãã
PyPyãšã¯äœã§ããïŒ
ã€ã³ã¿ããªã¿ãæžããããšããŸãã ããã«ã¯ããœãŒã¹ã³ãŒãããŒãµãŒããã€ãã³ãŒãå®è¡ã«ãŒããããã³æšæºã©ã€ãã©ãªå
ã®å€ãã®ã³ãŒãã®èšè¿°ãå«ãŸããŸãã
ããŒãµãŒãšã³ã³ãã€ã©ãŒã®äœæã¯ãéåžžã¯ãŸã£ããé¢çœããªããããããŒãµãŒãšã³ã³ãã€ã©ãŒãçæããããŒã«ããããŸãã
ãããŠãããã§ãããªãã¯ã€ã³ã¿ããªã¿ã®ã¡ã¢ãªç®¡çã«æ³šæãæããªããã°ãªãããä»»æã®æ¬¡å
ã®æŽæ°ãããã·ã¥ããŒãã«ãªã©ã®ãããªããŒã¿åãå®è£
ããªããã°ãªããŸããã ããã¯ãå€ãã®äººãç¬èªã®ã€ã³ã¿ããªã¿ã®å®è£
ã«ã€ããŠèããå€ããã®ã«ååã§ãã
ããšãã°ãPythonã®ãããªé«ã¬ãã«èšèªã§èšèªãå®è£
ã§ãããçŽ æŽããããšæããŸãããïŒ èªåã¡ã¢ãªç®¡çãè±å¯ãªããŒã¿åã»ãããªã©ãé«çŽèšèªã®ãã¹ãŠã®å©ç¹ãèªç±ã«æŽ»çšã§ããŸãã ããããããèšèªãå¥ã®ã€ã³ã¿ããªã¿èšèªã§è§£éããã®ã¯éåžžã«é
ãã¯ãã§ãããïŒ
ãæ³åã®ãšãããPyPyã¯ãã®åé¡ã解決ããŸãã PyPyã¯ãCïŒãŸãã¯JVMãŸãã¯CLIïŒã§ã€ã³ã¿ãŒããªã¿ãŒã³ãŒããåæããã³ç¿»èš³ããããã®æŽç·ŽãããããŒã«ãããã§ãã ãã®ããã»ã¹ã¯ã翻蚳ããšåŒã°ããŸãã 圌ã¯ãPythonã®æ§æã®ãã¹ãŠã§ã¯ãªãããã®å€§éšåã翻蚳ããæ¹æ³ãç¥ã£ãŠããŸãã å¿
èŠãªããšã¯ãPythonèšèªã®ãµãã»ããã§
ããRPythonã§ã€ã³ã¿ãŒããªã¿ãŒãäœæããããšã ãã§ãããã®åŸãéåžžã«å¹ççãªã€ã³ã¿ãŒããªã¿ãŒãåŸãããŸãã
广çãªéèš³ãæžãããšã¯åé¡ã§ã¯ãªãããã§ãã
èšèª
å®è£
ããããšãéžæããèšèªã¯éåžžã«åçŽã§ãã èšèªãã¬ãŒã ã¯ããŒãã«åæåãããæŽæ°ã®ããŒããšããã®ããŒãã®çŸåšã®ã»ã«ãžã®1ã€ã®ãã€ã³ã¿ãŒã§æ§æãããŸãã èšèªã«ã¯8ã€ã®ã³ãã³ããããããŸããã
< -ãã€ã³ã¿ãåã®ã»ã«ã«ç§»åããŸãã
> -ãã€ã³ã¿ã次ã®ã»ã«ã«ç§»åããŸãã
+ -çŸåšã®ã»ã«ã§æ°å€ã1ã€å¢ãããŸãã
--çŸåšã®ã»ã«ã§1ã€ã®æ°å€ã ãæžå°ããŸãã
[ -çŸåšã®ã»ã«ã®æ°ã0ã®å Žåã察å¿ããåœä»€ãŸã§ãã¹ãŠã®åœä»€ãã¹ãããããŸã]ã
] -察å¿ããåœä»€[ãã«æ»ããŸãã
ã -çŸåšã®ã»ã«ãã1ãã€ããæšæºåºåã¹ããªãŒã ã«åºåããŸãã
ã -æšæºå
¥åã¹ããªãŒã ãã1ãã€ããèªã¿åããçŸåšã®ã»ã«ã«å
¥ããŸãã
èªèãããªãæåã¯ç¡èŠããŠãã ããã
ãã®èšèªãåŠã¹ã人ãããŸãããããã¯é è³ã§ãã
èšèªèªäœã¯ãã§ã«ãã€ãã³ãŒãã§ããããããœãŒã¹ã³ãŒãããã€ãã³ãŒãã«åå¥ã«å€æããå¿
èŠã¯ãããŸããã ããã¯ãã€ã³ã¿ãŒããªã¿ãŒã®ã¡ã€ã³å®è¡ã«ãŒãããœãŒã¹ã³ãŒãã§çŽæ¥åäœããããšãæå³ããŸãã ããã«ãããå®è£
ãå°ãç°¡çŽ åãããŸãã
æåã®ã¹ããã
éåžžã®Pythonã§ã€ã³ã¿ãŒããªã¿ãŒãäœæããããšããå§ããŸãããã ã¡ã€ã³ã®å®è¡ã«ãŒãã®ã¹ã±ãããæ¬¡ã«ç€ºããŸãã
def mainloop(program): tape = Tape() pc = 0 while pc < len(program): code = program[pc] if code == ">": tape.advance() elif code == "<": tape.devance() elif code == "+": tape.inc() elif code == "-": tape.dec() elif code == ".": sys.stdout.write(chr(tape.get())) elif code == ",": tape.set(ord(sys.stdin.read(1))) elif code == "[" and value() == 0:
ã芧ã®ãšãããåœä»€ã«ãŠã³ã¿ãŒïŒpcïŒã«ã¯çŸåšã®åœä»€ãžã®ãã€ã³ã¿ãŒãæ ŒçŽãããŠããŸãã ã«ãŒãã®æåã®åŒãåœä»€ãååŸãããã®åŸãããã€ãã®æ¡ä»¶ã¹ããŒãã¡ã³ãããã®å®è¡æ¹æ³ã決å®ããŸãã
ã[ãããã³ã]ãæŒç®åã®å®è£
ã¯çç¥ãããŠãããåœä»€ã«ãŠã³ã¿ãŒãäžèŽããæ¬åŒ§ã®äœçœ®ã«å€æŽããå¿
èŠããããŸãã
ãããŠä»ãæŽæ°ã®ããŒããšçŸåšã®çªå·ãžã®ãã€ã³ã¿ãæ ŒçŽããTapeã¯ã©ã¹ã®å®è£
ã§ãã
class Tape(object): def __init__(self): self.thetape = [0] self.position = 0 def get(self): return self.thetape[self.position] def set(self, val): self.thetape[self.position] = val def inc(self): self.thetape[self.position] += 1 def dec(self): self.thetape[self.position] -= 1 def advance(self): self.position += 1 if len(self.thetape) <= self.position: self.thetape.append(0) def devance(self): self.position -= 1
ã芧ã®ãšãããå¿
èŠã«å¿ããŠããŒããå¢å ããŸãã å®éããã€ã³ã¿ãŒãè² ã«ãªã£ããšãã«ãšã©ãŒãã§ãã¯ã远å ãã䟡å€ããããŸãã ãããããããŸã§ã®ãšããåé¡ã§ã¯ãããŸããã
ããã°ã©ã ã«å€ãã®ã³ã¡ã³ããããå Žåããããã¯1ãã€ãã§èªã¿åããããããäºåã«ãœãŒã¹ã³ãŒããè§£æããããšããå§ãããŸãã åæã«ãæ¬åŒ§ã®èŸæžãäœæããŠããã¢æ¬åŒ§ãèŠã€ããããšãã§ããŸãã
def parse(program): parsed = [] bracket_map = {} leftstack = [] pc = 0 for char in program: if char in ('[', ']', '<', '>', '+', '-', ',', '.'): parsed.append(char) if char == '[': leftstack.append(pc) elif char == ']': left = leftstack.pop() right = pc bracket_map[left] = right bracket_map[right] = left pc += 1 return "".join(parsed), bracket_map
ãã®é¢æ°ã¯ãèšèªã³ãã³ããšãã¢æ¬åŒ§ã®èŸæžããã®ã¿æååãè¿ããŸãã
ãããçµåããããšã¯æ®ã£ãŠãããå®çšçãªãã¬ã€ã³ãã¡ãã¯ã€ã³ã¿ãŒããªã¿ãŒãååŸããŸãã
def run(input): program, map = parse(input.read()) mainloop(program, map) if __name__ == "__main__": import sys run(open(sys.argv[1], 'r'))
è§æ¬åŒ§ã®å®è£
ãå«ãã€ã³ã¿ããªã¿ã®å®å
šãªã³ãŒãã¯ãæåã®äŸã§èŠãããšãã§ããŸãã
example1.pyããã§ãã€ã³ã¿ããªã¿ãPythonã§å®è¡ããŠãåäœããããšã確èªã§ããŸãã
$ python example1.py 99bottles.b
PyPyãããŒããã£ã¹ã
ããããç§ãã¡ã®ç®æšã¯ããã¬ãŒã³ãã¡ãã¯ã€ã³ã¿ãŒããªã¿ãŒãæžãããšã ãã§ã¯ãããŸããã PyPyããã®ã³ãŒãããè¶
é«éã®å®è¡å¯èœãã¡ã€ã«ãäœæããã«ã¯ãäœãããå¿
èŠããããŸããïŒ
PyPyãœãŒã¹ã®pypy / translator / goalãã©ã«ããŒã«ã¯ã䟿å©ãªç°¡åãªäŸããããŸãã å§ããã«ã¯ãtargetnopstandalone.pyãã芧ãã ãã-PyPyã®ã·ã³ãã«ãªãããŒã¯ãŒã«ãã§ãã
éèŠãªããšã¯ãã¢ãžã¥ãŒã«ã«ãšã³ããªãã€ã³ããè¿ãã¿ãŒã²ãã颿°ãå«ãŸããŠããããšã§ãã ãã®æç¹ããæŸéãå§ãŸããŸãã
def run(fp): program_contents = "" while True: read = os.read(fp, 4096) if len(read) == 0: break program_contents += read os.close(fp) program, bm = parse(program_contents) mainloop(program, bm) def entry_point(argv): try: filename = argv[1] except IndexError: print "You must supply a filename" return 1 run(os.open(filename, os.O_RDONLY, 0777)) return 0 def target(*args): return entry_point, None if __name__ == "__main__": entry_point(sys.argv)
entry_point颿°ã¯ãçµæã®å®è¡å¯èœãã¡ã€ã«ãå®è¡ãããšãã«ã³ãã³ãã©ã€ã³åŒæ°ãåãå
¥ããŸãã
RPython
RPythonã«ã€ããŠè©±ããŸãããã Pythonã¯åçããããããPyPyã¯éåžžã®Pythonã³ãŒãã翻蚳ã§ããŸããã PyPyã倿ã§ããããã«ãæšæºã©ã€ãã©ãªãšPythonæ§æã«é©çšãããããã€ãã®å¶éããããŸãã ãããããã¹ãŠãªã¹ãããã®ã§ã¯ãªã
ãããã¥ã¡ã³ãã§ç¢ºèªããæ¹ãè¯ãã§ãããã
äžèšã®äŸã§ã¯ãããã€ãã®ããšã倿Žããå¿
èŠããããŸããã ããã§ããã¡ã€ã«ãªããžã§ã¯ãã䜿çšãã代ããã«ãos.openããã³os.read颿°ã§äœã¬ãã«ã®èšè¿°åã䜿çšããå¿
èŠããããŸãã ãããããã³ãããã®å®è£
ããããã«å€æŽãããŠããŸãã ãããã¯ãã¹ãŠãPyPyãã³ãŒããæ¶åããããã«å¿
èŠãªå€æŽã§ãã
ããã»ã©è€éã§ã¯ãªãã£ãã§ãããïŒ èŸæžãæ¡åŒµå¯èœãªãªã¹ããããã«ãªããžã§ã¯ããå«ãã¯ã©ã¹ã§ãã䜿çšãç¶ããŸãã ãŸãããã¡ã€ã«èšè¿°åãäœãããå Žåã¯ãrlib.streamioã¢ãžã¥ãŒã«ã«ããã€ãã®äŸ¿å©ãªæœè±¡åããããŸããããã¯æšæºã®RPythonã©ã€ãã©ãªã«ä»å±ããŠããŸãã
å®å
šãªã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãïŒ
example2.pyæŸé
ãŸã è¡ã£ãŠããªãå Žåã¯ãbitbucket.orgã®ãªããžããªããææ°ããŒãžã§ã³ã®PyPyãããŒãžããŸãã
$ hg clone
bitbucket.org/pypy/pypyå®è¡ããã¹ã¯ãªããã¯pypy / translator / goal / translate.pyã§ãã ãã©ã¡ãŒã¿ãšããŠã翻蚳ãå¿
èŠãªã¢ãžã¥ãŒã«ãå¿
èŠã§ãã
$ python ./pypy/pypy/translator/goal/translate.py example2.py
翻蚳ãé«éåããã«ã¯ãPythonã®ä»£ããã«PyPyã䜿çšã§ããŸãã
å®è¡ã®çµæã¯ãå®è¡å¯èœãã¡ã€ã«-Brainfuckã€ã³ã¿ãŒããªã¿ãŒã«ãªããŸãã ãªããžããªã«ã¯Brainfuckã®ãã©ã¯ã¿ã«ãžã§ãã¬ãŒã¿ãå«ãŸããŠãããç§ã®ãã·ã³ã§å®äºããã«ã¯çŽ45ç§ããããŸãã èªåã§è©ŠããŠã¿ãŠãã ããã
$ ./example2-c mandel.b
ãããŠãPythonã§å®è¡ãããŠããåãã€ã³ã¿ãŒããªã¿ãŒãçæããé床ãšéåºŠãæ¯èŒããŸãã
$ python example2.py mandel.b
ããã§ãRPythonã§ã€ã³ã¿ãŒããªã¿ãŒãäœæããPyPyããŒã«ãããã䜿çšããŠç¿»èš³ããŸããã
JITã远å
Cã§ã®RPythonã®ç¿»èš³ã¯ã¯ãŒã«ã§ãããPyPyã®äž»ãªæ©èœã®1ã€ã¯ãã©ã³ã¿ã€ã ã³ã³ãã€ã©ïŒJITïŒãçæããæ©èœã§ãã ã€ã³ã¿ãŒããªã¿ãŒã®åäœã«é¢ããããã€ãã®ãã³ãã䜿çšããŠãPyPyã¯ãè§£éãããBrainfuckã³ãŒãããã·ã³ã³ãŒãã«å€æããJITã³ã³ãã€ã©ãŒãçæããŸãã
ãããèµ·ããããã«ã¯ãPyPyã¯ããã°ã©ã å®è¡ãµã€ã¯ã«ãã©ãããå§ãŸãã®ããç¥ãå¿
èŠããããŸãã ããã«ãããbrainfuckã§å®è¡ãããåœä»€ã远跡ã§ããŸãã
å®è¡ãµã€ã¯ã«ã®æ©èœã瀺ãå¿
èŠããããŸãã ç§ãã¡ã®èšèªã«ã¯ã¹ã¿ãã¯ããªãã®ã§ãããã°ã©ã 倿°ãšãã®ããŒã¿ã«é¢é£ãã倿°ã瀺ãã ãã§ãã ããã¯ãããããç·ãšèµ€ã®å€æ°ãšåŒã°ããŸãã
2çªç®ã®äŸã«æ»ããŸãã
ã¡ã€ã³ã®å®è¡ã«ãŒãã§ã¯ãpcãprogramãbracket_mapãtapeã®4ã€ã®å€æ°ã䜿çšãããŸãã ãã¡ãããpcãprogramãbracket_mapã¯ç·ã®å€æ°ã§ãããè§£éãããããã°ã©ã ã®å®è¡ã決å®ããŸãã å¯å€ããŒãã¯èµ€ã§ãè§£éãããããã°ã©ã ãå®è¡ããããšå€åããŸãã
PyPyã«ãã®ããŒã¿ãäŒããŸãããã JitDriverã¯ã©ã¹ãã€ã³ããŒãããŠã€ã³ã¹ã¿ã³ã¹åããããšããå§ããŸãããã
from pypy.rlib.jit import JitDriver jitdriver = JitDriver(greens=['pc', 'program', 'bracket_map'], reds=['tape'])
ãããŠãå®è¡ã«ãŒãã®æåã«æ¬¡ã®è¡ã远å ããŸãã
fjitdriver.jit_merge_point(pc=pc, tape=tape, program=program, bracket_map=bracket_map)
ãŸããJitPolicyãå®çŸ©ããå¿
èŠããããŸãã
def jitpolicy(driver): from pypy.jit.codewriter.policy import JitPolicy return JitPolicy()
å®å
šãªãµã³ãã«ããã¹ãïŒ
example3.pyã³ãŒããååºŠå€æããŸããããã©ã°--opt = jitã䜿çšããŸãã
$ python ./pypy/pypy/translator/goal/translate.py --opt = jit example3.py
ãããŒããã£ã¹ãã¯ã¯ããã«é·ããç§ã®ãã·ã³ã§ã¯ã»ãŒ8åã§å®è¡ãããçµæã®å®è¡å¯èœãã¡ã€ã«ã¯ã¯ããã«å€§ãããªããŸãã æŸéçµäºåŸããã©ã¯ã¿ã«çæããã°ã©ã ãåã³éå§ããŸãã éãã¯éåžžã«å€§ãããåããŒãžã§ã³ã®45ã«å¯ŸããŠçŽ12ç§ã§ãïŒ
ã芧ã®ãšãããJITã³ã³ãã€ã©ãŒã¯è§£éãã代ããã«ãã·ã³ã³ãŒããå®éã«äœ¿çšããŸããã ç»åã®æåã®æ°è¡ã¯ååã«éã衚瀺ããããã®åŸããã°ã©ã ã¯å éãããæ®ãã¯ããã«éã衚瀺ãããŸãã
ãã¬ãŒãµãŒJITã³ã³ãã€ã©ãŒã«ã€ããŠå°ã
JITã³ã³ãã€ã©ã®ãã¬ãŒã¹ãäžè¬çã«ã©ã®ããã«æ©èœãããã«ã€ããŠè©±ã䟡å€ã¯ãããŸãã è§£éã³ãŒãã¯æ£åžžã«å®è¡ãããŸãã JITãã€ã³ã¿ãŒããªã¿ãŒèšèªã§é »ç¹ã«å®è¡ãããã«ãŒãïŒbrainfuckïŒã«ééãããšãã«ãŒãã«ãã¬ãŒã¹ã®ãã©ã°ãç«ãŠãããŸãã æ¬¡ååããµã€ã¯ã«ã«éãããšãå®è¡ãããååœä»€ã®ãã®ã³ã°ããªã³ã«ãªããŸãã
çµæã®ãã°ã¯ãªããã£ãã€ã¶ãŒã«éä¿¡ããããã®çµæã¯ãã·ã³ã³ãŒãã«å€æãããŸãã ãã®ã³ãŒãã¯ãã«ãŒãã®åŸç¶ã®å®è¡ã«äœ¿çšãããŸãã
çµæã®ãã·ã³ã³ãŒãã¯ãåä¿¡ãããç¹å®ã®æ¡ä»¶äžã§ã®ã¿æ£ããã§ãã ãããã£ãŠã䜿çšããåã«ããããã®æ¡ä»¶ããã§ãã¯ãããŸãã ãã·ã³ã³ãŒãã®ä»£ããã«ãã¹ãã倱æããå Žåãã€ã³ã¿ãŒããªã¿ãŒãåã³èµ·åããŸãã
詳现ã«ã€ããŠã¯ã
Wikipediaãåç
§ããŠ
ãã ãã ã
ãããã°ããã³ãã¬ãŒã¹ãã°
JITã®æ©èœã確èªã§ããŸããïŒ
ãããã°æ
å ±ãåºåããããã«äœ¿çšãããget_printable_location颿°ã远å ããŸãããã
def get_location(pc, program, bracket_map): return "%s_%s_%s" % ( program[:pc], program[pc], program[pc+1:] ) jitdriver = JitDriver(greens=['pc', 'program', 'bracket_map'], reds=['tape'], get_printable_location=get_location)
ãã®é¢æ°ã¯ç·ã®å€æ°ãåããææ¥ãè¿ããŸãã çŸåšã®å®è¡å¯èœãªã¹ããŒãã¡ã³ããã¢ã³ããŒã¹ã³ã¢ã§å²ãŸããŠããBrainfuckã³ãŒããåºåããŸãã
ãµã³ãã«ã³ãŒãã
example4.pyã«åé
眮ããŸãã
次ã«ããã¬ãŒã¹ãã°ã®åºåã䜿çšããŠãã¹ãããã°ã©ã ãå®è¡ããŸãïŒtest.bã¯æåãAããçŽ15ååºåããã ãã§ãïŒã
$ PYPYLOG = jit-log-optïŒlogfile ./example4-c test.b
ãã°ãã¡ã€ã«ã«ã¯ãçæããããã¹ãŠã®ãã¬ãŒã¹ã®ãã°ãå«ãŸããŠãããã©ã®åœä»€ããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããããã確èªã§ããŸãã ãã®ãã¡ã€ã«ã¯ãäžèŠãªæç€ºãæé©åã®æ¹æ³ã確èªã§ãããšããç¹ã§äŸ¿å©ã§ãã
åãã¬ãŒã¹ã¯ã次ã®ãããªè¡ã§å§ãŸããŸãã
[3c091099e7a4a7] {jit-log-opt-loop
ãããŠæ¬¡ã®è¡ã§çµãããŸãïŒ
[3c091099eae17d jit-log-opt-loop}
ãã¬ãŒã¹ããããŒã®çŽåŸã«ãã·ãªã¢ã«çªå·ãšæäœã®æ°ãå«ãã³ã¡ã³ãããããŸãã ç§ã®å Žåãæåã®ãã¬ãŒã¹ã¯æ¬¡ã®ããã«ãªããŸãã
1: [3c167c92b9118f] {jit-log-opt-loop 2:
debug_merge_pointã®è¡ãå°ãé·ãããããŸããã
ãã®ã³ãŒãã»ã¯ã·ã§ã³ã«ã¯4ã€ã®ãã©ã¡ãŒã¿ãŒããããŸãããªããžã§ã¯ããžã®2ã€ã®ãã€ã³ã¿ãŒïŒp0ãšp1ïŒãš2ã€ã®æ°å€ïŒi2ãši3ïŒã§ãã
æåã®æŒç®åã>ãã¯4è¡ç®ããå§ãŸããŸãã æç€ºãªãã§å®è¡ãããå®å
šã«æé©åãããŠããŸãã ãã®ãµã€ã¯ã«ã¯åžžã«ããŒãã®äžéšã§æ©èœããçŸåšã®ã»ã«ãžã®ãã€ã³ã¿ãŒã¯äžå®ã®ãŸãŸã§ãã
5çªç®ãã8çªç®ã®è¡-æŒç®åã+ãã ãŸããã€ã³ããã¯ã¹i2ã®é
åèŠçŽ ããã€ã³ã¿ãŒp1ããæœåºããïŒ6è¡ç®ïŒããŠãããã远å ãããi6ã«æ ŒçŽãããŸãïŒ7è¡ç®ïŒã çµæã¯é
åã«æ»ãããŸãïŒ8è¡ç®ïŒã
9è¡ç®ã¯ã<ãåœä»€ã«å¯Ÿå¿ããŠããŸãããæäœãå¿
èŠãããŸããã ã©ããã-i2ãši3ã¯ãäºåã«èšç®ãããããŒãã»ã«ãžã®2ã€ã®ãã€ã³ã¿ã§ãã ãŸããp1ãã³ãã³ãã©ã€ã³ã§ããããšãããããŸãã p0ãäœã§ãããã¯æç¢ºã§ã¯ãããŸããã
10è¡ç®ãã13è¡ç®ã¯ã-ãæŒç®åãå®è¡ããŸããã€ãŸããé
åã®èŠçŽ ãæœåºããæžç®ããŠå
ã«æ»ããŸãã
14è¡ç®ã§ã¯ãæŒç®åã]ãã«å°éããŸãã è¡15ããã³16ã¯ãi9ãçïŒã€ãŸãããŒãã«çãããªãïŒãã©ããããã§ãã¯ããŸãã i9ã¯ã1ã€æžãããŠããŒãã«å
¥ããå€ã§ãã 16è¡ç®-ãã§ãã¯ã æ¡ä»¶ãæºããããªãå Žåã<Guard2>ãšãã颿°ãå®è¡ããã1ã€ã®ãã©ã¡ãŒã¿ãŒp0ãæž¡ãããŸãã
ãã§ãã¯ã«åæ Œããå Žåã17è¡ç®ãã23è¡ç®ã¯ãbracket_mapèŸæžããç§»åããåœä»€ã®ã¢ãã¬ã¹ãååŸããŸãã ãããã®è¡ãæ£ç¢ºã«äœãããã®ãã¯ããããŸãããã2ã€ã®å€éšåŒã³åºããš3ã€ã®ãã§ãã¯ãå«ãŸããŠããããšã¯æããã§ãã Bracket_mapã倿Žããããçµæã¯ç§»åå
ãšåãã¢ãã¬ã¹ã«ãªããããããã¯ç¡é§ã§ãã ããããPyPyã¯ããã«ã€ããŠã¯ç¥ããŸãããããã®å Žæãæé©åã§ããããšã¯ããã£ãŠããŸãã
24è¡ç®ã¯ãbracket_mapããååŸãããã€ã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããŸãã 25è¡ç®ãš26è¡ç®ã¯ãããã°ã©ã ã®é·ããè¶
ããŠããªãããšã確èªããŸãã
ããã«ãè¡27ã¯ããã€ã³ã¿ãŒãå³å¯ã«86ã«çããããšã確èªãã远å ã®ãã§ãã¯ãå®è¡ããŸããããã¯ããµã€ã¯ã«ã®éå§æã«ãžã£ã³ããè¡ãå¿
èŠãããããšã確èªããããã«å¿
èŠã§ãã
æåŸã«ãè¡28ã§ãµã€ã¯ã«ãçµäºããè¡29ã§ãã©ã¡ãŒã¿ãŒp0ãp1ãi2ãi3ã§ãµã€ã¯ã«ã®å
é ã«ãžã£ã³ãããŸãã
æé©å
åè¿°ã®ããã«ãã«ãŒãã®åå埩ã§ãèŸæžå
ã§æ€çŽ¢ãå®è¡ããããã¢ãã©ã±ãããæ€åºãããŸãã ããã¯éåžžã«éå¹ççã§ãããªããªããé·ç§»ã®ç®æšã¯ç°ãªãå埩ã§å€åããªãããã§ãã
èŸæžã¯ãšãªãåãèŸæžã€ã³ããã¯ã¹ã«å¯ŸããŠåžžã«åãèŠçŽ ãè¿ããšèšãããã«ã翻蚳è
ã«ãã1ã€ã®ãã³ããäžããå¿
èŠããããŸãã
ãããè¡ãããã«ããã£ã¯ã·ã§ããªãå¥ã®é¢æ°ãåŒã³åºããpypy.rlib.jit.purefunctionã§ã©ããããããã«ããŸãã
@purefunction def get_matching_bracket(bracket_map, pc): return bracket_map[pc]
ãã®ããŒãžã§ã³ã¯
example5.pyã«ãããŸãã
ãã®äŸããããŒããã£ã¹ãããŸãã ãã³ãã«ããã¯12ç§ã§ã¯ãªã6ç§ã§å®äºããããã«ãªããŸããïŒ
æ°ãããã¬ãŒã¹ãã°ãèŠãŠã¿ãŸãããã
1: [3c29fad7b792b0] {jit-log-opt-loop 2:
ã¯ããã«è¯ãïŒ çŸåšãåãµã€ã¯ã«ã¯ãå ç®ãæžç®ãé
åããã®2ã€ã®ããŒããé
åå
ã®2ã€ã®å Žæãããã³çµäºæã®ãã§ãã¯ã®ã¿ã§ãã ãã®ã³ãŒãã§ã¯ãã³ãã³ãã«ãŠã³ã¿ãŒã倿Žããå¿
èŠã¯ãããŸããã
ãã®æé©åã¯ãpypy-devã¡ãŒãªã³ã°ãªã¹ãã§Armin Rigoã«ãã£ãŠææ¡ãããŸããã Karl Friedrichã«ã¯ãã€ã³ã¿ãŒããªã¿ãŒã®æé©å
ã«é¢ããããã€ãã®èšäºããããããããæçšã§ããããšã蚌æãããŠããŸãã
ãããã«
ãã®èšäºã§ãPyPyãé«éãªPythonã€ã³ã¿ãŒããªã¿ãŒã§ã¯ãªãããšãçŽåŸããŠããã ããã°å¹žãã§ãã
PyPy JITã³ã³ãã€ã©ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãèšäº
ãã¡ã¿ã¬ãã«ã®ãã¬ãŒã¹ïŒPyPyã®ãã¬ãŒã¹JITã³ã³ãã€ã©ããèªãããšããå§ãããŸãã