рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ редрдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ PyPy рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджреЗрдЦрд╛, рддреЛ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ;
- рдЗрд╕ рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рд╢рд╛рдпрдж рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ PyPy рд╕рд┐рд░реНрдл рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд╛рдЗрдб Python рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрдкрдХреА рднрд╛рд╖рд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдХрд┐ PyPy рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк PyPy рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╢реБрд░реБрдЖрдд рдХрд░реВрдВрдЧрд╛ред
PyPy рдХреНрдпрд╛ рд╣реИ?
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛рд░реНрд╕рд░, рдПрдХ рдмрд╛рдИрдЯреЗрдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкрд╛рд╢, рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдПрдХ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдирд╛ рдЖрдорддреМрд░ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдордЬреЗрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдордирдорд╛рдирд╛ рдЖрдпрд╛рдореЛрдВ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ, рд╣реИрд╢ рдЯреЗрдмрд▓, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рджрд┐рдорд╛рдЧ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЛ рдкрд╛рдпрдерди рдЬреИрд╕реА рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рд╣реЛрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рд╕реЗрдЯред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рднрд╛рд╖рд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдмрд╣реБрдд рдзреАрдореА, рд╕рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, PyPy рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред PyPy C (рдпрд╛ JVM рдпрд╛ CLI) рдореЗрдВ рдЕрдкрдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛрдб рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд рдЯреВрд▓рдХрд┐рдЯ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдЕрдиреБрд╡рд╛рдж" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдХреЗ рд╕рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреЛ
RPython рдореЗрдВ
рд▓рд┐рдЦреЗрдВ , рдкрд╛рдпрдерди рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдЙрдкрд╕рдореВрд╣, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдХреБрд╢рд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдорд┐рд▓реЗрдЧрд╛ред
рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рднрд╛рд╡реА рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рднрд╛рд╖рд╛
рдореИрдВрдиреЗ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рднрд╛рд╖рд╛ рдлрд╝реНрд░реЗрдо рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдП рдЧрдП рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХрд╛ рдПрдХ рдЯреЗрдк рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЯреЗрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдореЗрдВ рдХреЗрд╡рд▓ 8 рдЖрджреЗрд╢ рд╣реИрдВ:
< - рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрд┐рдЫрд▓реА рд╕реЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред
> - рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЕрдЧрд▓реА рд╕реЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред
+ - рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдирдВрдмрд░ рдХреА рд╡реГрджреНрдзрд┐ред
- - рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореАред
[ - рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 0 рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рддрдХ рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ]ред
] - рдЗрд╕реА рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ [ред
ред - рд╡рд░реНрддрдорд╛рди рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯред
, - рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдПрдХ рдмрд╛рдЗрдЯ рдкрдврд╝реЗрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВред
рдХрд┐рд╕реА рднреА рдЕрдкрд░рд┐рдЪрд┐рдд рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреБрдЫ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмреНрд░реЗрдирдлрдХ рд╣реИред
рднрд╛рд╖рд╛ рд╕реНрд╡рдпрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрд╛рдИрдЯрдХреЛрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрд╡рд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рд▓реВрдк рд╕реАрдзреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓рд╛ рдХрджрдо
рдЖрдЗрдП рдирд┐рдпрдорд┐рдд рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдореБрдЦреНрдп рд░рди рд▓реВрдк рдХрд╛ рдПрдХ рд╕реНрдХреЗрдЪ рд╣реИред
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:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреБрджреЗрд╢ рдХрд╛рдЙрдВрдЯрд░ (рдкреАрд╕реА) рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд▓реВрдк рдореЗрдВ рдкрд╣рд▓реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ, рдлрд┐рд░ рдХрдИ рд╕рд╢рд░реНрдд рдмрдпрд╛рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
"[" рдФрд░ "]" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдорд┐рд▓рд╛рди рдмреНрд░реИрдХреЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдФрд░ рдЕрдм рдЯреЗрдк рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдПрдХ рдЯреЗрдк рдФрд░ рдПрдХ рд╕реВрдЪрдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
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
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЯреЗрдк рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рджрд░рдЕрд╕рд▓, рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдиреЗрдЧреЗрдЯрд┐рд╡ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рдПрд░рд░ рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
рдпрджрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рдо рдХреЛрд╖реНрдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реА рдХреЛрд╖реНрдардХ рдкрд╛ рд╕рдХреЗрдВред
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 example1.py 99bottles.b
PyPy рдкреНрд░рд╕рд╛рд░рдг
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдерд╛ред PyPy рдХреЛ рдЗрд╕ рдХреЛрдб рд╕реЗ рд╕реБрдкрд░рдлрд╛рд╕реНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
PyPy рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ, pypy / рдЕрдиреБрд╡рд╛рджрдХ / рд▓рдХреНрд╖реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдХрд╛рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Pyny рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб - targetnopstandalone.py рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
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
рдЖрд░рдкреАрдереЙрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред PyPy рдирд┐рдпрдорд┐рдд рдкрд╛рдпрдерди рдХреЛрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЧрддрд┐рд╢реАрд▓ рд╣реИред рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдкрд╛рдпрдерди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ рдЗрд╕рд▓рд┐рдП PyPy рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛,
рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ред рдЕрдм рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп os.open рдФрд░ os.read рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред "ред" рдФрд░ "," рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдб рдХреЛ рдкрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рд╕рднреА рдмрджрд▓рд╛рд╡ PyPy рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдерд╛, рд╣реИ рдирд╛? рдореИрдВ рд╢рдмреНрджрдХреЛрд╢реЛрдВ, рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рдФрд░ рдЕрдЧрд░ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╣реИ, рддреЛ rlib.streamio рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕рд╛рд░ рд╣реИрдВ рдЬреЛ рдорд╛рдирдХ RPython рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред
рдкреВрд░реНрдг рдХреЛрдб рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
example2.pyрдЕрдиреБрд╡рд╛рдж
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ PyPy рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ bitbucket.org рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдорд░реНрдЬ рдХрд░реЗрдВред
$ hg рдХреНрд▓реЛрди
bitbucket.org/pypy/pypyрдЪрд▓рд╛рдиреЗ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ pypy / рдЕрдиреБрд╡рд╛рджрдХ / рд▓рдХреНрд╖реНрдп / Transl.py рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
$ python ./pypy/pypy/translator/goal/translate.py example2.py
рддреЗрдЬрд╝ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╛рдпрдерди рдХреЗ рдмрдЬрд╛рдп PyPy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧрд╛ - рдмреНрд░реЗрдирдлреЙрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдмреНрд░реЗрдирдлрдХ рдкрд░ рдПрдХ рдлреНрд░реИрдХреНрдЯрд▓ рдЬрдирд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореЗрд░реА рдорд╢реАрди рдкрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 45 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛рдПрдВред
$ ./example2-c mandel.b
рдФрд░ рдкрд╛рдЗрдерди рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
$ python example2.py mandel.b
рддреЛ, рд╣рдордиреЗ RPython рдореЗрдВ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрд╛ рдФрд░ PyPy рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ред
JIT рдЬреЛрдбрд╝реЗрдВ
C рдореЗрдВ RPython рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди PyPy рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд░рдирдЯрд╛рдЗрдо рдХрдВрдкрд╛рдЗрд▓рд░ (JIT) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЖрдкрдХреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, PyPy рдПрдХ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдмреНрд░реЗрдирдлрдХ рдХреЛрдб рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред
рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, PyPy рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдЪрдХреНрд░ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рджрд┐рдорд╛рдЧ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдЪрдХреНрд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рднреА рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдИ рд╕реНрдЯреИрдХ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЪрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЗрд╕реЗ рдХреНрд░рдорд╢рдГ рд╣рд░рд╛ рдФрд░ рд▓рд╛рд▓ рдЪрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рдкрд╕ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ред
рдЪрд╛рд░ рдЪрд░ рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рд░рди рд▓реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдкреАрд╕реА, рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдмреНрд░реИрдХреЗрдЯ_рдореИрдк рдФрд░ рдЯреЗрдкред рдмреЗрд╢рдХ, рдкреАрд╕реА, рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдмреНрд░реИрдХреЗрдЯ_рдореИрдк рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рдЪрд░ рд╣реИрдВ, рд╡реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡реИрд░рд┐рдПрдмрд▓ рдЯреЗрдк рд▓рд╛рд▓ рд╣реИ; рдпрд╣ рддрдм рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЗрдП 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рдЕрдм рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреЛрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде - рдЧреЛрдж = рдЬрд┐рдЯ:
$ python ./pypy/pypy/translator/goal/translate.py --opt = jit example3.py
рдкреНрд░рд╕рд╛рд░рдг рдмрд╣реБрдд рд▓рдВрдмрд╛ рдЪрд▓реЗрдЧрд╛, рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓рдЧрднрдЧ 8 рдорд┐рдирдЯ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рд╕рд╛рд░рдг рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдлрд┐рд░ рд╕реЗ рднрдЧреНрди рдкреАрдврд╝реА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ - рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ 45 рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рд▓рдЧрднрдЧ 12 рд╕реЗрдХрдВрдб!
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдиреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдЪрд┐рддреНрд░ рдХреА рдкрд╣рд▓реА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╢реЗрд╖ рдХреЛ рдФрд░ рднреА рддреЗрдЬреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреНрд░реЗрд╕рд░ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдЖрдкрдХрд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдЬрдм рдПрдХ рдЬреЗрдЖрдИрдЯреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рднрд╛рд╖рд╛ (рдмреНрд░реЗрдирдлрдХ) рдореЗрдВ рдЕрдХреНрд╕рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд▓реВрдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреА рд╣реИ, рддреЛ рд▓реВрдк рдХреЛ рдЕрдиреБрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдмрд╛рд░ рдПрдХ рд╣реА рдЪрдХреНрд░ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд▓реЙрдЧрд┐рдВрдЧ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдореА рд▓реЙрдЧ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реВрдк рдХреЗ рдмрд╛рдж рдХреЗ рд░рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдореА рдорд╢реАрди рдХреЛрдб рдХреЗрд╡рд▓ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рд╕рд╣реА рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдорд╢реАрди рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдЯреНрд░реЗрд╕ рд▓реЙрдЧ
рдХреНрдпрд╛ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 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)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рдЪрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдирд┐рдпрдд рддрд╛рд░реАрдЦ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдо рдмреНрд░реЗрдирдлрдХ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ
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 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣ рдХреЛрдб рдЕрдиреБрднрд╛рдЧ рдЪрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ: рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЯреВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (p0 рдФрд░ p1) рдФрд░ рджреЛ рдирдВрдмрд░ (i2 рдФрд░ i3)ред
рдкрд╣рд▓рд╛ рдСрдкрд░реЗрдЯрд░ ">" 4 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЪрдХреНрд░ рд╣рдореЗрд╢рд╛ рдЯреЗрдк рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рд╕реНрдерд┐рд░ рд░рд╣рддрд╛ рд╣реИред
рдкрд╛рдВрдЪрд╡реЗрдВ рд╕реЗ рдЖрдард╡реЗрдВ рддрдХ рдХреА рд▓рд╛рдЗрдиреЗрдВ - рдСрдкрд░реЗрдЯрд░ "+"ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реВрдЪрдХрд╛рдВрдХ i2 рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рддрддреНрд╡ рд╕реВрдЪрдХ p1 (рд▓рд╛рдЗрди 6) рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрдХрд╛рдИ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ i6 (рд▓рд╛рдЗрди 7) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рд╕рд░рдгреА (рдкрдВрдХреНрддрд┐ 8) рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрдВрдХреНрддрд┐ 9 "<" рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ - i2 рдФрд░ i3 рдЯреЗрдк рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдВрдХреЗрдд рд╣реИрдВ, рдЬрд┐рдирдХреА рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ p1 рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ p0 рдХреНрдпрд╛ рд╣реИред
13 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЗрдиреЗрдВ 10 "-" рдСрдкрд░реЗрдЯрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИрдВ: рд╡реЗ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдШрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдбрд╛рд▓рддреЗ рд╣реИрдВред
14 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рдСрдкрд░реЗрдЯрд░ "]" рдкрд░ рдЖрддреЗ рд╣реИрдВред рд▓рд╛рдЗрдиреЗрдВ 15 рдФрд░ 16 рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдпрджрд┐ i9 рд╕рдЪ рд╣реИ (рдпрд╛рдиреА, рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ)ред i9 рд╡рд╣ рдорд╛рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдШрдЯрд╛рдпрд╛ рдФрд░ рдЯреЗрдк рдореЗрдВ рдбрд╛рд▓рд╛ред рд▓рд╛рдЗрди 16 - рдЪреЗрдХред рдпрджрд┐ рд╢рд░реНрдд рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ <Guard2> рдирд╛рдордХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, p0ред
рдпрджрд┐ рдЪреЗрдХ рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ 23 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 17 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмреНрд░реИрдХреЗрдЯ_рдореИрдк рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЗ рд▓рд╛рдЗрдиреЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рджреЛ рдмрд╛рд╣рд░реА рдХреЙрд▓ рдФрд░ 3 рдЪреЗрдХ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдмреНрд░реИрдХреЗрдЯ_рдореИрдк рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рдкрддрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди PyPy рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдЬрдЧрд╣ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рд╛рдЗрди 24 рдмреНрд░реИрдХреЗрдЯ_рдореИрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕реВрдЪрдХ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рд▓рд╛рдЗрдиреЗрдВ 25 рдФрд░ 26 рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдереАред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрди 27 рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХ рдХрдбрд╝рд╛рдИ рд╕реЗ 86 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреВрджрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдВрдд рдореЗрдВ, рдЪрдХреНрд░ 28 рд▓рд╛рдЗрди рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд▓рд╛рдЗрди 29 рдкрд░ рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдЫрд▓рд╛рдВрдЧ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ p0, p1, i2, i3 рд╣реЛрддрд╛ рд╣реИред
рдЕрдиреБрдХреВрд▓рди
рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдЬреЛрдбрд╝реА рдмреНрд░реИрдХреЗрдЯ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХреНрд░рдордг рдХрд╛ рд▓рдХреНрд╖реНрдп рд╡рд┐рднрд┐рдиреНрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рд╣рдореЗрдВ рдЕрдиреБрд╡рд╛рджрдХ рдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреНрд╡реЗрд░реА рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╢рдмреНрджрдХреЛрд╢ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдЧреАред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рдХреНрд╢рдирд░реА рдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ 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:
рдмрд╣реБрдд рдмреЗрд╣рддрд░! рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗрд╡рд▓ рдПрдХ рдЬреЛрдбрд╝, рдШрдЯрд╛рд╡, рд╕рд░рдгреА рд╕реЗ рджреЛ рднрд╛рд░, рд╕рд░рдгреА рдореЗрдВ рджреЛ рд╕реНрдерд╛рди рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕реБрдЭрд╛рд╡ рдореБрдЭреЗ рдЕрд░реНрдкрдг рд░реАрдЧреЛ рдиреЗ pypy-dev рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рджрд┐рдпрд╛ рдерд╛ред рдХрд╛рд░реНрд▓ рдлреНрд░реЗрдбрд░рд┐рдХ рдореЗрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЕрдиреБрдХреВрд▓рди рдкрд░
рдХрдИ рд▓реЗрдЦ рд╣реИрдВ , рдЬреЛ рдЙрдкрдпреЛрдЧреА рднреА рд╕рд╛рдмрд┐рдд рд╣реБрдП рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ PyPy рди рдХреЗрд╡рд▓ рдПрдХ рддреЗрдЬрд╝ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИред
рдЖрдк рдореЗрдВ рд╕реЗ рдЬреЛ рд▓реЛрдЧ PyPy JIT рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ
Meta-Level: PyPy's Tracing JIT Compiler рдЕрдиреБрд░реЗрдЦрдг рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред