рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛: рд╣реИрдХрд░ рд╕рдорд╛рдЪрд╛рд░ рдкрд░ рдЕрдЪреНрдЫреА рдЪрд░реНрдЪрд╛рдЧрд┐рдЯрд╣рдм рдкрд░ рдбреЗрд╡рд┐рдб рдпреВ рдиреЗ рд╡рд┐рднрд┐рдиреНрди рдмрд╛рд╣рд░реА рдЗрдВрдЯрд░рдлреЗрд╕ (рдлреЙрд░реЗрди рдлрдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕реЗрд╕,
рдПрдлрдПрдлрдЖрдИ ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ
рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ (
.so
) рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИред рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╛рд░-рдмрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдлрдПрдлрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдмрд╛рд░ рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрд╛ред
C "FFI" рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рдирдХ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рди рдХрд┐
dlopen()
ред рдпрд╣ рдЕрдВрддрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рддрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдлрдПрдлрдЖрдИ рдХреЗ рд╕рд╛рде рдпрд╣ рддреБрд▓рдирд╛ рдХрд┐рддрдиреА рдИрдорд╛рдирджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐
LJJIT рдХрд╛ FFI
C рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдЭрд╛ рд╡рд╕реНрддреБ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рд╕реА рдХреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 25% рддреЗрдЬ рд╣реИред рдмреЗрдВрдЪрдорд╛рд░реНрдХ C рдореЗрдВ рдХрдордЬреЛрд░ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреИрд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рд╕рдХрддреА рд╣реИ? рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реА рд╣реИ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИред рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд▓рдВрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд╛рд▓рд┐рдХрд╛ (рдкреАрдПрд▓рдЯреА) рд╕реЗ рдЖрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рд╕реА рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкреНрд░рдпреЛрдЧ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛:
https://github.com/skeeto/dynamic-function-benchmarkрдпрд╣рд╛рдБ Intel i7-6700 (Skylake) рдкрд░ рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВ:
plt: 1.759799 ns/call
ind: 1.257125 ns/call
jit: 1.008108 ns/call
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдкреАрдПрд▓рдЯреАред
- рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (
dlsym(3)
рдорд╛рдзреНрдпрдо рд╕реЗ dlsym(3)
) - рдкреНрд░рддреНрдпрдХреНрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (JIT рд╕рдВрдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬрд┐рд╕рдореЗрдВ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрд▓рдПрд▓рдЬреЗрдЖрдИрдЖрдИрдЯреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ,
empty()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
void empty(void) { }
рдПрдХ рд╕рд╛рдЭрд╛ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди:
$ cc -shared -fPIC -Os -o empty.so empty.c
рдкрд┐рдЫрд▓реА
PRNG рддреБрд▓рдирд╛ рдореЗрдВ , рдЕрд▓рд╛рд░реНрдо рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЬрд┐рддрдиреА рдмрд╛рд░ рд╕рдВрднрд╡ рд╣реЛ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЗрдЖрдЙрдЯ рдЯреЗрдмрд▓реНрд╕
рдЬрдм рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛ред рдЬрд╛рдирдХрд╛рд░реА рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдЙрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрддрд╛ рд╕реНрдерд╛рди рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдХрд░рдг (рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рд▓реЗрдЖрдЙрдЯ рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди, рдПрдПрд╕рдПрд▓рдЖрд░) рдХреЗ рдЕрдиреБрд╕рд╛рд░ред
рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ? рд╡реИрд╕реЗ, рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдмрд╛рдЗрдирд░реА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рд╣рд░ рдХреЙрд▓ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реИред рдбрд╛рдпрдиреЗрдорд┐рдХ рд░рдирдЯрд╛рдЗрдо рдмрд┐рд▓реНрдбрд░ рддрдм рд╣рд░ рдХреЙрд▓ рдкрд░ рд╕рд╣реА рдкрддрд╛
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрдВрддреНрд░
рдХреЛрдб рдореЙрдбрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ
рдХреЛрдб рдкреГрд╖реНрдареЛрдВ рдХреЗ
рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдзреАрдорд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдбрд╛рдпрдирд╛рдорд┐рдХ рдбрд╛рдпрд▓ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рдкрддреЗ рдХреЗ рд╕рд╛рде рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрд╛рдЗрдирд░реА рдлреВрд▓рд╛ рд╣реБрдЖ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╕рд╛рдЭрд╛рдХрд░рдг рдХреА рдХрдореА рдХреЛрдб рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИред
рджреВрд╕рд░реА рдУрд░, рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЬреЗрдЖрдИрдЯреА рдЬреИрд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓ рдХреЛ рд░реВрдЯ рдХрд░рдирд╛ рд╣реИред рдореВрд▓ рдбрд╛рдпрд▓ рдкреАрдпрд░ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрдЯрдм рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдХреЛрдб рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ
рддреБрдЪреНрдЫ рд╡рд┐рдирд┐рдордп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЧрддрд┐рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ
рдЖрд▓рд╕реА рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░, рдЬреЛ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред
рдИрдПрд▓рдПрдл рдмрд╛рдЗрдирд░реА рд╕рд┐рд╕реНрдЯрдо рдкрд░, рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдВрдХреЗрдЬ рдЯреЗрдмрд▓ (рдкреАрдПрд▓рдЯреА) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред PLT рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╢реЗрд╖ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд░реАрдб-рдУрдирд▓реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реИрд╢реНрд╡рд┐рдХ рдСрдлрд╕реЗрдЯ рддрд╛рд▓рд┐рдХрд╛ (GOT) рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред PLT рдареВрдВрда GOT рд╕реЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░
рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рдкрддреЗ рдкрд░ рдХреВрджрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрди GOT рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд▓рдХреНрд╖рд┐рдд рд╡рд░реНрдг рдХреЛ рдвреВрдВрдврддрд╛ рд╣реИ, рдЙрд╕ рдкрддреЗ рдХреЗ рд╕рд╛рде GOT рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдПрдХ рдЖрд▓рд╕реА рдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдкреАрдПрд▓рдЯреА рдХрд╛ рдиреБрдХрд╕рд╛рди рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рд╣реИ, рдЬреЛ рдХрд┐ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдмреЗрдВрдЪрдорд╛рд░реНрдХ
рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдВрддрд░ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╢реВрдиреНрдп рдХреЗ рдХрд░реАрдм рд╣реИред
рдпрд╣рд╛рдБ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ:
volatile sig_atomic_t running; static long plt_benchmark(void) { long count; for (count = 0; running; count++) empty(); return count; }
рдЪреВрдВрдХрд┐
empty()
рдПрдХ рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реИ, рдХреЙрд▓ рдкреАрдПрд▓рдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓
рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛
dlsym(3)
рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордирд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
dlsym(3)
рдорд╛рдзреНрдпрдо рд╕реЗред
void *h = dlopen("path/to/lib.so", RTLD_NOW); void (*f)(void) = dlsym("f"); f();
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд▓рд╛рдЧрдд PLT рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдХрдо рд╣реИред рдЬреАрдУрдЯреА рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдм рдФрд░ рдкрд╣реБрдВрдЪ рдХрд╛ рдХреЛрдИ рдордзреНрдпрд╡рд░реНрддреА рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред (рд╕рд╛рд╡рдзрд╛рдиреА: рдпрджрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ PLT рд░рд┐рдХреЙрд░реНрдб рд╣реИ, рддреЛ
dlsym(3)
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯрдм рдПрдбреНрд░реЗрд╕ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред
рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ
рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЪреБрдиреМрддреА рд╣реИред рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░,
рдкреНрд░рддреНрдпрдХреНрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЙрдирдХреЗ рддрддреНрдХрд╛рд▓ рд╕рдВрдмрдВрдзрд┐рдд рдкрддреЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдХреЙрд▓ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреЙрд▓ рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдХреБрдЫ рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдд рдСрдлрд╕реЗрдЯ рд╣реИред рд╕реАрдкреАрдпреВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдХрд╣рд╛рдВ рдЬрд╛рдПрдЧреАред
рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдореЗрдВ рдЕрдзрд┐рдХ рдУрд╡рд░рд╣реЗрдб рд╣реЛрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрддреЗ рдХреЛ рдХрд╣реАрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдХрдореА рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рджреВрд╕рд░реЗ, рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рд╕реАрдкреАрдпреВ рдореЗрдВ рдПрдХ рд╢рд╛рдЦрд╛ рднрд╡рд┐рд╖реНрдпрд╡рдХреНрддрд╛ рдХреЛ рдЙрдХрд╕рд╛рддреЗ рд╣реИрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдХреЙрд▓ рднреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ:
volatile sig_atomic_t running; static long indirect_benchmark(void (*f)(void)) { long count; for (count = 0; running; count++) f(); return count; }
рдЗрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди
dlsym(3)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░
рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛
рд╣реИ , рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдХреЛ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ред
рдпрджрд┐ рд▓реВрдк рдмреЙрдбреА рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдХрдореА рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдФрд░ рдЬрд┐рд╕рд╕реЗ рд╕реНрдЯреИрдХ рдХреЛ рдкрддрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рднреА PLT рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдорд╛рд░реЛрд╣ рдХреЙрд▓
рдкрд╣рд▓реЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд░рд▓ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВред рдбрд╛рдпрдиреЗрдорд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП
рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрд▓ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ, рдореИрдВрдиреЗ рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрд▓ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рдЫреЛрдЯрд╛ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рде рд░рдЦрд╛ред
рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ x86-64 рдкрд░ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреНрд░рдордг 32-рдмрд┐рдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдСрдкрд░реЗрдВрдб (рддрддреНрдХрд╛рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд) рдХреЗ рдХрд╛рд░рдг 2 рдЬреАрдмреА рд╕реАрдорд╛ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ JIT рдХреЛрдб рдХреЛ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рдЧрднрдЧ рдмрдЧрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП,
empty()
ред рдпрджрд┐ рдЬреЗрдЖрдИрдЯреА рдХреЛрдб рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ 2 рдЬреАрдмреА рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рджреЛ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЬреЗрдЖрдИрдЯреА рдХреЛрдб рдХреЗ рдкрддреЗ рдХреЗ рд╕рдЯреАрдХ рдпрд╛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реИред рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ 4 рдПрдордмреА рдШрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдирд┐рдХрдЯрддрдо рдкреГрд╖реНрда рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЬрдЧрд╣ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рдл, рдкреЛрд░реНрдЯреЗрдмрд▓ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕
рдХреЛ / рдХреЗ рддрд╣рдд рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред
рдпрд╣ рдореЗрд░рд╛ рдЬреЗрдЖрдИрдЯреА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣
uintptr_t рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рдирддрд╛ рд╣реИ:
static void jit_compile(struct jit_func *f, void (*empty)(void)) { uintptr_t addr = (uintptr_t)empty; void *desired = (void *)((addr - SAFETY_MARGIN) & PAGEMASK); unsigned char *p = mmap(desired, len, prot, flags, fd, 0); }
рджреЛ рдкреГрд╖реНрда рдпрд╣рд╛рдВ рдЦрдбрд╝реЗ рд╣реИрдВ: рдПрдХ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдЧреИрд░-рд▓реЗрдЦрди рдХреЛрдб рдХреЗ рд╕рд╛рдеред
рдХреНрд▓реЛрдЬрд░ рдХреЗ рд▓рд┐рдП рдореЗрд░реА
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд░рд╣ , рдпрд╣рд╛рдВ рдиреАрдЪреЗ рдХрд╛ рдкреЗрдЬ рд░рд╛рдЗрдЯ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ
running
рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИ рдЬреЛ рдЕрд▓рд╛рд░реНрдо рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред RIP рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рджреЛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреГрд╖реНрда JIT рдХреЛрдб рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реАрд░реНрд╖ рдкреГрд╖реНрда рдореЗрдВ рдпрд╣ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рд╣реИ:
jit_benchmark: push rbx xor ebx, ebx .loop: mov eax, [rel running] test eax, eax je .done call empty inc ebx jmp .loop .done: mov eax, ebx pop rbx ret
call empty
рдХреЗрд╡рд▓ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдЗрд╕реЗ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдкрддреЗ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рднрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд╢реВрдиреНрдп 5 рдирд┐рд░реНрджреЗрд╢ рдХреЗ
рдЕрдВрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
// call empty uintptr_t rel = (uintptr_t)empty - (uintptr_t)p - 5
рдпрджрд┐
empty()
рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░
plt_benchmark()
рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣
empty()
рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛ рд╣реИред
рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрдЖрдИрдЯреА-рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ), рдФрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЗрдЖрдИрдЯреА-рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдПрдХ рд▓реВрдк рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ
рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ LuaJIT PLT рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ,
рднрд▓реЗ рд╣реА рд╡реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рд░рд╣реЗрдВ ред рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ, PLT рдХреЗ рдмрд┐рдирд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ PLT рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 28% рддреЗрдЬ рдереЗ, рдФрд░ PLT рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ PLT рдХреЗ рд╕рд╛рде 43% рддреЗрдЬ рдереЗред рд╕рд░рд▓ рдкреБрд░рд╛рдиреЗ рджреЗрд╢реА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рдЬреЗрдЖрдИрдЯреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдпрд╣ рдЫреЛрдЯрд╛ рд▓рд╛рдн рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреЛрдб рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреА рдкреВрд░реНрдг рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред