Julia: ์ข…์† ํ•จ์ˆ˜์˜ ์ž๋™ ์žฌ ์ปดํŒŒ์ผ

์— ๋งŒ๋“  2011๋…„ 11์›” 26์ผ  ยท  55์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

d2๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  d2๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” d1 ํ•จ์ˆ˜ ์•ž์— d2 ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด d1์€ d2์— ๋Œ€ํ•œ ์ด์ „ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ชจ๋‘ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์–ด์•ผํ• ๊นŒ์š”? ์•„๋‹ˆ๋ฉด ์ด์ „ ์ •์˜๋ฅผ longjmp๋กœ ์ƒˆ ์ •์˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
(ํ•ญ์ƒ ์ „์ฒด ๋ถ€ํ•˜๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— REPL์— ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค)

julia> function d2()
       a
       end

julia> function d()
         d2()
       end

julia> d()
in d: a not defined

julia> function d2()
       b=2
       end

julia> d()
in d: a not defined

julia> d2
Methods for generic function d2
d2() at prompt:2

julia> function d()
         d2()
       end

julia> d()
2

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์™€. ์ •๋ง ๋ฉ‹์ง„ ์ˆœ๊ฐ„์ž…๋‹ˆ๋‹ค!

๋ชจ๋“  55 ๋Œ“๊ธ€

ํ•จ์ˆ˜๊ฐ€ ์ •์˜ ๋  ๋•Œ d2() ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์–ด d() ๋ฉ”์„œ๋“œ๊ฐ€ ์ด๋•Œ ํ•ด๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด d2() ๋Š” ์›๋ž˜ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ์ •์˜ ๋œ๋Œ€๋กœ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” d() ์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์ด์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ •์˜ํ•˜์ง€๋งŒ์ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋งค๋‰ด์–ผ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€๋งŒ, ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์šด ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :-/

์•„๋ฌด๋„ ์ด๊ฒƒ์„ ๋ˆˆ์น˜ ์ฑ„์ง€ ๋ชปํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž์ง€๋งŒ ๊ทธ๊ฒƒ์€ ํ˜„์‹ค์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ์žฌ๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ž‘์—…์ค‘์ธ JIT๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> function f2()
       a
       end

julia> function f1()
       f2()
       end

julia> function f2()
       2
       end

julia> f1()
2

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์ด REPL์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์‹ค์ œ๋กœ๋Š” ๋ชจ๋ฅด์ง€๋งŒ. ๊ทน์ ์ธ ๋ฐฉ์‹์˜ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋‚ด๋ถ€ ๋ฐฉ์ •์‹์ด๋‚˜ ์ƒ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๋ณด๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๋ฉ”์†Œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ˆ˜์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์œ„์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ๊ฐ€ ํ•จ์ˆ˜๋กœ ๋ช…์‹œ ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์œ„์น˜ (call / ret)
  • ๋ฉ”์„œ๋“œ๊ฐ€ ์ธ๋ผ์ธ ๋œ ์žฅ์†Œ

์ „์ž๋Š” ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ž๋ฆฌ์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ ์œ„์น˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ด์ „ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์ ํ”„ํ•˜๋Š” ์Šคํ…์œผ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , ์„ ํƒ์ ์œผ๋กœ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ธ์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธ ํ•œ ํ˜ธ์ถœ์ž๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋‹ค์‹œ JITํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์ผ์€ ์ฝ”๋“œ๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ธ๋ผ์ธ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€๊ฒฝ ๋  ์ˆ˜์žˆ๋Š” ์œ ํ˜• ๋™์ž‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ๋Œ€ํ™” ํ˜• ์ผ€์ด์Šค๋ฅผ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
47 ๋ฒˆ ๋ฌธ์ œ์™€ ๋™์ผํ•œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Bummer. ์Œ, ์˜ํ–ฅ์„๋ฐ›๋Š” ๊ฒƒ์€ ์ฃผ๋กœ repl์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ณ์€ ์ผ์„ ์ฒœ์ฒœํžˆํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ์ด๊ฒƒ์€ ๊ฑฐ์˜ ์‹œ์ž‘๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ ๋Œ€ํ™”์‹์„ ์ œ์™ธํ•˜๊ณ  ๋‹ค์‹œ ์ •์˜ํ• ๊นŒ์š”? ์†”๋ฃจ์…˜์ด ๊ฒฐ๊ตญ ๋งŽ์€ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ ์ž๋™์œผ๋กœ repl์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ํ˜„์žฌ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด ๊ฒฐ๊ณผ ๋™์ž‘์ด ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Julia๋Š” ํ˜„์žฌํ•˜๋Š” ์ผ์„ ํฌํ•จํ•˜์—ฌ ์›ํ•˜๋Š”๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์žฌ์ •์˜์‹œ ์ž˜ ์ •์˜ ๋œ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ ์ˆ˜์ •์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์—์„œ ์ž˜ ์ •์˜ ๋œ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด v1.0 ๋ฌธ์ œ๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํšจํ•œ v1.0 ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  v1.1์—์„œ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apple์˜ LLVM / LLDB ์ง์›์˜ Greg Clayton์€ ํฌํ•จ ๋œ ๊ธฐํ˜ธ ์ •๋ณด (๊ธฐํ˜ธ ๊ฐ€์ ธ ์˜ค๊ธฐ)์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ข…์†์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋„์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• (lldb ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, llvm์˜ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ)์„ ๋ฌธ์„œํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์นœ์ ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋‚ด ๋ณด๋‚ธ ์‹ฌ๋ณผ (์ „์ฒด ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•จ)๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ์ œ์ด์Šจ

2012 ๋…„ 3 ์›” 31 ์ผ ์˜คํ›„ 11:02์— Jason E. Aten์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

LLDB ์• ํ˜ธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„,

lldb ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ œ ๋‘ ๊ฐœ์˜ ๊ธฐํ˜ธ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” OSX์—์„œ ์‹คํ–‰์ค‘์ธ ํŠน์ • ์ฝ”๋“œ๋ฅผ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. (dyldinfo -lazy_bind -exports); ์ฆ‰, ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ณต์œ  ๊ฐ์ฒด ๋˜๋Š” ๋ฒˆ๋“ค์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด ๋ณด๋‚ธ ์‹ฌ๋ณผ์„ ๋‚˜์—ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํฌ๋ง์€ lldb ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OSX์—์„œ Linux์™€ ๋™์ผํ•œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. (๋ฆฌ๋ˆ…์Šค ๋ฒ„์ „์˜ ์ฝ”๋“œ๋Š” ํ˜„์žฌ libbfd์™€ libdld๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๋‚˜์ค‘์—๋Š” ๊ฑฐ์˜ ์‚ฌ๋ž‘ / ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

lldb๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋™์ผํ•œ ์ •๋ณด (๊ฐ€์ ธ์˜จ ์‹ฌ๋ณผ ๋ชฉ๋ก ๋ฐ Mach-O ํŒŒ์ผ์— ๋Œ€ํ•œ ๋‚ด ๋ณด๋‚ธ ์‹ฌ๋ณผ ๋ชฉ๋ก)๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ include / lldb /๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์ง€๋งŒ ์–ด๋–ค API๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. lldb์˜ ์˜ˆ์ œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ œ์•ˆ / ํฌ์ธํ„ฐ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ œ์ด์Šจ

dyldinfo๊ฐ€ ๋ฌด์—‡์„ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ๊ธฐํ˜ธ ์ด๋ฆ„ ๋งŒ ํ•„์š”ํ•˜๋ฉฐ ์ฃผ์†Œ ๋‚˜ ์„ธ๊ทธ๋จผํŠธ ๋˜๋Š” ์„น์…˜์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

$ ํŒŒ์ผ / tmp / sample_bundle
/ tmp / sample_bundle : Mach-O 64 ๋น„ํŠธ ๋ฒˆ๋“ค x86_64

$ dyldinfo -lazy_bind -export / tmp / sample_bundle

์ง€์—ฐ ๋ฐ”์ธ๋”ฉ ์ •๋ณด (dyld ์ •๋ณด์˜ lazy_bind ๋ถ€๋ถ„์—์„œ) :
์„ธ๊ทธ๋จผํŠธ ์„น์…˜ ์ฃผ์†Œ ์ธ๋ฑ์Šค dylib ๊ธฐํ˜ธ
__DATA __la_symbol_ptr 0x00001030 0x0000 ํ”Œ๋žซ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค __mm_pop_chunk
__DATA __la_symbol_ptr 0x00001038 0x0015 ํ”Œ๋žซ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค _dh_define
์ •๋ณด ๋‚ด๋ณด๋‚ด๊ธฐ (trie์—์„œ) :
0x000008A0 _C_ipair
0x00000920 _init_ipair
0x00000BC0 _C_iprot
0x00000C40 _C_ipi2
0x00000CC0 _C_ipi1
0x00001040 _K_ipair_R43808f40
0x00001160 _K_ipi1_R5cb4475d
0x00001260 _K_ipi2_R5cb4475d
0x00001360 _K_iprot_Rfc8fe739
0x00001460 _majver_ipair
0x00001464 _minver_ipair

2012 ๋…„ 4 ์›” 2 ์ผ ์›”์š”์ผ ์˜คํ›„ 3:13์— Greg Clayton [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Yes you can do this with LLDB. If you load a binary and dump its symbol table, you will see the information you want. For symbols that are lazily bound, you can look for "Trampoline" symbols:

cd lldb/test/lang/objc/foundation
make
lldb a.out
(lldb) target modules dump symtab a.out
Symtab, file = .../lldb/test/lang/objc/foundation/a.out, num_symbols = 54:
              Debug symbol
              |Synthetic symbol
              ||Externally Visible
              |||
Index   UserID DSX Type         File Address/Value Load Address       Size               Flags      Name
------- ------ --- ------------ ------------------ ------------------ ------------------ ---------- ----------------------------------
[    0]      0 D   SourceFile   0x0000000000000000                    Sibling -> [   15] 0x00640000 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.m
[    1]      2 D   ObjectFile   0x000000004f79f1ca                    0x0000000000000000 0x00660001 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.o
[    2]      4 D   Code         0x00000001000010f0                    0x00000000000000c0 0x000e0000 -[MyString initWithNSString:]
[    3]      8 D   Code         0x00000001000011b0                    0x0000000000000090 0x000e0000 -[MyString dealloc]
[    4]     12 D   Code         0x0000000100001240                    0x00000000000000a0 0x000e0000 -[MyString description]
[    5]     16 D   Code         0x00000001000012e0                    0x0000000000000020 0x000e0000 -[MyString descriptionPauses]
[    6]     20 D   Code         0x0000000100001300                    0x0000000000000030 0x000e0000 -[MyString setDescriptionPauses:]
[    7]     24 D   Code         0x0000000100001330                    0x0000000000000030 0x000e0000 -[MyString str_property]
[    8]     28 D   Code         0x0000000100001360                    0x0000000000000050 0x000e0000 -[MyString setStr_property:]
[    9]     32 D   Code         0x00000001000013b0                    0x0000000000000040 0x000f0000 Test_Selector
[   10]     36 D   Code         0x00000001000013f0                    0x0000000000000130 0x000f0000 Test_NSString
[   11]     40 D   Code         0x0000000100001520                    0x0000000000000120 0x000f0000 Test_MyString
[   12]     44 D   Code         0x0000000100001640                    0x00000000000001b0 0x000f0000 Test_NSArray
[   13]     48 D   Code         0x00000001000017f0                    0x00000000000000e1 0x000f0000 main
[   14]     56 D X Data         0x0000000100002680                    0x0000000000000000 0x00200000 my_global_str
[   15]     58 D   SourceFile   0x0000000000000000                    Sibling -> [   19] 0x00640000 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.m
[   16]     60 D   ObjectFile   0x000000004f79f1ca                    0x0000000000000000 0x00660001 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.o
[   17]     62 D   Code         0x00000001000018e0                    0x0000000000000020 0x000e0000 -[MyBase propertyMovesThings]
[   18]     66 D   Code         0x0000000100001900                    0x000000000000001f 0x000e0000 -[MyBase setPropertyMovesThings:]
[   19]     82     Data         0x0000000100002000                    0x0000000000000460 0x000e0000 pvars
[   20]     83     ObjCIVar     0x0000000100002518                    0x0000000000000148 0x001e0000 MyBase.propertyMovesThings
[   21]     84   X Data         0x0000000100002660                    0x0000000000000008 0x000f0000 NXArgc
[   22]     85   X Data         0x0000000100002668                    0x0000000000000008 0x000f0000 NXArgv
[   23]     86   X ObjCClass    0x00000001000024d8                    0x0000000000000028 0x000f0000 MyBase
[   24]     87   X ObjCClass    0x0000000100002460                    0x0000000000000028 0x000f0000 MyString
[   25]     88   X ObjCIVar     0x0000000100002510                    0x0000000000000008 0x000f0000 MyString._desc_pauses
[   26]     89   X ObjCIVar     0x0000000100002508                    0x0000000000000008 0x000f0000 MyString.date
[   27]     90   X ObjCIVar     0x0000000100002500                    0x0000000000000008 0x000f0000 MyString.str
[   28]     91   X ObjCMetaClass 0x00000001000024b0                    0x0000000000000028 0x000f0000 MyBase
[   29]     92   X ObjCMetaClass 0x0000000100002488                    0x0000000000000028 0x000f0000 MyString
[   30]     97   X Data         0x0000000100002678                    0x0000000000000008 0x000f0000 __progname
[   31]     98   X Data         0x0000000100000000                    0x00000000000010b0 0x000f0010 _mh_execute_header
[   32]     99   X Data         0x0000000100002670                    0x0000000000000008 0x000f0000 environ
[   33]    101   X Data         0x0000000100002680                    0x0000000000000000 0x000f0000 my_global_str
[   34]    102   X Code         0x00000001000010b0                    0x0000000000000040 0x000f0000 start
[   35]    103     Trampoline   0x0000000100001938                    0x0000000000000006 0x00010200 NSLog
[   36]    104   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_CLASS_$_NSArray
[   37]    105   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010200 OBJC_CLASS_$_NSAutoreleasePool
[   38]    106   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_CLASS_$_NSDate
[   39]    107   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_CLASS_$_NSObject
[   40]    108   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010200 OBJC_CLASS_$_NSString
[   41]    109   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_METACLASS_$_NSObject
[   42]    110   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 __CFConstantStringClassReference
[   43]    111   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010100 _objc_empty_cache
[   44]    112   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010100 _objc_empty_vtable
[   45]    113     Trampoline   0x000000010000193e                    0x0000000000000006 0x00010300 exit
[   46]    114     Trampoline   0x0000000100001920                    0x0000000000000006 0x00010100 objc_getProperty
[   47]    115     Trampoline   0x0000000100001926                    0x0000000000000006 0x00010100 objc_msgSend
[   48]    116     Trampoline   0x000000010000192c                    0x0000000000000006 0x00010100 objc_msgSendSuper2
[   49]    117   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010100 objc_msgSend_fixup
[   50]    118     Trampoline   0x0000000100001932                    0x0000000000000006 0x00010100 objc_setProperty
[   51]    119     Trampoline   0x0000000100001944                    0x0000000000000006 0x00010300 printf
[   52]    120     Trampoline   0x000000010000194a                    0x0000000000000006 0x00010300 usleep
[   53]    121   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010300 dyld_stub_binder
(lldb)


All lazily bound symbols will have type Trampoline:

[   45]    113     Trampoline   0x000000010000193e                    0x0000000000000006 0x00010300 exit
[   46]    114     Trampoline   0x0000000100001920                    0x0000000000000006 0x00010100 objc_getProperty
[   47]    115     Trampoline   0x0000000100001926                    0x0000000000000006 0x00010100 objc_msgSend
[   48]    116     Trampoline   0x000000010000192c                    0x0000000000000006 0x00010100 objc_msgSendSuper2
[   50]    118     Trampoline   0x0000000100001932                    0x0000000000000006 0x00010100 objc_setProperty
[   51]    119     Trampoline   0x0000000100001944                    0x0000000000000006 0x00010300 printf
[   52]    120     Trampoline   0x000000010000194a                    0x0000000000000006 0x00010300 usleep

The other symbols that are exernal are marked with an "X" (which is a boolean flag on each symbol).

The symbols can be accessed via the SBModule:

   size_t
   SBModule::GetNumSymbols ();

   lldb::SBSymbol
   SBModule::GetSymbolAtIndex (size_t idx);

And then you can get the symbol type from each SBSymbol:

   SymbolType
   SBSymbol::GetType ();


I just added the ability to see if a symbol is externally visible:
% svn commit
Sending        include/lldb/API/SBSymbol.h
Sending        scripts/Python/interface/SBSymbol.i
Sending        source/API/SBSymbol.cpp
Transmitting file data ...
Committed revision 153893.


   bool
   SBSymbol::IsExternal();


So your flow should be:

SBDebugger::Initialize();
SBDebugger debugger(SBDebugger::Create());
SBTarget target (debugger.CreateTarget (const char *filename,
                                       const char *target_triple,
                                       const char *platform_name,
                                       bool add_dependent_modules,
                                       lldb::SBError& error));

SBFileSpec exe_file_spec (filename);
SBModule exe_module (target.FindModule(exe_file_spec));
if (exe_module.IsValid()
{
   const size_t num_symbols = exe_module. GetNumSymbols();
   for (size_t i=0; i<num_symbols; ++i)
   {
       SBSymbol symbol (exe_module. GetSymbolAtIndex(i));
       if (symbol.IsExternal())
       {
       }

       if (symbol.GetType() == lldb::eSymbolTypeTrampoline)
       {
       }
   }
}




> _______________________________________________
> lldb-dev mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

2012 ๋…„ 4 ์›” 2 ์ผ ์›”์š”์ผ ์˜คํ›„ 4:05์— Greg Clayton [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

A quick clarification on the args to CreateTarget:

"filename" is just a full path to the local object file you want to observer. "target_triple" is your <arch>-<vendor>-<os>, or something like "x86_64-apple-darwin" or "i386-pc-linux" and can be NULL if the file is only a single architecture. "platform_name" can be NULL. "add_dependent_modules" should be false, since you are only interested in seeing the one object file itself, an SBError instance  should be created and passed in.

๊ฐœ๋ฐœ์ž ๋ชฉ๋ก ํ† ๋ก  : https://groups.google.com/forum/?fromgroups=#!topic/julia -dev / snnGKJul4vg.

์ด๊ฒƒ์€ ๋†€๋ž๋„๋ก ์˜ค๋ž˜๋œ ์Šค๋ ˆ๋“œ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ฝ”๋“œ ์†๋„ ๋ฒค์น˜๋งˆํ‚น ์ฝ”๋“œ ๋กœ์ด ๋ฌธ์ œ์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์œ ํ˜นํ•˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. listTests() ๋ฐ runTests() ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ ๋œ Core.include() ํŒŒ์ผ์„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ listTests() ๋ฐ runTests() ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ ๋ฒค์น˜ ๋งˆํฌ ํŒŒ์ผ์„๋กœ๋“œ ํ•  ๋•Œ๋งˆ๋‹ค ์žฌ์ •์˜ ํ•œ ๋‹ค์Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. 2 ๋‹จ๊ณ„ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•œ "API"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„๋กœ๋“œํ•˜๋Š” ๋ฐ ๋‚˜์œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ?

๋ชจ๋“ˆ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž ๋ชฉ๋ก์—์„œ๋„ ์ œ๊ธฐ ๋œ ์ต๋ช… ๋ชจ๋“ˆ ๋ฌธ์ œ์™€ ์ถฉ๋Œํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ผํ•œ ๋ชจ๋“ˆ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ •์˜ํ•˜๊ณ  ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์˜ค๋ž˜๋œ ์Šค๋ ˆ๋“œ์ด์ง€๋งŒ ๊ทธ ์–ด๋Š ๋•Œ๋ณด ๋‹ค ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ evalfile ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ์ผ์— ํ•จ์ˆ˜ ํŠœํ”Œ์„ "๋ฐ˜ํ™˜"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ต๋ช… ๋ชจ๋“ˆ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค : https://github.com/JuliaLang/julia/issues/3661.

๋ˆ„๊ตฌ๋“ ์ง€ ๊ตฌํ˜„ ์ „๋žต์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” (์ตœ์ ํ™”๋˜์ง€ ์•Š์€ AST๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ) ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฐ˜์ „ ๋œ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฒด๊ณ„๋ฅผ ์ฝ”๋”ฉํ•˜๋ ค๊ณ  ์ƒ๊ฐํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žฌ์ •์˜ ๋  ๋•Œ ํ•ด๋‹น ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žฌ์ •์˜ ๋œ ๊ฐ ํ•จ์ˆ˜์˜ ํ•˜์œ„ ํ•ญ๋ชฉ์˜ ์ปดํŒŒ์ผ ๋œ ๋ฒ„์ „์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‹œ๋„ํ• ๋งŒํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜์š•์ด ์žˆ๋‹ค๋ฉด, ๊ณ„์†ํ•ด์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ด…์‹œ๋‹ค!

์ˆ˜์‹ ์ž์˜ _execution_์ด ํ˜ธ์ถœ์ž์˜ ์žฌ ์ปดํŒŒ์ผ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด REPL์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋„˜์–ด์„œ๋Š” ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋’ค๋Šฆ๊ฒŒ ๊นจ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌป์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ถ๊ทน์  ์ธ ๋Œ€๋‹ต, ์ฆ‰ ํšจ์œจ์ ์ธ "๋‹จ๊ณ„์ "๊ธฐ๋Šฅ์„ ์ƒ์„ฑ ํ•  ์ˆ˜์žˆ๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„์œ„ํ•œ ๋ฐฐ๊ฒฝ : ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์˜ํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ํŠนํžˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ๋ถ€ ์ธก๋ฉด์ด ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์ž…๋ ฅ ์œ ํ˜•์— ์˜์กดํ•˜๋Š” ๊ธฐ๋Šฅ ---- ํ‘œ์ค€ ์˜ˆ๋Š” ์ˆซ์ž๊ฐ€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์˜ ๋ฃจํ”„ ์ˆ˜๋Š” ๋ฐฐ์—ด์˜ ์ฐจ์›๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฐจ์› 1๊ณผ 2์— ๋Œ€ํ•ด ๋ช…์‹œ ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ž˜ํผ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_method_cache = Dict()
function myfunction(A::AbstractArray)
    N = ndims(A)
    if !haskey(_method_cache, N)
        func = eval(<an expression that generates the function definition for N dimensions>)
        _method_cache[N] = func
    else
        func = _method_cache[N]
    end
    return func(A)
end

๋”ฐ๋ผ์„œ ์ฒ˜์Œ myfunction ๊ฐ€ 4 ์ฐจ์› ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์‹คํ–‰๋˜๋ฉด ๋จผ์ € 4 ์ฐจ์›์— ํŠน์ •ํ•œ ๋ฒ„์ „์„ ์ •์˜ํ•˜๊ณ  _method_cache ์— ์ถ”๊ฐ€ ํ•œ ๋‹ค์Œ ์ž…๋ ฅ์—์„œ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 4 ์ฐจ์› ๋ฐฐ์—ด๋กœ myfunction ์— ๋Œ€ํ•œ ํ–ฅํ›„ ํ˜ธ์ถœ์‹œ ์‚ฌ์ „์—์„œ ์ •์˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. _method_cache ๋Š” Julia ์ž์‹ ์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ ํ…Œ์ด๋ธ”๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ์ด ํŠน์ • ํ•จ์ˆ˜์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ผ์ข…์˜ "๊ทธ๋ฆผ์ž ๋ฉ”์„œ๋“œ ํ…Œ์ด๋ธ”"์ž…๋‹ˆ๋‹ค. (๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ let ์บก์Šํ™”๋ฉ๋‹ˆ๋‹ค.)

์ด ์˜ˆ์ œ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์‚ฌ์ „ ์กฐํšŒ์— ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ์งง์€ ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŠนํžˆ ์›ํ•˜๋Š” ํ•จ์ˆ˜์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function myfunction(A::AbstractArray)
    bodyexpr = <an expression for the body of the function specific for N dimensions>
    f = <strong i="17">@eval</strong> begin
        function myfunction(A::$(typeof(A)))
            $bodyexpr
        end
    end
    return f(A)
end

์—ฌ๊ธฐ์„œ myfunction myfunction ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํŠน์ • ์ž…๋ ฅ ์œ ํ˜•์— ๋Œ€ํ•ด

ํ˜„์žฌ ์ด๊ฒƒ์€ ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ myfunction ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์ •์˜์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ์ด ํŠน์ • ํ˜ธ์ถœ์ž๋Š” ํ•ญ์ƒ myfunction ์‚ฌ์šฉํ•˜์—ฌ eval myfunction ์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŠธ๋ฆญ์€ ํ˜ธ์ถœ์ž๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ _ ๋ฐœ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค _. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?

# 5395๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‹ค์ œ๋กœ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์ง€๋งŒ ์œ ์‚ฌํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ถ”์ƒ ์œ ํ˜•๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘ํžˆ ์—ฌ๊ธฐ๋‹ค:

abstract A
immutable B <: A; end
immutable C <: A; end

g(x::Vector{A}) = f(x[1])

f(::B) = 1
g(A[B()])

f(::C) = 0.5
g(A[C()])

๋งˆ์ง€๋ง‰ ์ค„์€ 4602678819172646912 ์ž…๋‹ˆ๋‹ค. f(::A) ๋Œ€ํ•œ ์œ ํ˜• ์ถ”๋ก ์ด ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— g ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฒ„๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์•„์ฃผ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ๋ฐฉ๋ฒ•์€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ •์˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํ™ฉ์€ ์™ ์ง€ ๋ชจํ˜ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

f() = x()
x() = 1
println(f())
x() = 2
println(f())

์ค€๋‹ค

1

๋™์•ˆ

g() = y()
precompile(g, ())
y() = 1
println(g())
y() = 2
println(g())

์ค€๋‹ค

2

๋‚˜์ค‘์˜ ๊ฒฝ์šฐ๋Š” ํ˜ธ์ถœ์ž ์žฌ ์ปดํŒŒ์ผ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ์žฌ ์ปดํŒŒ์ผ์ด ์•„๋‹˜์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

์–ด๋ฆฌ์„์€ ๋ง์„ ํ•  ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค์ง€๋งŒ,์ด ๋ฌธ์ œ๋Š” ํ•œ ๋‹จ๊ณ„์˜ ๊ฐ„์ ‘์  ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์„๊นŒ์š”? ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๊ณ ์ • ๋œ ์œ„์น˜์—์„œ ์ฐพ์•„์„œ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ C ++ ๋˜๋Š” Java ๊ฐ€์ƒ ๊ธฐ๋Šฅ๊ณผ ์œ ์‚ฌํ•œ ์„ฑ๋Šฅ์„ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ •์  ๋˜๋Š” ๋™์  ์ฃผ์†Œ๋ฅผ ๊ฐ–๋„๋ก ํ•จ์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ •์  ์ฃผ์†Œ๋กœ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ณ ํ•˜๋ฉด ๊ฒฝ๊ณ  / ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๋™์ž‘์„ ์„ค์ •ํ•˜๋Š” ์Šค์œ„์น˜๊ฐ€์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ธ์–ด์— ์ต์ˆ™ํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์™„์ „ํžˆ ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋“ค๋ฆฌ๋ฉด ์žฝ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ omer4d ๊ทธ ์•„์ด๋””์–ด์˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” Julia๊ฐ€ ๋งŽ์€ ์ž‘์€ ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  "์ข…์† ํ•ญ๋ชฉ"์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

C ++์ฒ˜๋Ÿผ ์ •์  ์ฃผ์†Œ๋กœ๋งŒ ์ธ๋ผ์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถˆํŽธ์„ ์•ผ๊ธฐํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ๋™์ž‘์€ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ •์  ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€ํ™” ํ˜• ๊ฐœ๋ฐœ์— ๊ด€์‹ฌ์ด์—†๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ „ํ˜€ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์„ฑ๋Šฅ์— ๊ด€์‹ฌ์ด ์—†์ง€๋งŒ ๋Œ€ํ™” ํ˜• ๊ฐœ๋ฐœ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋Šฅ ์ฃผ์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒํ˜ธ ์ž‘์šฉ๊ณผ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๊ด€๋ จ ํ•จ์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋งŽ์€ ์ž‘์—…์ด ์•„๋‹ˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ธ์€ ๋งŽ์ด ํ˜ธ์ถœ๋˜๋Š” ์งง์€ ์ €์ˆ˜์ค€ ํ•จ์ˆ˜์—๋งŒ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์•„๋งˆ๋„ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋ชจ๋“ˆ๋ณ„๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €,
์ฃผ์„์€ ์ •๋ง ๊ท€์ฐฎ์€ ์ผ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ํ•ดํ‚น์ด ํ•„์š”ํ•  ๋•Œ
์ด์™€ ๊ฐ™์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด. ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ 2๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ
๋˜๋Š” 3 ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํฌ๊ฒŒ ์Œ“์ด๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ,
ํ•จ์ˆ˜์— ์ ํ•ฉํ•œ ์ฃผ์„์„ ์„ ํƒํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์—†๋‹ค
์ธ๋ผ์ธ์„ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€
๋Œ€ํ™”์‹์œผ๋กœ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์…‹์งธ, ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ์œ ํ˜• ๊ณต์ œ
๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋‹จ์ง€ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ
์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ ์€ ์œ ํ˜• ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์—ฌ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ˆ˜์‹ญ ๊ฐœ์˜ ํ•œ์ •์–ด ํ‚ค์›Œ๋“œ์™€ ๋ฐ˜๋ณต์  ์ธ ์ˆ˜๋™ ์žฌ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์–ธ์–ด๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ, ๋•Œ๋•Œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ•œ๋‘ ๊ฐœ ํ•œ์ •ํ•˜๊ณ  ๋ช‡์ฃผ๊ธฐ์˜ ๋Œ€ํ™” ํ˜• ๊ฐœ๋ฐœ ํ›„์— ์žฌ ์ปดํŒŒ์ผํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. . ๊ทธ๋ž˜๋„ ์„ธ ๋ฒˆ์งธ ์š”์ ์„ ๋‹ค๋ฃฐ ์ˆ˜๋Š” ์—†์œผ๋‹ˆ ๋ฌผ๋Ÿฌ๋‚˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์žฌ ์ปดํŒŒ์ผ์€ ์ˆ˜์ • ๋œ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์— ๊ฒŒ์ž„์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฃจํ”„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์†”๋ฃจ์…˜์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. = (

@JeffBezanson ์ ์–ด๋„ ์ฒ˜์Œ์—๋Š” ์‰ฌ์šด ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ด€์‹ฌ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. eval ํ†ตํ•ด ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ (์˜ˆ : REPL ํ”„๋กฌํ”„ํŠธ์—์„œ ์ž…๋ ฅ)๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์‹คํ–‰์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š”๋งŒํผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์žฌ์ •์˜ ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” display ์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ ์ง„์  ์ปดํŒŒ์ผ์„ํ•˜๋Š” ๋ฐ ๋น ๋ฅด๊ฒŒ ๊ฐ€๊นŒ์›Œ ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์กฐ๊ธˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(args...) = f(args...)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
-1

ํŽธ์ง‘ : ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ Vararg ์ž…๋ ฅ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค ..... ์ด๊ฒƒ์€ vararg ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ์žฌ ์ปดํŒŒ์ผ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ•„์š”ํ•  ๋•Œ๋งŒ ์žฌ ์ปดํŒŒ์ผ ํ• ๋งŒํผ ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ?

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(a, b) = f(a, b)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
3

์‹ค์ œ๋กœ ํ•จ์ˆ˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ @code_typed ๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค .....

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(args...) = f(args...)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> <strong i="7">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin  # none, line 1:
        return (top(box))(Int64,(top(add_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
    end::Int64))))

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
-1

julia> <strong i="8">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin  # none, line 1:
        return (top(box))(Int64,(top(add_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
    end::Int64))))

๊ณผ

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(args...) = f(args...)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
-1

julia> <strong i="12">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin  # none, line 1:
        return (top(box))(Int64,(top(sub_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
    end::Int64))))

์–ด๋–ค ๊ฒƒ์ด ํ• ๋‹น ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๋Š” ์ˆซ์ž๋กœ ํ•จ์ˆ˜์˜ ๋ฉ”์†Œ๋“œ (๋˜๋Š” ํ•จ์ˆ˜ ์œ ํ˜• / ๊ฐ์ฒด ์ž์ฒด ๋งŒ)๋ฅผ ์ƒ‰์ธํ™”ํ•˜์—ฌ ์ปดํŒŒ์ผ ๋œ (ํ˜ธ์ถœ์ž) ํ•จ์ˆ˜๋กœ ์ €์žฅ๋œ ์ˆซ์ž (์ฆ‰, ์ƒˆ๋กœ์šด ๊ตฌ์กฐ ์‚ฌ์šฉ) ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜,์ด ์ˆซ์ž๋ฅผ ํ•„๋“œ๋กœ ์ €์žฅํ•˜๋Š” ๋“ฑ) ์—ฌ์ „ํžˆ ์ธ๋ผ์ธ ๋œ (ํ˜ธ์ถœ ๋œ) ํ•จ์ˆ˜์—์„œ "ํ˜„์žฌ"์ธ ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ?
(๋ฌผ๋ก  ํฐ ์„ฑ๋Šฅ ์ €ํ•˜์—†์ด)
๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์ƒˆ ๋ฒ„์ „์„ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ ์  ํ˜ธ์ถœ๋กœ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ด๋Š” ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋Ÿฐํƒ€์ž„์œผ๋กœ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ (๋ชจ๋“  ๊ณณ์—์„œ) ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ์€ ์ข…์†์„ฑ์˜ ์›น์„ ์ถ”์ ํ•˜๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์žฌ์ •์˜ ๋  ๋•Œ ์˜ํ–ฅ์„๋ฐ›์„ ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ _ ๊ฑฐ๋Œ€ํ•œ _ ๊ณ ํ†ต ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋งคํฌ๋กœ๋กœ ์‰ฝ๊ฒŒ ์ผ๋ฐ˜ํ™”๋˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋™ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธ ํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ์‹œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (๋ฌผ๋ก  ํ˜„์žฌ ์‹คํ–‰ ํ™•์ธ ๋“ฑ)

์—ฌ๊ธฐ์„œ ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์ฝ”๋“œ ๋ฌดํšจํ™”, (์ƒ์„ฑ ๋œ ์ฝ”๋“œ์—์„œ) ์ด์ „ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์žฅ์†Œ๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค. ์ด๋Š” ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ ํ˜ธ์ถœ ๊ทœ์น™ ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค : ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์ด ์‹คํ–‰ ์ค‘์ด๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ์–ด๋–ค ์ƒํƒœ๊ฐ€ ๋ณด์ž…๋‹ˆ๊นŒ? ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ๊ต์ฒด์—†์ด ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š๋Š” ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ํ•˜๋ฉฐ @vtjnash ๊ฐ€ ์ ์ ˆํ•œ ๋ชจ์–‘์ด๋˜๋ฉด ์•ฝ๊ฐ„์˜ ๊ธ€์„ ์˜ฌ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์—์„œ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๊ฐ€ ์œ„์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์—์„œ ์‚ฌ์šฉ ๋œ ๊ฒฝ์šฐ (๋ฐ ๊ฒฝ์šฐ์—๋งŒ) ์„ค์ •๋œ ๋ชจ๋“  ํ•จ์ˆ˜์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. inlining ๋“ฑ) ์ธ๋ผ์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์žฌ์ •์˜๋˜์—ˆ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด. (๋ชจํ˜ธํ•œ ๊ฒฝ๊ณ  ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ)
ํ”Œ๋ž˜๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ์ค„๋ฆฌ์•„ 0.5์˜ ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ / ํ•จ์ˆ˜ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ repl์—์„œ ์ด๊ฒƒ์„ ์น˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฌ์›Œ์กŒ์œผ๋ฉฐ์ด ๋™์ž‘์€ ๋งต์— ๋Œ€ํ•ด ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

julia> function f(x)
         1
       end 
f (generic function with 1 method)

julia> map(f, 1:10)
10-element Array{Int64,1}:
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1

julia> function f(x)
         2
       end
WARNING: Method definition f(Any) in module Main at REPL[9]:2 overwritten at REPL[11]:2.
f (generic function with 1 method)

julia> map(f, 1:10)
10-element Array{Int64,1}:
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐ”๋‹๋ผ # 265์ž…๋‹ˆ๋‹ค. v0.6-dev์—์„œ ๊ณง ์ˆ˜์ • ๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์— ๊ฐ์‚ฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

@vtjnash ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ

์•ฝ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ (140MB-> 170MB)๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ (์ปดํŒŒ์ผ ๋˜๋Š” ๋Ÿฐํƒ€์ž„)์— ํฐ ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์•„์ง ๋งŽ์€ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€์˜ ๋ฐ๋ชจ๋Š” ์žฌ๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> f() = 1
f (generic function with 1 method)

julia> function g(x)
    <strong i="7">@eval</strong> f() = $x # this is the correct way to write `global f() = x` (which should be a syntax error, but isn't currently)
    return @eval(f)() # use `eval` to hide the value from optimization / inlining, but the call is not inside eval
end
g (generic function with 1 method)

julia> g(2)
WARNING: Method definition f() in module Main at REPL[1]:1 overwritten at REPL[2]:2.
1

julia> g(3)
WARNING: Method definition f() in module Main at REPL[2]:2 overwritten at REPL[2]:2.
2

julia> g(4)
WARNING: Method definition f() in module Main at REPL[2]:2 overwritten at REPL[2]:2.
3

g ์ปดํŒŒ์ผ ์ˆœ์„œ์™€ f ์žฌ์ •์˜ ์‹คํ–‰ ์ˆœ์„œ๋กœ ์ธํ•ด 2, 3, 4๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋Œ€์ถฉ ๋งž์Šต๋‹ˆ๋‹ค. ์ด ์ˆœ์„œ๊ฐ€ํ•˜๋Š” ๋ง์„ ๋” ์ •ํ™•ํ•œ ๊ทธ๋ž˜์„œ ์ฃผ ์–ธ์–ด๋Š” ์ปดํŒŒ์ผ์„ ์ •์˜ํ•˜์ง€ ์˜๋ฏธํ•˜๋Š” g ์˜ ์žฌ์ •์˜ํ•˜๋Š” ์‹œ๊ฐ„ ๋Œ€ ํ•ด์„ f ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ํ‘œ์‹œ๋˜๊ธฐ

์ข‹์•„์š”, ์—ฌ๊ธฐ์— + ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์žฌ๋ฏธ์žˆ๋Š” ๋ฐ๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> add_ctr = UInt(0)
0x0000000000000000

julia> Base.:+(a::Int, b::Int) = (global add_ctr += 1; Core.Intrinsics.add_int(a, b))

julia> add_ctr
0x0000000000000016

julia> last = 0;

julia> println(Int(add_ctr - last)); last = add_ctr;
287

julia> println(Int(add_ctr - last)); last = add_ctr;
17

์†์ž„์ˆ˜์ž…๋‹ˆ๋‹ค. + ์ด Base์—์„œ ์ „ํ˜€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์žฌ ์ปดํŒŒ์ผ ํ•  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. REPL์ด ๋‚˜ํƒ€๋‚˜๊ธฐ ์ „์— ์ตœ์†Œํ•œ 100 ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๋Š” svd ์™€ ๊ฐ™์€ ์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ๊ฐ๋™ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ ๋ง / ์ถ”์ ์„ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‹ค์‹œ ๊ณ„์ธก ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋‚ ์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ์—ฐ. Ctrl-D; julia<Enter> ์‹œํ€€์Šค๊ฐ€ ๊ฑฐ์˜ ๋‹ณ ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์ƒˆ ํ‚ค๋ณด๋“œ๋ฅผ ๊ตฌ์ž…ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ํ•„์š”๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ๋น„ํ˜„์‹ค์  ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ดํ•ด๋Š” ์ด์ œ collect -ing a Generator ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 0.4์—์„œ?- @which ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)? ์œ„์˜ vchuravy์™€ ๋น„์Šทํ•œ์ด ์˜ˆ์ œ๋Š” ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์ด์ œ 0.5์˜ ์œ ํ˜•์ด๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋”๋ผ๋„ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.5.0-rc3+0 (2016-08-22 23:43 UTC)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |  x86_64-linux-gnu

julia> f(x) = 1
f (generic function with 1 method)

julia> [f(x) for x in 1:5]
5-element Array{Int64,1}:
 1
 1
 1
 1
 1

julia> f(x) = 2
WARNING: Method definition f(Any) in module Main at REPL[1]:1 overwritten at REPL[3]:1.
f (generic function with 1 method)

julia> [f(x) for x in 1:5]
5-element Array{Int64,1}:
 1
 1
 1
 1
 1

julia> <strong i="9">@which</strong> [f(x) for x in 1:5]
collect(itr::Base.Generator) at array.jl:295

๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ˆ˜์ • # 265์— ์œ ์šฉ

์ด๊ฒŒ ์ •๋ง ์ˆ˜์ • ๋˜์—ˆ๋‚˜์š” ๐Ÿ˜ฒ

์ด ์†”๋ฃจ์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹0.5.x๋กœ ๋ฐฑ ํฌํŠธ ๋  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ.

@ rapus95 , ์ด๊ฒƒ์€ ๋งค์šฐ ์นจ๋žต์ ์ธ ๋ณ€๊ฒฝ์ด๋ฉฐ ์ž˜๋ชป๋˜๋ฉด ๋งŽ์€ ์‚ฌ์šฉ์ž์˜ ์ค„๋ฆฌ์•„๋ฅผ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค์˜ ์š”์ ์€ ๋งˆ์Šคํ„ฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ 0.6์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. (0.6 ๋ฆด๋ฆฌ์Šค ์ด์ „์— ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ master๋ฅผ ํŒ”๋กœ์šฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„์ „์„ ๋ณด๊ฒŒ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค! ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ https://groups.google.com/forum/#!topic/julia -users / OBs0fmNmjCU์— ์„ค๋ช… ๋œ ์‚ฌ๋ก€๋ฅผ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋†€๋ผ ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™€. ์ •๋ง ๋ฉ‹์ง„ ์ˆœ๊ฐ„์ž…๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”!

์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ 0.5 ์‹œ๋ฆฌ์ฆˆ๋กœ ๋ฐฑ ํฌํŠธ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด 0.6์ด ๋  ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์ด๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ 0.6์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„ ์ง€ ๊ณผ์žฅํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ์Šต๊ด€์€ ์‹ฌํ•˜๊ฒŒ ์ฃฝ๊ธฐ ๋•Œ๋ฌธ์— ๋•Œ๋•Œ๋กœ ์ค„๋ฆฌ์•„๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์žฌ ๊ตฌ์ถ•ํ•˜์ง€๋งŒ, ๊ธฐ์–ตํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์žˆ์–ด ์™„์ „ํ•œ ๊ฒŒ์ž„ ์ฒด์ธ์ €์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰