Ruby ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด 3.1 ๋ฆด๋ฆฌ์Šค

ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์— ๋งค์šฐ โ€‹โ€‹ํšจ์œจ์ ์ด๊ณ  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๊ฐ€ ๊ธฐ๋ณธ ๋ฐฐํฌํŒ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    Ruby ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด 3.1 ๋ฆด๋ฆฌ์Šค
  • ์ฝœ๋ฐฑ ์ถ”์  ๋ณด๊ณ ์„œ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ํ”Œ๋ž˜๊ทธ ์ง€์ •์€ ๋‚ด์žฅ ๋ฐ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋œ 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๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    Ruby ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด 3.1 ๋ฆด๋ฆฌ์Šค
  • ์ด์ œ ์–ธ์–ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•ด์‹œ ๋ฆฌํ„ฐ๋Ÿด ๋ฐ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜์˜ ๊ฐ’์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ œ "{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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€