
"рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдХрд┐рддрдиреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдПрдХ рд╕реБрдЕрд░ рд╕реЗ рдмрд╛рд╣рд░ рджреМрдбрд╝рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред рдЖрдк рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рддреЗрдЬ рд╕реБрдЕрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ" (Emax рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА)
рдЗрд╕ рддрдереНрдп рдХреЛ рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реВрдЕрд░ рдЙрдбрд╝рддреЗ рдирд╣реАрдВ рд╣реИрдВред рдХреЛрдИ рднреА рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп рд░рд╛рдп рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдИрдЯреЗрдХреЛрдб рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рддреНрд╡рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмрд╛рдИрдЯреЗрдХреЛрдб рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реНрдЯреИрдХреНрдб рдПрдлрдбреАрдП рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (рдкрд┐рдЧ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдорд╣рддреНрд╡рд╛рдХрд╛рдВрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореЗрд╣рдирддреА рдкрд┐рдЧрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЦреЛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ (рдЬреНрдпрд╛рджрд╛рддрд░) рдорд╛рдирдХ рд╕реА рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХрд╛ рдХрд╛рдо рдХрдо рд╕реЗ рдХрдо рдбреЗрдврд╝ рдЧреБрдирд╛ рд╣реИред
рднрд╛рдЧ рдПрдХ, рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ
рднрд╛рдЧ рджреЛ, рдЕрдиреБрдХреВрд▓рди (рд╡рд░реНрддрдорд╛рди)
рднрд╛рдЧ рддреАрди, рд▓рд╛рдЧреВ
PorosenokVM
рдЖрдЗрдП рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВред
рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреИрдХреНрдб рдорд╢реАрди рд╣реИ рдЬреЛ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдорд╛рд░рд╛ рд╕реБрдЕрд░ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд╛рдирддрд╛ рд╣реИ - рдПрдХ 64-рдмрд┐рдЯ рдорд╢реАрди рд╢рдмреНрдж, рдФрд░ рд╕рднреА (рдкреВрд░реНрдгрд╛рдВрдХ) рдЧрдгрдирд╛ 256 рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИред рд╕реНрдЯреИрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкрд┐рдЧрд▓реЗрдЯ рдореЗрдВ 65,536 рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдореЗрдореЛрд░реА рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо - рдПрдХ рдорд╢реАрди рд╢рдмреНрдж - рдпрд╛ рддреЛ рдкрд░рд┐рдгрд╛рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдмрд╕ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ (рд╕реНрдЯрдбрдЖрдЙрдЯ) рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯред
рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдорд╢реАрди рдореЗрдВ рдкреВрд░реЗ рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
static struct { uint8_t *ip; uint64_t stack[STACK_MAX]; uint64_t *stack_top; uint64_t memory[MEMORY_SIZE]; uint64_t result; } vm;
рдЙрдкрд░реЛрдХреНрдд рд╣рдореЗрдВ рдЗрд╕ рдорд╢реАрди рдХреЛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓рдЧрднрдЧ рд╕рднреА рдУрд╡рд░рд╣реЗрдб рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрдХреНрд░ рдХреЗ рд░рдЦрд░рдЦрд╛рд╡ рдкрд░ рдкрдбрд╝рддрд╛ рд╣реИ:
interpret_result vm_interpret(uint8_t *bytecode) { vm_reset(bytecode); for (;;) { uint8_t instruction = NEXT_OP(); switch (instruction) { case OP_PUSHI: { uint16_t arg = NEXT_ARG(); PUSH(arg); break; } case OP_ADD: { uint64_t arg_right = POP(); *TOS_PTR() += arg_right; break; } case OP_DONE: { return SUCCESS; } default: return ERROR_UNKNOWN_OPCODE; } } return ERROR_END_OF_STREAM; }
рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ opcode рдХреЗ рд▓рд┐рдП, рдЧреБрд▓реНрд▓рдХ рдЪрд╛рд╣рд┐рдП:
- рдирд┐рд░реНрджреЗрд╢ рдзрд╛рд░рд╛ рд╕реЗ opcode рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
- рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ opcode opcode рдорд╛рдиреЛрдВ рдХреА рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реИ (рдпрд╣ рддрд░реНрдХ C рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд┐рдЪ рдХреЛрдб рдмрдирд╛рддреЗ рд╕рдордп рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
- рд╢рд░реАрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдЬрд╛рдПрдВред
- рд╕реНрдЯреИрдХ рд╕реЗ рдЕрдиреБрджреЗрд╢ рддрд░реНрдХ рдирд┐рдХрд╛рд▓реЗрдВ рдпрд╛ рд╕реАрдзреЗ рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ рдирд┐рд░реНрджреЗрд╢ рддрд░реНрдХ рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВред
- рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░реЗрдВред
- рдпрджрд┐ рдЧрдгрдирд╛ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗрдВред
- рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рд╕реВрдЪрдХ рдХреЛ рдЕрдЧрд▓реЗ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВред
рдпрд╣рд╛рдВ рдкреЗрд▓реЛрдб рдХреЗрд╡рд▓ рдкрд╛рдВрдЪрд╡реЗрдВ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╣реИ, рдмрд╛рдХреА рдУрд╡рд░рд╣реЗрдб рд╣реИ: рд╕реНрдЯреИрдХ (рдХреНрд▓реЙрдЬ 4) рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рддрд░реНрдХреЛрдВ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдпрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдУрдкрдХреЛрдб рдореВрд▓реНрдп (рдХреНрд▓реЙрдЬ 2) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛, рдмрд╛рд░-рдмрд╛рд░ рдореБрдЦреНрдп рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реМрдЯрдирд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг (рдХреНрд▓рд╛рдЬ 3) рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕реБрдЕрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдмреЙрдбреА рдорд╛рд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЖрдХрд╛рд░ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрди рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрддрддрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред
рд╕реБрдЕрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛ рдФрд░ рдПрд░рд╛рдЯреЛрд╕реНрдердиреАрдЬ рдХреА рдЫрд▓рдиреА
рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдореЛрдВ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред
рд╕реА рдореЗрдВ рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рд╕рдордп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЦреБрдж рдХреЛ рдЧреБрд▓реНрд▓рдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ 1 рд╕реЗ 65,536 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
# sum numbers from 1 to 65535 # init the current sum and the index PUSHI 1 PUSHI 1 # stack s=1, i=1 STOREI 0 # stack: s=1 # routine: increment the counter, add it to the current sum incrementandadd: # check if index is too big LOADI 0 # stack: s, i ADDI 1 # stack: s, i+1 DUP # stack: s, i+1, i+1 GREATER_OR_EQUALI 65535 # stack: s, i+1, 1 or 0 JUMP_IF_TRUE done # stack: s, i+1 DUP # stack: s, i+1, i+1 STOREI 0 # stack: s, i+1 ADD # stack: s+i+1 JUMP incrementandadd done: DISCARD PRINT DONE
рдЕрдЬрдЧрд░ рдирд╣реАрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рд╕реБрдЕрд░ рдХреА рдЦреБрд╢реА рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рд╣реИ: рдЯрд┐рдкреНрдкрдгреА, рдЯреИрдЧ, рд╕рд╢рд░реНрдд рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрджрдирд╛, рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдореЗрдиреЗрдорд┐рдХреНрд╕, рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рддрд░реНрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рдорд╢реАрди "рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо" рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░реЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рд╣реИрдВ, рдЬреЛ рдЖрддреНрдорд╛ рдореЗрдВ рд╕рд╛рд╣рд╕реА рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦрд╛рд▓реА рд╕рдордп рд╣реИ, рдкрд╛рдардХ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдмрдврд╝рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ - рдПрд░рд╛рдЯреЛрд╕реНрдердиреАрдЬрд╝ рдХреА рдЫрд▓рдиреА рдХрд╛ рдПрдХ рднреЛрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд┐рдЧрд▓реЗрдЯ рд╡реИрд╕реЗ рднреА рдХрд╛рдлреА рддреЗрдЬ рдЪрд▓рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдорд╢реАрди рд╡рд╛рд▓реЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реМ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдк рдХрд░реВрдВрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдЧреИрд░-рдЕрдиреБрдХреВрд▓рд┐рдд рд╕реБрдЕрд░ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рдЪрд▓рддрд╛ рд╣реИ:
> ./pigletvm runtimes test/sieve-unoptimized.bin 100 > /dev/null PROFILE: switch code finished took 545ms
рдЖрдзрд╛ рд╕реЗрдХрдВрдб! рддреБрд▓рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреЗрдИрдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣реА рдкрд╛рдпрдерди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реМ рд░рди рдмрдирд╛рддрд╛ рд╣реИ рдереЛрдбрд╝рд╛ рдзреАрдорд╛:
> python test/sieve.py > /dev/null 4.66692185402
4.5 рд╕реЗрдХрдВрдб, рдпрд╛ рдиреМ рдмрд╛рд░ рдзреАрдорд╛ред рд╣рдореЗрдВ рдШреЗрдВрдЯрд╛ рдХреЛ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП - рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреНрд╖рдорддрд╛ рд╣реИ! рдареАрдХ рд╣реИ, рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рд╕реБрдЕрд░ рдкреНрд░реЗрд╕ рдХреЛ рдкрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡реНрдпрд╛рдпрд╛рдо рдПрдХ: рд╕реНрдЯреЗрдЯрд┐рдХ рд╕реБрдкрд░рд┐рдирд╕реНрдЯреНрд░рдХреНрд╢рди
рдлрд╛рд╕реНрдЯ рдХреЛрдб рдХрд╛ рдкрд╣рд▓рд╛ рдирд┐рдпрдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдлрд╛рд╕реНрдЯ рдХреЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдХрднреА рднреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рди рдХрд░реЗрдВред рддреЛ рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдЕрд╡рд▓реЛрдХрди рдПрдХ: рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд░реВрдкрд░реЗрдЦрд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╣реИрдВ рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд╕реБрдЕрд░ рдХреЛ рдЕрдзрд┐рдХ рдкреАрдбрд╝рд╛ рдирд╣реАрдВ рджреЗрдВрдЧреЗ рдФрд░ рдЦреБрдж рдХреЛ рд╕рд┐рд░реНрдл рдПрдХ-рджреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦреЗрдВрдЧреЗ:
- LOADI 0, ADD - рд╕реНрдЯреИрдХ рдХреЛ рдореЗрдореЛрд░реА 0 рд╕реЗ рдирдВрдмрд░ 0 рдкрд░ рд░рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
- PUSHI 65536, GREATER_OR_EQUAL - рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдбрд╛рд▓реЗрдВ рдФрд░ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдереА, рддреБрд▓рдирд╛ (0 рдпрд╛ 1) рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реНрдЯреИрдХ рдкрд░ рд╡рд╛рдкрд╕ рдбрд╛рд▓ рджрд┐рдпрд╛ред
- PUSHI 1, ADD - рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдбрд╛рд▓реЗрдВ, рдЗрд╕реЗ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдереА, рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЬреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдбрд╛рд▓ рджрд┐рдпрд╛ред
рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдорд╢реАрди рдореЗрдВ 20 рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдФрд░ рдПрдХ рдкреВрд░реЗ рдмрд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - 256 рдорд╛рдиред рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ:
for (;;) { uint8_t instruction = NEXT_OP(); switch (instruction) { case OP_LOADADDI: { uint16_t addr = NEXT_ARG(); uint64_t val = vm.memory[addr]; *TOS_PTR() += val; break; } case OP_GREATER_OR_EQUALI:{ uint64_t arg_right = NEXT_ARG(); *TOS_PTR() = PEEK() >= arg_right; break; } case OP_ADDI: { uint16_t arg_right = NEXT_ARG(); *TOS_PTR() += arg_right; break; } }
рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдпреЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХреНрдпрд╛ рдЖрдпрд╛:
> ./pigletvm runtimes test/sieve.bin 100 > /dev/null PROFILE: switch code finished took 410ms
рд╡рд╛рд╣! рдХреЛрдб рдХреЗрд╡рд▓ рддреАрди рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рд╣рдордиреЗ рдбреЗрдврд╝ рд╕реМ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдЬреАрддреЗ!
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдпрд╣рд╛рдВ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░рд╛ рдЧреБрд▓реНрд▓рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдзрд╛рдЧрд╛ рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ рдирд╣реАрдВ рдЧрд┐рд░рддрд╛ рд╣реИ, рдХреБрдЫ рднреА рдбрд┐рдХреЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рддрд░реНрдХ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реНрдЯреИрдХ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред
рдЗрд╕реЗ рд╕реНрдерд┐рд░ рд╕реБрдкрд░рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рд╕реНрдЯреЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЪрд░рдг рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ред рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕рднреА рдЖрднрд╛рд╕реА рдорд╢реАрдиреЗрдВ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред
рд╕реНрдереИрддрд┐рдХ рд╕реБрдкрд░рд┐рдирд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд┐рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рдЗрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реБрдкрд░рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реБрдкрд░рд┐рдирд╕реНрдЯреНрд░рдХреНрд╢рди (90 рдФрд░ 2000 рдХреЗ рджрд╢рдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЗрд╕ рддрдХрдиреАрдХ рдиреЗ рдПрдХ рдЖрджрд┐рдо JIT рд╕рдВрдХрд▓рди рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдИ рдереА)ред
рд╕рд╛рдзрд╛рд░рдг рд╕реА рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдордХреНрдЦреА рдкрд░ рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдЧреБрд▓реНрд▓рдХ рдХрд╛рдлреА рд╣рдж рддрдХ рдЗрд╕реЗ рдПрдХ рдИрдорд╛рдирджрд╛рд░ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрд╣рддрд░ рдЕрднреНрдпрд╛рд╕ рд╣реИрдВред
рд╡реНрдпрд╛рдпрд╛рдо рджреЛ: opcode рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реАрдорд╛ рдХреА рдЬрд╛рдБрдЪ
рд╣рдорд╛рд░реЗ рддреНрд╡рд░рд┐рдд рдХреЛрдб рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╢рд╛рд╢реНрд╡рдд рдкреНрд░рд╢реНрди рдкреВрдЫрддреЗ рд╣реИрдВ: рдЖрдк рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?
рдЬрдм рд╣рдо рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдорд╢реАрди рдХреЗ рдЙрдкрдХрд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЧрдП, рддреЛ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкреНрд░рддреНрдпреЗрдХ рдУрдкреЛрдб рдХреЗ рд▓рд┐рдП рдХрд░рддреА рд╣реИред рдФрд░ рдмрд┐рдВрджреБ 2 (рд╕реНрд╡рд┐рдЪ рдорд╛рдиреЛрдВ рдХреА рд╡реИрдз рд╕реАрдорд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдХреЛрдб рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛) рд╕рдмрд╕реЗ рд╕рдВрджрд┐рдЧреНрдз рд╣реИред
рдЖрдЗрдП рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ GCC рд╕реНрд╡рд┐рдЪ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:
- рдПрдХ рд╕рдВрдХреНрд░рдордг рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЬреЛ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдкрддреЗ рдкрд░ рдУрдкрдХреЛрдб рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред
- рдПрдХ рдХреЛрдб рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдУрдкрдХреЛрдб рд╕рднреА рд╕рдВрднрд╡ рд╕реНрд╡рд┐рдЪ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЗрдмрд▓ рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ рдпрджрд┐ рдУрдкрдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реИред
- рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреА рдЬрд╛рдВрдЪ рдХреНрдпреЛрдВ рдХреА рдЬрд╛рддреА рд╣реИ? рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдУрдкреЗрдХ рдпрд╛ рддреЛ рд╕рд╣реА рд╣реИ - OP_DONE рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛, рдпрд╛ рдЧрд▓рдд - рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реЗ рдкрд░реЗ рдЬрд╛рдирд╛ред рдУрдкрдХреЛрдб рд╕реНрдЯреНрд░реАрдо рдХреА рдкреВрдВрдЫ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдФрд░ рд╢реВрдиреНрдп OP_ABORT рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдСрдкрдХреЛрдб рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЪреЗрдХ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ! рдФрд░ рдкрд┐рдЧреЗрдЯ рдХреЛ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдВрдХрд▓рдХ рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдореБрдЦреНрдп рд╕реНрд╡рд┐рдЪ рдХреЛ рдереЛрдбрд╝рд╛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
uint8_t instruction = NEXT_OP(); switch (instruction & 0x1f) { case 26 ... 0x1f: { return ERROR_UNKNOWN_OPCODE; } }
рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ 26 рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рд╣рдо рдПрдХ рдмрд┐рдЯ рдорд╛рд╕реНрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ (рдУрдкрд▓ рдореВрд▓реНрдп 0x1f рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА 0b11111 рд╣реИ рдЬреЛ рдУрдкрдХреЛрдб рдкрд░ рдорд╛рдиреЛрдВ рдХреА рд╕реАрдорд╛ рдХреЛ 0 рд╕реЗ 31 рддрдХ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ) рдФрд░ 26 рд╕реЗ 31 рдХреЗ рдмреАрдЪ рдЕрдкреНрд░рдпреБрдХреНрдд рдорд╛рдиреЛрдВ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдмрд┐рдЯ рдирд┐рд░реНрджреЗрд╢ x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдХреБрдЫ рд╕рдмрд╕реЗ рд╕рд╕реНрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╕реНрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ рдЬрд╛рдБрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдХрдИ рдЪрдХреНрд░ рдЬреАрддрдиреЗ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рд╕рдВрдХреЗрдд рдХреЛ рд╕рдордЭрддрд╛ рд╣реИред
рд╡реИрд╕реЗ, рдорд╛рдорд▓реЗ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реАрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдорд╛рдирдХ рд╕реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╕реАрд╕реА рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрдИ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд░реАрдореЗрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
> ./pigletvm runtimes test/sieve.bin 100 > /dev/null PROFILE: switch code finished took 437ms PROFILE: switch code (no range check) finished took 383ms
рдПрдХ рдФрд░ 50 рдорд┐рд▓реАрд╕реЗрдХрдВрдб! рдШреЗрдВрдЯрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдЦреБрдж рдХреЛ рдЕрдкрдиреЗ рдХрдВрдзреЛрдВ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ! "
рд╡реНрдпрд╛рдпрд╛рдо рддреАрди: рдЯреНрд░реЗрд▓реНрд╕
рдХреНрдпрд╛ рдЕрдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╣рдорд╛рд░реЗ рдкрд┐рдЧрд▓реЗрдЯ рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕реБрдкрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдмрдЪрдд рдорд┐рд▓реАред рдФрд░ рд╡реЗ рдореБрдЦреНрдп рдЪрдХреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реА рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрд╕рд╛рдзрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдХреЗрдВрджреНрд░реАрдп рд╕реНрд╡рд┐рдЪ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рди рд╣реИред рдЖрдзреБрдирд┐рдХ рд╢рд╛рдЦрд╛ рдХреЗ рднрд╡рд┐рд╖реНрдпрд╡рдХреНрддрд╛рдУрдВ рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬрдЯрд┐рд▓ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рднреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЗ рд╕рд╛рде "рд╕реНрдореАрдпрд░рд┐рдВрдЧ" рд╢рд╛рдЦрд╛ рдЕрдВрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдмрд╛рдЗрдЯ-рдмрд╛рдп-рдмрд╛рдпрдЯ рд░реАрдбрд┐рдВрдЧ рдСрдлрд╝рд┐рд╕ рдУрдкрдХреЛрдбреНрд╕ рдФрд░ рд╕реАрдзреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реЗред рднреМрддрд┐рдХ рдорд╢реАрдиреЗрдВ 64-рдмрд┐рдЯ рдорд╢реАрди рд╢рдмреНрдж рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рдЬрдм рдХреЛрдб рдХрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдХреНрд╕рд░ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ , рдЕрд░реНрдерд╛рддреН , рдмрд┐рдирд╛ рд╢рд╛рдЦрд╛рдУрдВ рдФрд░ рд▓реЗрдмрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдоред рдмреЗрд╕ рдмреНрд▓реЙрдХ рдпрд╛ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдпрд╛ рд▓реЗрдмрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд╕рд╢рд░реНрдд рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдпрд╛ рдЕрдЧрд▓реЗ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдмрд▓ рдкрд░ рд╕реАрдзрд╛ рдХреВрджрддрд╛ рд╣реИред
рдЖрдзрд╛рд░ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕реБрдЕрд░ рдЗрд╕рдХреА рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рднреАрддрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрди рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдФрд░ рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдмреЗрд╕ рдпреВрдирд┐рдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЯреНрд░реИрдХ рддрдХ рднреА рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдорд╢реАрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЯреНрд░реИрдХ рдореЗрдВ рд╕рднреА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ (рдпрд╛рдиреА рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ) рдмреЗрд╕ рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред
рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рддрд░реНрдХреЛрдВ рдХреЛ рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рд╕рдм рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕реБрдЕрд░ рдиреЗ рднреА рдЕрдкрдиреА рддрд╛рдХрдд рдкрд░ рдереЛрдбрд╝рд╛ рд╕рдВрджреЗрд╣ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рдерд╛ред
рдЖрдЗрдП рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдк рдЯреНрд░реИрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд┐рд░реНрджреЗрд╢ рдХреА рдХрд▓реНрдкрдирд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
struct scode { uint64_t arg; trace_op_handler *handler; };
рдпрд╣рд╛рдБ рдЖрд░реНрдЧ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкреВрд░реНрд╡-рдбрд┐рдХреЛрдбреЗрдб рддрд░реНрдХ рд╣реИ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реВрдЪрдХ рд╣реИ рдЬреЛ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рддрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рджреГрд╢реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
typedef scode trace[MAX_TRACE_LEN];
рдЕрд░реНрдерд╛рддреН, рдПрдХ рдЯреНрд░реЗрд╕ рд╕реАрдорд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдПрд╕-рдХреЛрдб рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЕрдВрджрд░ рдЯреНрд░реЗрд╕ рдХреИрд╢ рд╣реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
trace trace_cache[MAX_CODE_LEN];
рдпрд╣ рд╕рдВрднрд╡ рдмрд╛рдпреЛрдЯреЗрдХ рд▓рдВрдмрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдирд┐рд╢рд╛рди рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рд╕рдорд╛рдзрд╛рди рдЖрд▓рд╕реА рд╣реИ, рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рд╣реИрдВрдбрд▓рд░ рдЦреБрдж рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛:
for (size_t trace_i = 0; trace_i < MAX_CODE_LEN; trace_i++ ) vm_trace.trace_cache[trace_i][0].handler = trace_compile_handler;
рдореБрдЦреНрдп рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓реВрдк рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
while(vm_trace.is_running) { scode *code = &vm_trace.trace_cache[vm_trace.pc][0]; code->handler(code); }
рдПрдХ рдЯреНрд░реЗрд╕ рдХрдореНрдкрд╛рдЗрд▓рд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реЗрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
static void trace_compile_handler(scode *trace_head) { scode *trace_tail = trace_head; trace_head->handler(trace_head); }
рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВрдбрд▓рд░:
static void op_add_handler(scode *code) { uint64_t arg_right = POP(); *TOS_PTR() += arg_right; code++; code->handler(code); }
рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреВрдВрдЫ рдкрд░ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реЗрд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
static void op_done_handler(scode *code) { (void) code; vm_trace.is_running = false; vm_trace.error = SUCCESS; }
рдпрд╣ рд╕рдм, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╕реБрдкрд░рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣рдореЗрдВ рдХреБрдЫ рднреА рджреЗрддрд╛ рд╣реИ:
> ./pigletvm runtimes test/sieve.bin 100 > /dev/null PROFILE: switch code finished took 427ms PROFILE: switch code (no range check) finished took 395ms PROFILE: trace code finished took 367ms
рд╣реБрд░реНрд░реЗ, рдПрдХ рдФрд░ 30 рдорд┐рд▓реАрд╕реЗрдХрдВрдб!
рдРрд╕рд╛ рдХреИрд╕реЗ? рдХреЗрд╡рд▓ рд▓реЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдирд┐рд░реНрджреЗрд╢ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЙрд▓ рдФрд░ рдкрд╛рд╕рд┐рдВрдЧ рддрд░реНрдХреЛрдВ рдкрд░ рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдкрд┐рдЧреА рдЕрднреА рднреА рдЕрдкрдиреЗ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрд╡рд┐рдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдкрдЯрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИред
рдЯреНрд░реИрдХ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдпрд╣ рд▓рд╛рдн рддреАрди рдХрд╛рд░рдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ:
- рдХреЛрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдмрд┐рдЦрд░реА рд╣реБрдИ рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред
- рд╣реИрдВрдбрд▓рд░ рдХреЗ рддрд░реНрдХ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреВрд░реНрдг рдорд╢реАрди рд╢рдмреНрдж рдореЗрдВ рдкреВрд░реНрд╡-рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЯреНрд░реЗрд╕ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рдиред
- рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрд╣рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЯреЗрд▓ рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реИред
рд╣рдорд╛рд░реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрд┐рдЧрд▓реЗрдЯ рдФрд░ рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкреНрд░рд╛рдЪреАрди рддрдХрдиреАрдХ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рд╕рд┐рд▓рдирд╛ рдХреЛрдбред
рд╡реНрдпрд╛рдпрд╛рдо рдЪрд╛рд░: "рд╕рд┐рд▓рдирд╛" рдХреЛрдб
рд╡реНрдпрд╛рдЦреНрдпрд╛рддрд╛рдУрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕реБрдЕрд░ рдиреЗ рдПрдХ рд▓рдбрд╝реА рдкрд┐рд░реЛрдпрд╛ рдХреЛрдб рд╕реБрдирд╛ред рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдПрдХ opcodes рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдмрд▓рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдпрд╛ рд▓реЗрдмрд▓реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕реАрдзреЗ рдордзреНрдпрд╡рд░реНрддреА рдУрдкрдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдЙрдирдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред
рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЗрди рджрд┐рдиреЛрдВ рдПрдХ рдорд╣рдВрдЧрд╛ рдФрд░ рдЕрд░реНрдерд╣реАрди рд╡реНрдпрд╡рд╕рд╛рдп рд╣реИ; рд╕рд┐рд▓рдирд╛ рдХреЛрдб рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдорд╛рдирдХ рд╕реА рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рддрдХрдиреАрдХ, рдЬрд┐рд╕ рдкрд░ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ, рд▓реЗрдХрд┐рди рдЧреИрд░-рдорд╛рдирдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реА-рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╕реАрд╡рди рдХреЛрдб (рдЕрдВрдЧреНрд░реЗрдЬреА рдЯреЛрдХрди рдереНрд░реЗрдбреЗрдб рдХреЛрдб) рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реБрдЕрд░ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдерд╛, рд╣рдо рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВрдбрдХреЛрдб рд▓реЗрдмрд▓ рдХреЗ рдкрддреЗ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рдСрдкрдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
const void *labels[] = { [OP_PUSHI] = &&op_pushi, [OP_LOADI] = &&op_loadi, [OP_LOADADDI] = &&op_loadaddi, [OP_STORE] = &&op_store, [OP_STOREI] = &&op_storei, [OP_LOAD] = &&op_load, [OP_DUP] = &&op_dup, [OP_DISCARD] = &&op_discard, [OP_ADD] = &&op_add, [OP_ADDI] = &&op_addi, [OP_SUB] = &&op_sub, [OP_DIV] = &&op_div, [OP_MUL] = &&op_mul, [OP_JUMP] = &&op_jump, [OP_JUMP_IF_TRUE] = &&op_jump_if_true, [OP_JUMP_IF_FALSE] = &&op_jump_if_false, [OP_EQUAL] = &&op_equal, [OP_LESS] = &&op_less, [OP_LESS_OR_EQUAL] = &&op_less_or_equal, [OP_GREATER] = &&op_greater, [OP_GREATER_OR_EQUAL] = &&op_greater_or_equal, [OP_GREATER_OR_EQUALI] = &&op_greater_or_equali, [OP_POP_RES] = &&op_pop_res, [OP_DONE] = &&op_done, [OP_PRINT] = &&op_print, [OP_ABORT] = &&op_abort, };
рдкреНрд░рддреАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ && - рдпреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИрдВ, рдЬреАрд╕реАрд╕реА рдХрд╛ рд╕рдмрд╕реЗ рдЧреИрд░-рдорд╛рдирдХ рд╡рд┐рд╕реНрддрд╛рд░ред
рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкрд╣рд▓реЗ рдУрдкрдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:
goto *labels[NEXT_OP()];
рдпрд╣рд╛рдБ рдХреЛрдИ рдЪрдХреНрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рд╕реНрд╡рдпрдВ рд╣реА рдирд┐рдореНрди рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреВрдж рдмрдирд╛рддрд╛ рд╣реИ:
op_pushi: { uint16_t arg = NEXT_ARG(); PUSH(arg); goto *labels[NEXT_OP()]; }
рдПрдХ рд╕реНрд╡рд┐рдЪ "рдлреИрд▓рддрд╛" рд╢рд╛рдЦрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрд╕рд╛рдзрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд╛рдЦрд╛ рднрд╡рд┐рд╖реНрдпрд╡рдХреНрддрд╛ рдХреА рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╕реНрд╡рд┐рдЪ рдХреЛ рд╕реАрдзреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдХреНрд░рдордг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рд╣реИред
рд╡рд╣ рдкреВрд░реА рддрдХрдиреАрдХ рд╣реИред рд╡рд╣ рдЕрдкрдиреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдЧреБрд▓реНрд▓рдХ рдкрд╕рдВрдж рдХрд░рддреА рдереАред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
> ./pigletvm runtimes test/sieve.bin 100 > /dev/null PROFILE: switch code finished took 443ms PROFILE: switch code (no range check) finished took 389ms PROFILE: threaded code finished took 477ms PROFILE: trace code finished took 364ms
рдКрдкреНрд╕! рдпрд╣ рд╣рдорд╛рд░реА рд╕рднреА рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдзреАрдорд╛ рд╣реИ! рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛? рдЪрд▓реЛ рд╕рднреА GCC рдЕрдиреБрдХреВрд▓рди рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╣реА рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
> ./pigletvm runtimes test/sieve.bin 100 > /dev/null PROFILE: switch code finished took 969ms PROFILE: switch code (no range check) finished took 940ms PROFILE: threaded code finished took 824ms PROFILE: trace code finished took 1169ms
рдпрд╣рд╛рдВ, рд╕рд┐рд▓рдирд╛ рдХреЛрдб рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред
рддреАрди рдХрд╛рд░рдХ рдпрд╣рд╛рдВ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ:
- рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдпрдВ рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдореИрдиреБрдЕрд▓ рд▓реЗрдмрд▓ рдкреНрд▓реЗрдЯ рд╕реЗ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИред
- рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВред
- рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╣рд╡реЗрд▓рд╡реЗрд▓ рдкреАрдврд╝реА рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ, рд╢рд╛рдЦрд╛ рдХреЗ рднрд╡рд┐рд╖реНрдпрд╡рдХреНрддрд╛рдУрдВ рдиреЗ рдПрдХрд▓ рд╢рд╛рдЦрд╛ рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрдХреНрд░рдордг рдХрд╛ рд╕рдЯреАрдХ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИред
рдкреБрд░рд╛рдиреА рд╕реНрдореГрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рднреА рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рд╡реАрдПрдо рджреБрднрд╛рд╖рд┐рдпрд╛, рд▓реЗрдХрд┐рди, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдЗрди рджрд┐рдиреЛрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд░рд╛рддрдирддрд╛ рд╣реИред
рдЖрдЗрдП рд╣рдо рдЖрдЦрд┐рд░рдХрд╛рд░ рдЕрдкрдиреЗ рд╕реВрдЕрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╕рдлрд▓рддрд╛рдУрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВред
рд╕реБрдЕрд░ рдХреЗ рдЙрдбрд╝рд╛рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЙрдбрд╝рд╛рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реА рдЧреБрд▓реНрд▓рдХ рдиреЗ 550 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рд▓реЗрдХрд░ "рдЪрд▓рдиреА" рдкрд░ рдЕрдВрддрд┐рдо 370 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рддрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд┐рдпрд╛ рд╣реИред рд╣рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рд╕реБрдкрд░-рдирд┐рд░реНрджреЗрд╢, рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреА рдЬрд╛рдВрдЪ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛, рдирд┐рд╢рд╛рди рдХреЗ рдЬрдЯрд┐рд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд▓рдирд╛ рдХреЛрдб рднреАред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рдо, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдЪреАрдЬреЛрдВ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред 1.5 рдХреЗ рдПрдХ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рддреНрд╡рд░рдг, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдФрд░ рдШреЗрдВрдЯрд╛ рдЧрд░реНрдд рдореЗрдВ рдЪреЛрдХрд░ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╣рдХрджрд╛рд░ рд╣реИрдВред
рд╕реБрдЕрд░ рдХреЗ рд╕рд╛рде рд╣рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЬреЛ рдирд┐рд╣рд┐рдд рд╢рд░реНрддреЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд┐рдЧрд▓реЗрдЯ рд╡реАрдПрдо рдорд╢реАрди рдХреЗ рд╕реНрдЯреИрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЕрдиреБрджреЗрд╢ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рдХрд╛рд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ 10-20% рд╕рдордп рдХрдЯ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реА рдореБрдЦреНрдп рд╕реНрдерд┐рддрд┐ - рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рдХреА рдХрдореА - рднреА рдкреНрд░рдХреГрддрд┐ рдХрд╛ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИред рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЗрд░реЙрдпрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрдЕрд░ рдХреЛ рдкрдВрдк рдХрд░рдирд╛ рдЗрди рджрд┐рдиреЛрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ: рдЬреАрдПрдирдпреВ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ рдпрд╛ рд▓рд┐рдмрдЬрд┐рдЯ рдЬреИрд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ , рд╕рднреА рдЧрдВрджреЗ рдХрд╛рдо рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рдХрд╛рд╕ рд╕рдордп рдФрд░ рдХреЛрдб рдХреА рдХреБрд▓ рдорд╛рддреНрд░рд╛ рдореЗрдВ рднреА рдЬрдмрд░рджрд╕реНрдд рд╡реГрджреНрдзрд┐ рд╣реЛ рд░рд╣реА рд╣реИред
рдмреЗрд╢рдХ, рдЕрдиреНрдп рдЪрд╛рд▓реЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЫреЛрдЯреА рд╕реБрдЕрд░ рдЦреБрд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рд╣реИред , тАФ - тАФ - . , .
PS , , , , ( https://www.instagram.com/vovazomb/ ), .
PPS , . true-grue - тАФ PigletC . !
PPPS iliazeus : . ; . .