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

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

์ถœ์ฒ˜ : opennet.ru

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster