рд░реБрдмреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ 3.2 рд╕реЛрдбрдгреЗ

рд░реБрдмреА 3.2.0 рд░рд┐рд▓реАрдЬ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реА, рдПрдХ рдбрд╛рдпрдиреЕрдорд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЬреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯрдордзреНрдпреЗ рдЕрддреНрдпрдВрдд рдХрд╛рд░реНрдпрдХреНрд╖рдо рдЖрд╣реЗ рдЖрдгрд┐ рдкрд░реНрд▓, рдЬрд╛рд╡рд╛, рдкрд╛рдпрдерди, рд╕реНрдореЙрд▓рдЯреЙрдХ, рдЖрдпрдлреЗрд▓, рдЕрдбрд╛ рдЖрдгрд┐ рд▓рд┐рд╕реНрдкрдЪреА рдЙрддреНрдХреГрд╖реНрдЯ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рддреЗ. рдкреНрд░рдХрд▓реНрдк рдХреЛрдб BSD (тАЬ2-рдХреНрд▓реЙрдЬ BSDLтАЭ) рдЖрдгрд┐ тАЬрд░реБрдмреАтАЭ рдкрд░рд╡рд╛рдиреНрдпрд╛рдВрддрд░реНрдЧрдд рд╡рд┐рддрд░реАрдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдЬреЛ GPL рдкрд░рд╡рд╛рдиреНрдпрд╛рдЪреНрдпрд╛ рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЛ рдЖрдгрд┐ GPLv3 рд╢реА рдкреВрд░реНрдгрдкрдгреЗ рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ.

рдкреНрд░рдореБрдЦ рд╕реБрдзрд╛рд░рдгрд╛:

  • CRuby рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░рдЪреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреЛрд░реНрдЯ рдЬреЛрдбрд▓реЗ, рдЬреЗ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЪрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ wasmtime рд╕рд╛рд░рдЦреНрдпрд╛ рд╕реНрдЯрдБрдбрдЕрд▓реЛрди рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ WebAssembly рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХреЛрдбрдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ. рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЪрд╛рд▓рдд рдЕрд╕рддрд╛рдирд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдорд╢реА рдереЗрдЯ рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕рд╛рдареА, WASI (WebAssembly System Interface) API рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. рдЗрддрд░ рдЧреЛрд╖реНрдЯреАрдВрдмрд░реЛрдмрд░рдЪ, WASI рдЪреНрдпрд╛ рд╡рд░ рдПрдХ VFS рд░реЕрдкрд░ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЖрд╣реЗ, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдВрдкреВрд░реНрдг рд░реБрдмреА рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рдПрдХрд▓ wasm рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╕рд╛рджрд░реАрдХрд░рдгрд╛рдордзреНрдпреЗ рдкреЕрдХреЗрдЬ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЪрд╛рд▓рдгреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЖрдгрд┐ рдбреЗрдореЛ рд╡реЗрдм рд╕реЗрд╡рд╛ рдЬрд╕реЗ рдХреА TryRuby рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рдкреЛрд░реНрдЯ рдореВрд▓рднреВрдд рдЖрдгрд┐ рдмреВрдЯрд╕реНрдЯреНрд░реЕрдк рдЪрд╛рдЪрдгреА рд╕реВрдЯ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдЙрддреНрддреАрд░реНрдг рдХрд░рддреЗ, рдЬреЗ рдереНрд░реЗрдб API рд╡рд╛рдкрд░рдд рдирд╛рд╣реАрдд. рдкреЛрд░реНрдЯ рджреЗрдЦреАрд▓ рдлрд╛рдпрдмрд░, рдЕрдкрд╡рд╛рдж рдХрд┐рдВрд╡рд╛ рдХрдЪрд░рд╛ рд╕рдВрдХрд▓рдирд╛рд╕ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА.
  • рд╢реЙрдкрд┐рдлрд╛рдИ рдИ-рдХреЙрдорд░реНрд╕ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордЪреНрдпрд╛ рд╡рд┐рдХрд╕рдХрд╛рдВрдиреА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ YJIT рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ JIT рдХрдВрдкрд╛рдЗрд▓рд░, Ruby рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдЪрд╛ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╡рд╛рдврд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рдЙрдкрдХреНрд░рдорд╛рдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди рдЬреЛ Rails рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд╛рдкрд░рддреЛ рдЖрдгрд┐ рдЕрдиреЗрдХ рдкрджреНрдзрддреА рд╡рд╛рдкрд░рддреЛ, рд╕реНрдерд┐рд░ рдШреЛрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рдд рдЖрд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдЖрд╣реЗ. рдЙрддреНрдкрд╛рджрди рд╡рд╛рдкрд░. рдкреВрд░реНрд╡реА рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ MJIT JIT рдХрдВрдкрд╛рдпрд▓рд░рдордзреАрд▓ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдлрд░рдХ, рдЬреЛ рд╕рдВрдкреВрд░реНрдг рдкрджреНрдзрддреАрдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ C рднрд╛рд╖реЗрдд рдмрд╛рд╣реНрдп рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд╛рдкрд░рддреЛ, рддреЛ рдореНрд╣рдгрдЬреЗ YJIT Lazy Basic Block Versioning (LBBV) рд╡рд╛рдкрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдПрдХрд╛рддреНрдорд┐рдХ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╣реЗ. LBBV рд╕рд╣, JIT рдкреНрд░рдердо рдХреЗрд╡рд│ рдкрджреНрдзрддреАрдЪреА рд╕реБрд░реБрд╡рд╛рдд рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рдЖрдгрд┐ рдХрд╛рд╣реА рдХрд╛рд│рд╛рдирдВрддрд░, рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреЗ рдкреНрд░рдХрд╛рд░ рдЖрдгрд┐ рд╡рд┐рддрд░реНрдХ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджрд░рдореНрдпрд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЙрд░реНрд╡рд░рд┐рдд рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ. YJIT Linux, MacOS, BSD рдЖрдгрд┐ рдЗрддрд░ UNIX рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ x86-64 рдЖрдгрд┐ arm64/aarch64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ.

    рд░реБрдмреАрдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, YJIT рдХреЛрдб Rust рднрд╛рд╖реЗрдд рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рд╕рдВрдХрд▓рдирд╛рд╕рд╛рдареА rustc 1.58.0+ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдореНрд╣рдгреВрди YJIT рдмрд┐рд▓реНрдб рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЕрдХреНрд╖рдо рдЖрд╣реЗ рдЖрдгрд┐ рдкрд░реНрдпрд╛рдпреА рдЖрд╣реЗ. YJIT рд╡рд╛рдкрд░рддрд╛рдирд╛, рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд yjit-рдмреЗрдВрдЪ рдЪрд╛рдЪрдгреА рдЪрд╛рд▓рд╡рддрд╛рдирд╛ рдХрд╛рдордЧрд┐рд░реАрдордзреНрдпреЗ 41% рд╡рд╛рдв рдиреЛрдВрджрд╡рд▓реА рдЧреЗрд▓реА.

    рд░реБрдмреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ 3.2 рд╕реЛрдбрдгреЗ

  • рдЕрдХрд╛рд░реНрдпрдХреНрд╖рдо рдЖрдгрд┐ рд╡реЗрд│ рдШреЗрдгрд╛рд░реЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддреА (ReDoS) рдордзреНрдпреЗ рдмрд╛рд╣реНрдп рдбреЗрдЯрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛рдирд╛ рд╕реЗрд╡рд╛ рд╣рд▓реНрд▓реНрдпрд╛рдВрдирд╛ рдирдХрд╛рд░ рджреЗрдгреНрдпрд╛рдкрд╛рд╕реВрди рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд░рдХреНрд╖рдг рдЬреЛрдбрд▓реЗ. рдореЗрдореЛрд░рд┐рдЭреЗрд╢рди рддрдВрддреНрд░рд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рдгрд╛рд░реЗ рдЬреБрд│рдгрд╛рд░реЗ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рд╕реБрдзрд╛рд░рд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, тАШ/^a*b?a*$/ =~ тАЬaтАЭ * 50000 + тАЬxтАЭтАЩ рдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╡реЗрд│ 10 рд╡рд░реВрди 0.003 рд╕реЗрдХрдВрджрд╛рдВрдкрд░реНрдпрдВрдд рдХрдореА рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реА. рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирдЪреА рдХрд┐рдВрдордд рд╣реА рдореЗрдорд░реА рд╡рд╛рдкрд░рд╛рдордзреНрдпреЗ рд╡рд╛рдв рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдкреЗрдХреНрд╖рд╛ рдЕрдВрджрд╛рдЬреЗ 10 рдкрдЯ рдЬрд╛рд╕реНрдд рдЖрд╣реЗ. рджреБрд╕рд░рд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рдХрд╛рд▓рдмрд╛рд╣реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, тАЬRegexp.timeout = 1.0тАЭ) рдЬреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддреАрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • рд╡рд╛рдХреНрдпрд░рдЪрдирд╛_рд╕реВрдЪрдирд╛ рдореЛрдб рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ, рдЬреЛ рдЧрд╣рд╛рд│ рдХрд┐рдВрд╡рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд▓реЛрдЬрд┐рдВрдЧ "рдПрдВрдб" рдЕрднрд┐рд╡реНрдпрдХреНрддреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯреАрдВрдЪреНрдпрд╛ рдХрд╛рд░рдгрд╛рдВрдЪреЗ рдирд┐рджрд╛рди рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЛ. рди рдЬреБрд│рдгрд╛рд░рд╛ `рдПрдВрдб', рдЧрд╣рд╛рд│ рдХреАрд╡рд░реНрдб (`do', `def`, `if`, рдЗ.)? 1 рд╡рд░реНрдЧ рдХреБрддреНрд░рд╛ > 2 defbark > 3 end 4 end
  • рдкреНрд░рдХрд╛рд░ рдЖрдгрд┐ рд╡рд┐рддрд░реНрдХрд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯреАрдВрд╕рд╛рдареА рд╡рд┐рддрд░реНрдХ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рддреНрд░реБрдЯреА рд╕реНрдерд╛рди рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЛрдбрдордзреНрдпреЗ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде: test.rb:2: `+' рдордзреНрдпреЗ: nil рд▓рд╛ рдкреВрд░реНрдгрд╛рдВрдХ (TypeError) sum = ary рдордзреНрдпреЗ рдЬрдмрд░рджрд╕реНрддреА рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА [0] + ary [рез] ^^^^^^
  • рд╡рд┐рддрд░реНрдХрд╛рдВрдЪреЗ рд╕рдВрдЪ рдЗрддрд░ рдкрджреНрдзрддреАрдВрд╡рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЬреЛрдбрд▓реА: def foo(*) bar(*) end def baz(**) quux(**) end
  • Ruby_vm/mjit/compiler рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЖрд╣реЗ - рдЬреБрдиреНрдпрд╛ MJIT JIT рдХрдВрдкрд╛рдЗрд▓рд░рдЪрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░, рд░реБрдмреА рднрд╛рд╖реЗрдд рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛. MJIT рд╡рд░реНрдХрд░ рдереНрд░реЗрдбрдордзреНрдпреЗ рдЪрд╛рд▓рдгреНрдпрд╛рдРрд╡рдЬреА MJIT рд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдд рдЪрд╛рд▓рддреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХреЗрд▓реА.
  • рдмрдВрдбрд▓рд░ 2.4 рдордзреНрдпреЗ, рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрдмрдЧреНрд░рдм рдЖрд╡реГрддреНрддреА рдбрд┐рдЯреЗрдХреНрдЯрд░ рд╡рд╛рдкрд░рддреЗ, рдбрд╛рд░реНрдЯ рднрд╛рд╖реЗрд╕рд╛рдареА рдкрдм рдкреЕрдХреЗрдЬ рдореЕрдиреЗрдЬрд░рдордзреНрдпреЗ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. RubyGems рдордзреНрдпреЗ рдкреВрд░реНрд╡реА рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ Molinillo рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рднрд╡рд┐рд╖реНрдпрд╛рдд PubGrub рджреНрд╡рд╛рд░реЗ рджреЗрдЦреАрд▓ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓.
  • рдЕрдВрдЧрднреВрдд рд░рддреНрди рдореЙрдбреНрдпреВрд▓реНрд╕рдЪреНрдпрд╛ рдЕрджреНрдпрддрдирд┐рдд рдЖрд╡реГрддреНрддреНрдпрд╛ рдЖрдгрд┐ рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛.

рд╕реНрддреНрд░реЛрдд: opennet.ru

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛