Julia: repl์—์„œ ํ•จ์ˆ˜ ์†Œ์Šค ์ฝ”๋“œ ํ‘œ์‹œ

์— ๋งŒ๋“  2013๋…„ 03์›” 20์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

Julia์—๋Š” methods ๋ฐ help ์™€ ๊ฐ™์€ ์œ ์šฉํ•œ REPL ํ•ญ๋ชฉ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋Š”์ง€๋ณด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

julia> methods(base)
# methods for generic function base
base(base::Integer,n::Integer,pad::Integer) at intfuncs.jl:290
base(symbols::Array{Uint8,N},n::Integer,p::Integer) at intfuncs.jl:291
base(base_or_symbols::Union(Integer,Array{Uint8,N}),n::Integer) at intfuncs.jl:292

julia> implementation(base,1)
base(base::Integer, n::Integer, pad::Integer) = _base(dig_syms,int(base),unsigned(abs(n)),pad,n<0)

julia> implementation(base,3)
base(base_or_symbols::Union(Integer,Array{Uint8}), n::Integer) = base(base_or_symbols, n, 1)

์ผ๋ถ€ IDE์˜ ์ฝ”๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ REPL์—์„œ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๋งŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
์Šคํฌ๋กค ์—…ํ•˜์—ฌ _base ์˜ ๊ตฌํ˜„์„ ๋ณด๊ฑฐ๋‚˜ ํ•ด๋‹น ํŒŒ์ผ์—์„œ dig_syms ์˜ ์ •์˜๋ฅผ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํžˆ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฅด.

_base ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ด๋ฏธ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” base ๊ตฌํ˜„์„๋ณด๋‹ค ์˜๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (REPL์—์„œ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋กœ ์ „ํ™˜ ํ•  ํ•„์š” ์—†์Œ)

julia> methods(Base._base)
# methods for generic function _base
_base(symbols::Array{Uint8,N},b::Int32,x::Unsigned,pad::Int32,neg::Bool) at intfuncs.jl:278

์ค„ ๋ฒˆํ˜ธ / ํŒŒ์ผ์ด ์ด๋ฏธ methods ์˜ ์ถœ๋ ฅ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ํŒŒ์ผ์—์„œ ์ ์ ˆํ•œ ์ฝ”๋“œ ์ค„์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

REPL help wanted

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

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„์ง€์ง€ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ €์—๊ฒŒ๋Š” ๋น„๋šค์–ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

julia> <strong i="6">@code_native</strong> 1 + 2
    .section    __TEXT,__text,regular,pure_instructions
; โ”Œ @ int.jl:53 within `+'
    leaq    (%rdi,%rsi), %rax
    retq
; โ””
; โ”Œ @ int.jl:53 within `<invalid>'
    nopw    %cs:(%rax,%rax)
; โ””

์ด

julia> <strong i="10">@code_llvm</strong> 1 + 2

;  @ int.jl:53 within `+'
define i64 @"julia_+_13402"(i64, i64) {
top:
  %2 = add i64 %1, %0
  ret i64 %2
}

์ด

julia> <strong i="14">@code_typed</strong> 1 + 2
CodeInfo(
1 โ”€ %1 = Base.add_int(x, y)::Int64
โ””โ”€โ”€      return %1
) => Int64

์ด

julia> <strong i="18">@code_lowered</strong> 1 + 2
CodeInfo(
1 โ”€ %1 = Base.add_int(x, y)
โ””โ”€โ”€      return %1
)

ํ•˜์ง€๋งŒ ์ด๊ฑด ์•„๋‹ˆ์•ผ

julia> <strong i="23">@code_source</strong> 1 + 2
ERROR: LoadError: UndefVarError: <strong i="24">@code_source</strong> not defined
in expression starting at REPL[23]:1

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

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

๋Œ€ํ™” ํ˜•์œผ๋กœ ์‹คํ–‰ํ•  ๋•Œ ๊ฐ ๋ฉ”์„œ๋“œ ์ •์˜์˜ ์†Œ์Šค (์••์ถ•)๋ฅผ ์ €์žฅํ•˜๋ฉด ์†Œ์Šค ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์†Œ์Šค ํ–‰ ์ฃผ์„์ด ์™„๋ฒฝํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋‹ค์†Œ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰๋˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ # 265 ( ์ด ํ† ๋ก  ์ฐธ์กฐ)์—๋„ ๋„์›€

์•„๋‹ˆ์š”, # 265์—๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ์†Œ์Šค ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ณธ ์ฝ”๋“œ๋ฅผ๋ณด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํŒŒ์ผ์—์„œ ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

+1 ํŒŒ์ผ์—์„œ ์ฝ์Œ.
๋” ๋‚˜์€ ์ˆ˜์ • https://github.com/JuliaLang/julia/issues/2594 , start ์ด ๊ธฐ๋ณธ cmd ๋ช…๋ น์ด๊ณ  notepad ๊ฐ€ ๊ตฌ๋ฌธ์„ ๊ฐ•์กฐ ํ‘œ์‹œ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ Windows ์‚ฌ์šฉ์ž๋ฅผ ์ฃฝ์ž…๋‹ˆ๋‹ค. ์ค„ ๋ฒˆํ˜ธ๋กœ ํ‘œ์‹œ / ์ ํ”„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
edit ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๊ณ  ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์œ ์šฉํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋ฉ”์†Œ๋“œ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ ๋ชฉ์ ์„ ์œ„ํ•ด 'ํŽธ์ง‘'์— ์˜์กดํ•ด์•ผํ•œ๋‹ค๋Š” ๋Š๋‚Œ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์›๊ฒฉ Julia ์ปค๋„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” IPython ์›น ๋…ธํŠธ๋ถ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ํด๋ผ์ด์–ธํŠธ ๋Œ€์‹  ์ปค๋„ ์ปดํ“จํ„ฐ์—์„œ ์—ด๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ๋Œ€ํ™” ํ˜• ๋ชจ๋“œ์—์„œ ํŒŒ์ผ์—์žˆ๋Š” ๋‚ด์šฉ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. repl์„ ํ†ตํ•ด ์ž…๋ ฅ ๋œ ๊ฒƒ๋“ค์˜ ์†Œ์Šค ์ฝ”๋“œ๋„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. # 3988๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํ˜ธ์ถœ๊ธฐ ์ง€์› # 6921์€ ์ด๊ฒƒ์˜ ์œ ์šฉ์„ฑ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์šฐ๋ ค๋ฅผ ๋ฌดํšจํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” (๋ฅผ ํ†ตํ•ด ipython์ด ๋งค์šฐ ํŽธ๋ฆฌ ์ฐพ์„ ์ˆ˜ func?? ์ค„๋ฆฌ์•„์˜ ๊ฒฝ์šฐ๊ฐ€ ๋  ์ˆ˜๋Š” ๋‹ฌ๋ฆฌ - -ํ•˜์ง€๋งŒ,) ์ผ๋ถ€ ๊ธฐ๋Šฅ (์˜ˆ : ๋‚ด์žฅ / ์‚ฌ์ด ์ฌ ๊ธฐ๋Šฅ) ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ <strong i="5">@less</strong> func(x) ๋Š” @astrieanna ๊ฐ€ ์š”์ฒญํ•˜๋Š” ์ž‘์—… (ํŽ˜์ด์ง• ํฌํ•จ)์„ ๊ฑฐ์˜ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์™ธ๋ถ€ $PAGER ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

<strong i="5">@less</strong> func(x) ๋Š” ๋Œ€ํ™” ํ˜• ๊ธฐ๋Šฅ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ๋‹ค์‹œ ํ‘œํ˜„ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ

  • repl์—์„œ ๋˜๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฏธ๋ฆฌ ๋‚ฎ์€ AST ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜ / ์œ ํ˜• / ํ•จ์ˆ˜ / ์œ ํ˜• ์žฌ์ •์˜ / ์ง€์šฐ๊ธฐ

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ๋ชฉ๋ก / ์ˆœํšŒ / ์กฐ์ž‘ / ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> q=:( function a(i::Int) ; return i+4 ; end ; b=4 ; println(a(b))  )
quote 
    function a(i::Int) # none, line 1:
        return i + 4
    end
    begin 
        b = 4
        println(a(b))
    end
end

julia> function exprdescend(ex) ; if (isa(ex,Expr)) ; println("Descending Expr:",ex) ; println("head:",ex.head); println("args:",ex.args) ; println("type:",ex.typ)  ; for i in ex.args ; exprdescend(i) ; end ; else ; println("*:",typeof(ex),":",ex)  ; end  ;  end
// # ''try it ... long output''

๋Œ“๊ธ€์— ๋Œ€ํ•œ ์‘๋‹ต : JeffBezanson์ด 2013 ๋…„ 3 ์›” 20 ์ผ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.
"์•„๋‹ˆ์š”, # 265์—์„œ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋” ์ด์ƒ ์†Œ์Šค ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ณธ ์ฝ”๋“œ๋ฅผ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํŒŒ์ผ์—์„œ ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . "

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? include / require ๋ฌธ ๋ฐ ๊ธฐํƒ€ ์‚ฌํ•ญ์ด์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

// # str = read_whole_file_into_a_string(filename)
julia> str="for i in [1,2,3,4] ; println(i) ; end "
julia> s=parse(str)
:(for i = [1,2,3,4] # line 1:
        println(i)
    end)
julia> exprdescend(s)
Descending Expr:for i = [1,2,3,4] # line 1:
    println(i)
end
head:for
args:{:(i = [1,2,3,4]),quote  # line 1:
    println(i)
end}
type:Any
Descending Expr:i = [1,2,3,4]
head:=
args:{:i,:([1,2,3,4])}
type:Any
*:Symbol:i
Descending Expr:[1,2,3,4]
head:vcat
args:{1,2,3,4}
type:Any
*:Int64:1
*:Int64:2
*:Int64:3
*:Int64:4
Descending Expr:begin  # line 1:
    println(i)
end
head:block
args:{:( # line 1:),:(println(i))}
type:Any
*:LineNumberNode: # line 1:
Descending Expr:println(i)
head:call
args:{:println,:i}
type:Any
*:Symbol:println
*:Symbol:i

@hgkamath ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ๋ฆฌํ”Œ๋ ‰์…˜ ์„น์…˜์„ ์ฝ์œผ์‹ญ์‹œ์˜ค.

๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” @generated ํ•จ์ˆ˜ (https://groups.google.com/d/topic/julia-users/4pkWhcap1Zg/discussion)์ž…๋‹ˆ๋‹ค.

์•„, # 22007์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ–ˆ๋‚˜์š”?

์ผ์ข…์˜ โ€“ ๋‚˜๋Š” ์—ฌ์ „ํžˆ REPL ๋ชจ๋“œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ‘œ์‹œ ํ•  ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์›๋ž˜ ์†Œ์Šค๋ฅผ ์ˆจ๊ฒจ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ต๋ช… ํ•จ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฌธ์ œ๋„ ์žˆ๋Š”๋ฐ, ์›๋ž˜ AST๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

julia> x -> x+1
(::#5) (generic function with 1 method)

๋ณ„๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ ๋‹ดํ™” ์ฐธ์กฐ.)

REPL ๋ชจ๋“œ์—์„œ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

let h = Base.active_repl.interface.modes[1].hist,
    replno = match(r"REPL\[(\d+)\]", $filename)

    replno === nothing || h.history[h.start_idx + parse(Int, replno[1])]
end

"์ ‘๊ทผํ•˜๊ธฐ ๊ท€์ฐฎ์Œ"== "ํ•ด๊ฒฐ ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋ ๋งŒํผ ์œ ์šฉํ•˜์ง€ ์•Š์Œ"

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

https://github.com/MasonProtter/LegibleLambdas.jl ์—์„œ ์ œ๊ณตํ•˜๋Š” Yao์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€

๋ชจ๋“  ๋ธ”๋ก์—๋Š” ํ ๋น„ํŠธ ์ˆ˜์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฏ€๋กœ์ด ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์„ ๋•Œ ์ž๋™ ์ปค๋ฆฌ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> using Yao

julia> control(2, 1=>X)
(n -> control(n, 2, 1 => X gate))

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ์ด๊ฒƒ์ด ๋ธ”๋ก์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€ ํ‰๊ฐ€๋ฅผ ์œ„ํ•ด์ด ํ ๋น„ํŠธ ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. LegibleLambdas๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—๋Š” #42 ์™€ ๊ฐ™์€ ์ˆซ์ž๋งŒ์œผ๋กœ๋Š” ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ์ด์ „์— ๋žŒ๋‹ค๋ฅผ ๋ฐ˜ํ™˜ ํ•  ๋•Œ Flux์—๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ LegibleLambdas์—์„œ ์ง€์›ํ•  ์ˆ˜์—†๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. extern ํŒจํ‚ค์ง€ ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ง€์›์„ ํ†ตํ•ด REPL์—์„œ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„์ง€์ง€ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ €์—๊ฒŒ๋Š” ๋น„๋šค์–ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

julia> <strong i="6">@code_native</strong> 1 + 2
    .section    __TEXT,__text,regular,pure_instructions
; โ”Œ @ int.jl:53 within `+'
    leaq    (%rdi,%rsi), %rax
    retq
; โ””
; โ”Œ @ int.jl:53 within `<invalid>'
    nopw    %cs:(%rax,%rax)
; โ””

์ด

julia> <strong i="10">@code_llvm</strong> 1 + 2

;  @ int.jl:53 within `+'
define i64 @"julia_+_13402"(i64, i64) {
top:
  %2 = add i64 %1, %0
  ret i64 %2
}

์ด

julia> <strong i="14">@code_typed</strong> 1 + 2
CodeInfo(
1 โ”€ %1 = Base.add_int(x, y)::Int64
โ””โ”€โ”€      return %1
) => Int64

์ด

julia> <strong i="18">@code_lowered</strong> 1 + 2
CodeInfo(
1 โ”€ %1 = Base.add_int(x, y)
โ””โ”€โ”€      return %1
)

ํ•˜์ง€๋งŒ ์ด๊ฑด ์•„๋‹ˆ์•ผ

julia> <strong i="23">@code_source</strong> 1 + 2
ERROR: LoadError: UndefVarError: <strong i="24">@code_source</strong> not defined
in expression starting at REPL[23]:1

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

๋น„์Šทํ•œ ๊ธฐ๋Šฅ์ด ์ด์ œ Revise.jl์˜ ์ผ๋ถ€์ธ https://github.com/timholy/CodeTracking.jl ์— ์˜ํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ๊ธˆ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋” ์ž์ฃผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์„œ์—๋Š” Revise๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด ํ† ๋ก ์—์„œ ์ œ์•ˆ

์ž๋™ ๋ฏธ๋ถ„ (์˜ˆ : https://github.com/FluxML/Zygote.jl)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฏธ๋ถ„์„ ์ค„๋ฆฌ์•„ ์ฝ”๋“œ๋กœ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ์ด ๊ธฐ๋Šฅ์ด ์šฐ์ˆ˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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