ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ ๋งค์ฐ โโํจ์จ์ ์ด๊ณ Perl, Java, Python, Smalltalk, ์ํ , Ada ๋ฐ Lisp์ ์ต๊ณ ์ ๊ธฐ๋ฅ์ ํตํฉํ ๋์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Ruby 3.1.0์ด ์ถ์๋์์ต๋๋ค. ํ๋ก์ ํธ ์ฝ๋๋ BSD(โ2-clause BSDLโ) ๋ฐ โRubyโ ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค. ์ด๋ GPL ๋ผ์ด์ ์ค์ ์ต์ ๋ฒ์ ์ ์๋ฏธํ๋ฉฐ GPLv3๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋ฉ๋๋ค.
์ฃผ์ ๊ฐ์ ์ฌํญ:
- Rails ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ง์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ Ruby ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ์ด๋์ ํฐ๋ธ์ ์ผํ์ผ๋ก Shopify ์ ์ ์๊ฑฐ๋ ํ๋ซํผ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์๋ก์ด ์คํ์ ํ๋ก์ธ์ค ๋ด JIT ์ปดํ์ผ๋ฌ์ธ YJIT๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ ์ฒด ๋ฉ์๋ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ C ์ธ์ด๋ก ์ธ๋ถ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด MJIT JIT ์ปดํ์ผ๋ฌ์์ ์ฃผ์ ์ฐจ์ด์ ์ YJIT๊ฐ LBBV(Lazy Basic Block Versioning)๋ฅผ ์ฌ์ฉํ๊ณ ํตํฉ JIT ์ปดํ์ผ๋ฌ๋ฅผ ํฌํจํ๋ค๋ ๊ฒ์ ๋๋ค. LBBV๋ฅผ ์ฌ์ฉํ๋ฉด JIT๋ ๋จผ์ ๋ฉ์๋์ ์์ ๋ถ๋ถ๋ง ์ปดํ์ผํ๊ณ ์คํ ์ค์ ์ฌ์ฉ๋๋ ๋ณ์ ๋ฐ ์ธ์ ์ ํ์ด ๊ฒฐ์ ๋ ํ ๋์ค์ ๋๋จธ์ง๋ฅผ ์ปดํ์ผํฉ๋๋ค. YJIT๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ผ์ค๋ฒค์น ํ ์คํธ๋ฅผ ์คํํ ๋ ์ฑ๋ฅ์ด 22% ์ฆ๊ฐํ๊ณ , ๋ฆฌํด๋ ๋ ๋๋ง ํ ์คํธ์์๋ 39% ์ฆ๊ฐํ ๊ฒ์ผ๋ก ๊ธฐ๋ก๋์์ต๋๋ค. YJIT๋ ํ์ฌ x86-64 ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ์์คํ ์์ Unix ๊ณ์ด OS์ ๋ํ ์ง์์ผ๋ก ์ ํ๋์ด ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค(ํ์ฑํํ๋ ค๋ฉด ๋ช ๋ น์ค์์ "--yjit" ํ๋๊ทธ๋ฅผ ์ง์ ํ์ธ์).
- ์ด์ MJIT JIT ์ปดํ์ผ๋ฌ์ ์ฑ๋ฅ์ด ํฅ์๋์์ต๋๋ค. Rails๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์ต๋ ์บ์ ํฌ๊ธฐ(--jit-max-cache)๊ฐ 100๊ฐ์์ 10000๊ฐ ๋ช ๋ น์ด๋ก ๋์ด๋ฌ์ต๋๋ค. ์ง์นจ์ด 1000๊ฐ๊ฐ ๋๋ ๋ฉ์๋์ JIT ์ฌ์ฉ์ ์ค์งํ์ต๋๋ค. Zeitwerk of Rails๋ฅผ ์ง์ํ๊ธฐ ์ํด TracePoint๊ฐ ํด๋์ค ์ด๋ฒคํธ์ ๋ํด ํ์ฑํ๋ ๊ฒฝ์ฐ JIT ์ฝ๋๊ฐ ๋ ์ด์ ์ญ์ ๋์ง ์์ต๋๋ค.
- ์ฌ๊ธฐ์๋ ์์ ํ ์ฌ์์ฑ๋ debug.gem ๋๋ฒ๊ฑฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ๋๋ฒ๊ฑฐ๋ ์๊ฒฉ ๋๋ฒ๊น
์ ์ง์ํ๊ณ , ๋๋ฒ๊น
๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋๋ฅผ ๋ฆ์ถ์ง ์์ผ๋ฉฐ, ๊ณ ๊ธ ๋๋ฒ๊น
์ธํฐํ์ด์ค(VSCode ๋ฐ Chrome)์์ ํตํฉ์ ์ง์ํ๊ณ , ๋ฉํฐ ์ค๋ ๋ ๋ฐ ๋ฉํฐ ํ๋ก์ธ์ค ์ ํ๋ฆฌ์ผ์ด์
๋๋ฒ๊น
์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ค์์ ์ ๊ณตํฉ๋๋ค. REPL ์ฝ๋ ์คํ ์ธํฐํ์ด์ค๋ ๊ณ ๊ธ ์ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์ฝ๋ ์กฐ๊ฐ์ ๊ธฐ๋กํ๊ณ ์ฌ์ํ ์ ์์ต๋๋ค. ์ด์ ์ ์ ๊ณต๋์๋ ๋๋ฒ๊ฑฐ lib/debug.rb๊ฐ ๊ธฐ๋ณธ ๋ฐฐํฌํ์์ ์ ๊ฑฐ๋์์ต๋๋ค.
- ์ฝ๋ฐฑ ์ถ์ ๋ณด๊ณ ์์์ ์ค๋ฅ๋ฅผ ์๊ฐ์ ์ผ๋ก ๊ฐ์กฐ ํ์ํ๋๋ก ๊ตฌํํ์ต๋๋ค. ์ค๋ฅ ํ๋๊ทธ ์ง์ ์ ๋ด์ฅ ๋ฐ ๊ธฐ๋ณธ ํ์ฑํ๋ gem ํจํค์ง error_highlight๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ณต๋ฉ๋๋ค. ์ค๋ฅ ํ๋๊ทธ ์ง์ ์ ๋นํ์ฑํํ๋ ค๋ฉด "--disable-error_highlight" ์ค์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. $ ๋ฃจ๋น ํ ์คํธ.rb test.rb:1:in " ": ์ ์๋์ง ์์ ๋ฉ์๋ "time" for 1:Integer(NoMethodError) 1.time {} ^^^^^ ๋ฌด์จ ๋ป์ธ๊ฐ์? ํ์์ค
- ๋ํํ ๊ณ์ฐ IRB(REPL, Read-Eval-Print-Loop)์ ์
ธ์ ์
๋ ฅํ ์ฝ๋์ ์๋ ์์ฑ์ ๊ตฌํํฉ๋๋ค(์
๋ ฅํ ๋ Tab ๋๋ Shift+๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ํ ์ ์๋ ๊ณ์ ์
๋ ฅ ์ต์
๊ณผ ํจ๊ป ํํธ๊ฐ ํ์๋จ). ํญ ํค). ๊ณ์ ์ต์
์ ์ ํํ๋ฉด ์ ํํ ํญ๋ชฉ๊ณผ ๊ด๋ จ๋ ๋ฌธ์๋ฅผ ํ์ํ๋ ๋ํ ์์๊ฐ ๊ทผ์ฒ์ ํ์๋ฉ๋๋ค. ์ ์ฒด ๋ฌธ์์ ์ก์ธ์คํ๋ ค๋ฉด ํค๋ณด๋ ๋จ์ถํค Alt+d๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด์ ์ธ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ ํธ์ถํ ๋ ํด์ ๋ฆฌํฐ๋ด ๋ฐ ํค์๋ ์ธ์์ ๊ฐ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด์ "{x: x, y: y}" ํํ์ ๋์ "{x:, y:}"๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ "foo(x: x, y: y)" ๋์ - foo( x:, y: )".
- ๋ ์ด์ ์คํ์ ์ด๋ผ๊ณ ํ์๋์ง ์๋ ๋จ์ผ ํ ํจํด ์ผ์น(ary => [x, y, z])์ ๋ํ ์ง์์ด ์์ ํ๋์์ต๋๋ค.
- ์ด์ ํจํด ์ผ์น์ "^" ์ฐ์ฐ์์ ์์์ ํํ์์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์: Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a #= > ? [[3, 5], [5, 7], [11, 13]]
- ํ ์ค ํจํด ์ผ์น์์๋ ๊ดํธ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค: [0, 1] => _, x {y: 2} => y: x #=> 1 y #=> 2
- ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ์ ์ฌ์ฉ๋ ์ ํ์ ๊ฒฐ์ ํ ์ ์๋ RBS ์ ํ ์ฃผ์ ์ธ์ด์๋ "<" ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ๋งค๊ฐ๋ณ์์ ์ํ์ ์ง์ ํ๋ ์ง์์ด ์ถ๊ฐ๋์๊ณ , ์ผ๋ฐ ์ ํ์ ๋ณ์นญ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ผ๋ฉฐ, ๋ณด์ ๊ด๋ฆฌ๋ฅผ ์ํ ์ปฌ๋ ์ , ์ฑ๋ฅ ํฅ์, ๋ด์ฅ ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ง์ ์๋ก์ด ์๋ช ๊ตฌํ.
- ๋ช ์์ ์ธ ์ ํ ์ ๋ณด ์์ด ์ฝ๋ ๋ถ์์ ๊ธฐ๋ฐ์ผ๋ก RBS ์ฃผ์์ ์์ฑํ๋ TypePro ์ ์ ์ ํ ๋ถ์๊ธฐ์ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ํ ์คํ์ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค(์๋ฅผ ๋ค์ด TypePro๋ฅผ VSCode ํธ์ง๊ธฐ์ ํตํฉํ๊ธฐ ์ํ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์ค๋น๋์์ต๋๋ค).
- ๋ณต์ ๊ณผ์ ์ฒ๋ฆฌ ์์๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด์ ์๋ "foo[0], bar[0] = baz, qux"๋ผ๋ ํํ์์ ๊ตฌ์ฑ ์์๊ฐ baz, qux, foo, bar ์์๋ก ์ฒ๋ฆฌ๋์์ง๋ง ์ด์ ๋ foo, bar, baz, qux ์์๋ก ์ฒ๋ฆฌ๋์์ต๋๋ค.
- VWA(๊ฐ๋ณ ๋๋น ํ ๋น) ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ํ ์คํ์ ์ง์์ ์ถ๊ฐํ์ต๋๋ค.
- ๋ด์ฅ๋ gem ๋ชจ๋๊ณผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋ ๋ชจ๋์ ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์ ๋๋ค. net-ftp, net-imap, net-pop, net-smtp, ๋งคํธ๋ฆญ์ค, ํ๋ผ์ ๋ฐ ๋๋ฒ๊ทธ ํจํค์ง๊ฐ ๋ด์ฅ๋์ด ์์ต๋๋ค.
์ถ์ฒ : opennet.ru