ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ ๋งค์ฐ โโํจ์จ์ ์ด๊ณ Perl, Java, Python, Smalltalk, ์ํ , Ada ๋ฐ Lisp์ ์ต๊ณ ์ ๊ธฐ๋ฅ์ ํตํฉํ ๋์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Ruby 3.1.0์ด ์ถ์๋์์ต๋๋ค. ํ๋ก์ ํธ ์ฝ๋๋ BSD(โ2-clause BSDLโ) ๋ฐ โRubyโ ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค. ์ด๋ GPL ๋ผ์ด์ ์ค์ ์ต์ ๋ฒ์ ์ ์๋ฏธํ๋ฉฐ GPLv3๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋ฉ๋๋ค.
์ฃผ์ ๊ฐ์ ์ฌํญ:
- ์๋ก์ด ์คํ์ ์ธํ๋ก์ธ์ค JIT ์ปดํ์ผ๋ฌ์ธ YJIT๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. Shopify ์ ์์๊ฑฐ๋ ํ๋ซํผ ๊ฐ๋ฐ์๋ค์ด Rails ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ Ruby ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ด๋์ ํฐ๋ธ์ ์ผํ์ผ๋ก ๊ฐ๋ฐํ ๊ฒ์ ๋๋ค. ์ ์ฒด ๋ฉ์๋ ์ฒ๋ฆฌ์ ๊ธฐ๋ฐํ๊ณ ์ธ๋ถ C ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด MJIT JIT ์ปดํ์ผ๋ฌ์์ ์ฃผ์ ์ฐจ์ด์ ์ YJIT๊ฐ ์ง์ฐ ๊ธฐ๋ณธ ๋ธ๋ก ๋ฒ์ ๊ด๋ฆฌ(LBBV)๋ฅผ ์ฌ์ฉํ๊ณ ํตํฉ JIT ์ปดํ์ผ๋ฌ๋ฅผ ํฌํจํ๋ค๋ ๊ฒ์ ๋๋ค. LBBV ๋๋ถ์ JIT๋ ์ฒ์์๋ ๋ฉ์๋์ ์์ ๋ถ๋ถ๋ง ์ปดํ์ผํ๊ณ , ์คํ ์ค์ ์ฌ์ฉ๋ ๋ณ์์ ์ธ์์ ์ ํ์ด ๊ฒฐ์ ๋ ํ ๋๋จธ์ง ๋ถ๋ถ์ ์ปดํ์ผํฉ๋๋ค. YJIT๋ฅผ ์ฌ์ฉํ ๋ railsbench ํ ์คํธ ์คํ ์ ์ฑ๋ฅ์ด 22%, liquid-render ํ ์คํธ ์คํ ์ ์ฑ๋ฅ์ด 39% ํฅ์๋์์ต๋๋ค. YJIT๋ ํ์ฌ x86-64 ์์คํ ์์ Unix ๊ณ์ด OS ์ง์์ผ๋ก ์ ํ๋์ด ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค(ํ์ฑํํ๋ ค๋ฉด ๋ช ๋ น์ค์ "--yjit" ํ๋๊ทธ๋ฅผ ์ง์ ํ์ธ์).
- ๊ธฐ์กด MJIT JIT ์ปดํ์ผ๋ฌ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋์์ต๋๋ค. Rails ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ์ต๋ ์บ์ ํฌ๊ธฐ(--jit-max-cache)๋ฅผ 100๊ฐ์์ 10000๊ฐ ๋ช ๋ น์ด๋ก ๋๋ ธ์ต๋๋ค. 1000๊ฐ๊ฐ ๋๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฉ์๋์ JIT๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค. Rails์ Zeitwerk๋ฅผ ์ง์ํ๊ธฐ ์ํด ํด๋์ค ์ด๋ฒคํธ์ TracePoint๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ JIT์์ ์์ฑ๋ ์ฝ๋๊ฐ ๋ ์ด์ ์ญ์ ๋์ง ์์ต๋๋ค.
- ์ด ํจํค์ง์๋ ์์ ํ ์ฌ์์ฑ๋ ๋๋ฒ๊ฑฐ์ธ debug.gem์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด ๋๋ฒ๊ฑฐ๋ ์๊ฒฉ ๋๋ฒ๊น
์ ์ง์ํ๊ณ , ๋๋ฒ๊น
๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋๋ฅผ ์ ํ์ํค์ง ์์ผ๋ฉฐ, ๊ณ ๊ธ ๋๋ฒ๊น
์ธํฐํ์ด์ค(VSCode ๋ฐ Chrome)์์ ํตํฉ์ ์ง์ํ๊ณ , ๋ค์ค ์ค๋ ๋ ๋ฐ ๋ค์ค ํ๋ก์ธ์ค ์ ํ๋ฆฌ์ผ์ด์
๋๋ฒ๊น
์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, REPL ์ฝ๋ ์คํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ , ๊ณ ๊ธ ์ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ฝ๋ ์กฐ๊ฐ์ ๊ธฐ๋กํ๊ณ ์ฌ์ํ ์ ์์ต๋๋ค. ์ด์ ์ ์ ๊ณต๋์๋ ๋๋ฒ๊ฑฐ์ธ lib/debug.rb๋ ๊ธฐ๋ณธ ํจํค์ง์์ ์ ๊ฑฐ๋์์ต๋๋ค.

- ์ฝ๋ฐฑ ์ถ์ ๋ณด๊ณ ์์์ ์๊ฐ์ ์ค๋ฅ ๊ฐ์กฐ ํ์ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์์ต๋๋ค. ์ค๋ฅ ๊ฐ์กฐ ํ์๋ ๋ด์ฅ๋ error_highlight ์ ฌ์์ ์ ๊ณต๋๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ต๋๋ค. ์ค๋ฅ ๊ฐ์กฐ ํ์๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด "--disable-error_highlight" ์ค์ ์ ์ฌ์ฉํ์ธ์. $ ruby โโโโtest.rb test.rb:1:in ยซ ": 1:Integer (NoMethodError) 1.time {}์ ๋ํ ์ ์๋์ง ์์ ๋ฉ์๋ "time" ^^^^^ ๋ฌด์์ ๋ง์ํ์ จ๋์? times
- ๋ํํ ์ปดํจํ
์
ธ IRB(REPL, Read-Eval-Print-Loop)๋ ์
๋ ฅ๋ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. ์
๋ ฅํ๋ ๋์ ์
๋ ฅ์ ๊ณ์ํ ์ ์๋ ํํธ๊ฐ ํ์๋๋ฉฐ, Tab ํค ๋๋ Shift+Tab ํค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํํธ์ ํํธ โโ์ฌ์ด๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๊ณ์ ์ต์
์ ์ ํํ๋ฉด ํด๋น ์ต์
์์ ๋ํ ์์๊ฐ ๋ํ๋๊ณ , ์ ํํ ์์์ ๊ด๋ จ๋ ์ค๋ช
์๊ฐ ํ์๋ฉ๋๋ค. ์ ์ฒด ์ค๋ช
์๋ฅผ ๋ณด๋ ค๋ฉด ํค๋ณด๋ ๋จ์ถํค 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, matrix, prime, debug์ ๋๋ค.
์ถ์ฒ : opennet.ru


