ΠΠ΅ΡΠ΅ ΠΏΡΡΠ½Π°Ρ Ruby 3.2.0, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅Π½ ΠΎΠ±Π΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΉΡΠΎ Π΅ Π²ΠΈΡΠΎΠΊΠΎΠ΅ΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ Π²ΠΊΠ»ΡΡΠ²Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° Perl, Java, Python, Smalltalk, Eiffel, Ada ΠΈ Lisp. ΠΠΎΠ΄ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠ΅ BSD (β2-clause BSDLβ) ΠΈ βRubyβ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΎΡΠ½Π°ΡΡ Π΄ΠΎ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° GPL Π»ΠΈΡΠ΅Π½Π·Π° ΠΈ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ Ρ GPLv3.
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ:
- ΠΠΎΠ±Π°Π²Π΅Π½ Π΅ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π΅Π½ ΠΏΠΎΡΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° CRuby, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π² ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄ Π½Π° WebAssembly Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΡΠ΅Π± Π±ΡΠ°ΡΠ·ΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΈ ΡΡΠ΅Π΄ΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠΎ wasmtime. ΠΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΎΡΠ΄Π΅Π»Π½ΠΎ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° WASI (WebAssembly System Interface) API. ΠΠ°ΡΠ΅Π΄ Ρ Π΄ΡΡΠ³ΠΈ Π½Π΅ΡΠ°, VFS ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π΅ ΠΎΡΠΈΠ³ΡΡΠ΅Π½Π° Π²ΡΡΡ Ρ WASI, ΠΊΠΎΡΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΡΠ»ΠΎΡΠΎ Ruby ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ wasm ΡΠ°ΠΉΠ». ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π² Π±ΡΠ°ΡΠ·ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠ΅Π½ΠΈΡΠΎΠ²ΡΡΠ½ΠΈ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΅Π± ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΡΠΎ TryRuby. ΠΠ° Π½Π°ΡΡΠΎΡΡΠΈΡ Π΅ΡΠ°ΠΏ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΡΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° Π±Π°Π·ΠΎΠ²ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ Π·Π° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Thread API. ΠΠΎΡΡΡΡ ΡΡΡΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²Π»Π°ΠΊΠ½Π°, ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠΏΠ°Π΄ΡΡΠΈ.
- YJIT Π² ΠΏΡΠΎΡΠ΅Ρ JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ, ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Π·Π° Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½Π° ΡΡΡΠ³ΠΎΠ²ΠΈΡ Shopify ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π° Π·Π° ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Ruby ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°ΠΌΠΊΠ°ΡΠ° Π½Π° Rails ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, Π΅ ΠΎΠ±ΡΠ²Π΅Π½ Π·Π° ΡΡΠ°Π±ΠΈΠ»Π΅Π½ ΠΈ Π³ΠΎΡΠΎΠ² Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. ΠΠ»ΡΡΠΎΠ²Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° MJIT JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ΅Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΡΠ½ΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ Π½Π° Π΅Π·ΠΈΠΊΠ° C, Π΅, ΡΠ΅ YJIT ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Lazy Basic Block Versioning (LBBV) ΠΈ ΡΡΠ΄ΡΡΠΆΠ° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½ JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ. Π‘ LBBV, JIT ΠΏΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΡΠ°ΠΌΠΎ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΠΎΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅. YJIT Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° x86-64 ΠΈ arm64/aarch64 Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠΈ Π½Π° Linux, MacOS, BSD ΠΈ Π΄ΡΡΠ³ΠΈ UNIX ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ.
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Ruby, ΠΊΠΎΠ΄ΡΡ YJIT Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π΅Π·ΠΈΠΊΠ° Rust ΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ rustc 1.58.0+ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° YJIT Π΅ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈ Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ. ΠΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° YJIT Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΎ 41% ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° yjit-ΡΡΠ΅Π½Π΄ ΡΠ΅ΡΡ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° Π·Π°ΡΠΈΡΠ° ΡΡΠ΅ΡΡ Π°ΡΠ°ΠΊΠΈ Π·Π° ΠΎΡΠΊΠ°Π· Π½Π° ΡΡΠ»ΡΠ³Π° ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π²ΡΠ½ΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ Π² Π½Π΅Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ ΠΈ ΠΎΡΠ½Π΅ΠΌΠ°ΡΠΈ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ (ReDoS). ΠΠ»Π³ΠΎΡΠΈΡΡΠΌΡΡ Π·Π° ΡΡΠΏΠΎΡΡΠ°Π²ΡΠ½Π΅, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΡΠ° Π·Π° Π·Π°ΠΏΠ°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅, Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΡΠ°Π·Π° β/^a*b?a*$/ =~ βaβ * 50000 + βxββ Π±Π΅ΡΠ΅ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ ΠΎΡ 10 Π½Π° 0.003 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. Π¦Π΅Π½Π°ΡΠ° Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, ΡΠΈΡΡΠΎ ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡ Π΅ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ 10 ΠΏΡΡΠΈ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠ° ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. ΠΡΠΎΡΠ°ΡΠ° ΠΌΡΡΠΊΠ° Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΡΠ°ΠΉΠΌΠ°ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ βRegexp.timeout = 1.0β), ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈΡΡ ΠΈΠ·ΡΠ°Π· ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½.
- ΠΠΊΠ»ΡΡΠ΅Π½ Π΅ ΡΠ΅ΠΆΠΈΠΌΡΡ syntax_suggest, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π·Π° Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π»ΠΈΠΏΡΠ²Π°Ρ ΠΈΠ»ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π·Π°ΡΠ²Π°ΡΡΡ βΠΊΡΠ°Π΅Π½β ΠΈΠ·ΡΠ°Π·. ΠΠ΅ΡΡΠ²ΠΏΠ°Π΄Π°Ρ `end', Π»ΠΈΠΏΡΠ²Π°ΡΠ° ΠΊΠ»ΡΡΠΎΠ²Π° Π΄ΡΠΌΠ° (`do', `def`, `if` ΠΈ Ρ.Π½.)? 1 ΠΊΠ»Π°Ρ ΠΡΡΠ΅ > 2 Π΄Π΅ΡΠ»Π°ΠΉΡ > 3 ΠΊΡΠ°ΠΉ 4 ΠΊΡΠ°ΠΉ
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΡΠΈΠΏΠΎΠ²Π΅ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ, Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΊΡΠΌ ΡΠ΅ΠΆΠΈΠΌΠ° Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: test.rb:2:in `+': nil Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² Integer (TypeError) sum = ary [0] + Π°ΡΠΈ [1] ^^^^^^
- ΠΠΎΠ±Π°Π²Π΅Π½ Π΅ Π½ΠΎΠ² ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ: def foo(*) bar(*) end def baz(**) quux(**) end
- ΠΡΠ΅Π΄Π»Π°Π³Π° ΡΠ΅ Ruby_vm/mjit/compiler - Π²Π°ΡΠΈΠ°Π½Ρ Π½Π° ΡΡΠ°ΡΠΈΡ MJIT JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ, ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π΅Π·ΠΈΠΊΠ° Ruby. ΠΠ°ΡΠ°Π½ΡΠΈΡΠ°Π½ΠΎ Π΅, ΡΠ΅ MJIT ΡΠ°Π±ΠΎΡΠΈ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ, Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π² MJIT ΡΠ°Π±ΠΎΡΠ½Π° Π½ΠΈΡΠΊΠ°.
- Π Bundler 2.4 ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π½Π° Π²Π΅ΡΡΠΈΡ PubGrub, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΡΡΡΠΎ ΠΈ Π² pub ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π΅Π·ΠΈΠΊΠ° Dart. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΡ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Molinillo ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² RubyGems, Π½ΠΎ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΌΠ΅Π½Π΅Π½ ΠΎΡ PubGrub Π² Π±ΡΠ΄Π΅ΡΠ΅.
- ΠΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ gem ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΡΠ΅Π·ΠΈ, Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru