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

๊ณ ์„ฑ๋Šฅ, ๋™์  ํƒ€์ดํ•‘ ์ง€์› ๋ฐ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋‚ด์žฅ ๋„๊ตฌ์™€ ๊ฐ™์€ ํ’ˆ์งˆ์„ ๊ฒฐํ•ฉํ•œ Julia 1.8 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Julia์˜ ๊ตฌ๋ฌธ์€ MATLAB๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ Ruby ๋ฐ Lisp์˜ ์ผ๋ถ€ ์š”์†Œ๋ฅผ ์ฐจ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์กฐ์ž‘ ๋ฐฉ๋ฒ•์€ Perl์„ ์—ฐ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์–ธ์–ด์˜ ์ฃผ์š” ํŠน์ง•:

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

Julia 1.8์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ
    • ์ด์ œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ์— ์ƒ์ˆ˜๋กœ ์ฃผ์„์„ ๋‹ฌ์•„ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์œ ํ˜• ์ฃผ์„์„ ์ „์—ญ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋นˆ n์ฐจ์› ๋ฐฐ์—ด์€ ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ์—ฌ๋Ÿฌ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "[;;]"๋Š” 0x0x0 ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • Try ๋ธ”๋ก์€ ์ด์ œ ์„ ํƒ์ ์œผ๋กœ else ๋ธ”๋ก์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ธ”๋ก์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ณธ๋ฌธ ๋ฐ”๋กœ ๋‹ค์Œ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • @inline ๋ฐ @noinline์„ ํ•จ์ˆ˜ ๋ณธ๋ฌธ ๋‚ด์— ๋ฐฐ์น˜ํ•˜์—ฌ ์ต๋ช… ํ•จ์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ @inline ๋ฐ @noinline์„ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ ๋˜๋Š” ๋ธ”๋ก์˜ ํ•จ์ˆ˜์— ์ ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ฐ•์ œ๋กœ ํฌํ•จ(๋˜๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Œ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • โˆ€, โˆƒ ๋ฐ โˆ„๋Š” ์‹๋ณ„์ž ๋ฌธ์ž๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์œ ๋‹ˆ์ฝ”๋“œ 14.0.0 ์‚ฌ์–‘์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • Module(:name, false, false) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„์ด ์—†๊ณ , Base ๋˜๋Š” Core๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉฐ, ์ž์ฒด ์ฐธ์กฐ๋„ ์—†๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ธ์–ด ๋ณ€๊ฒฝ
    • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Task ๊ฐœ์ฒด(@spawn, @async ๋“ฑ)๋Š” ์ด์ œ ์ƒ์„ฑ ์‹œ ์ƒ์œ„ Task์˜ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ world_age๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์ตœ์ ํ™”๋œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ™œ์„ฑํ™” ์˜ต์…˜์€ Base.invokelatest ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‚ฝ์ž…์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์œ ๋‹ˆ์ฝ”๋“œ ๋ถˆ๊ท ํ˜• ์–‘๋ฐฉํ–ฅ ํ˜•์‹ ์ง€์ • ์ง€์‹œ๋ฌธ์€ ์ด์ œ ๋ฌธ์ž์—ด๊ณผ ์ฃผ์„์—์„œ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.
    • Base.ifelse๋Š” ์ด์ œ ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ํŒจํ‚ค์ง€์—์„œ ํ•ด๋‹น ์ •์˜๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ์ „์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ํ• ๋‹น์€ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ T ์œ ํ˜•์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ๋จผ์ € ๋ณ€ํ™˜(Any, x) ๋˜๋Š” ๋ณ€ํ™˜(T, x) ํ˜ธ์ถœ์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ถˆ๋ณ€ ๋ณ€ํ™˜(Any , x) === x๋Š” ํ•ญ์ƒ true์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ์ด์ œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๋ฉฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ/๋Ÿฐํƒ€์ž„ ๊ฐœ์„ 
    • ๋ถ€ํŒ… ์‹œ๊ฐ„์ด ์•ฝ 25% ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • LLVM ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ libjulia-codegen์œผ๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๋“œ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์ค‘์—๋Š” ๋ณ€๊ฒฝ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐฐํฌ(์˜ˆ: ํ•„์š”ํ•œ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€)์—์„œ๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฐ ํ•ด๋‹น LLVM ์ข…์†์„ฑ)๋ฅผ ๊ฐ„๋‹จํžˆ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ๋ฉ”์„œ๋“œ์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์กฐ๊ฑด๋ถ€ ํ˜•์‹ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Base.ifelse(isa(x, Int), x, 0)์˜ ๊ฒฝ์šฐ x ์œ ํ˜•์„ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ::Int๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • SROA(Scalar replacement of Aggregates)๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜๊ตฌ ์ „์—ญ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” getfield ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๊ณ , ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์ค‘์ฒฉ๋œ getfield ํ˜ธ์ถœ์˜ ์„ฑ๋Šฅ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์œ ํ˜• ์ถ”๋ก ์€ ๋ถ€์ž‘์šฉ๊ณผ ๋น„๋“œ๋กญ ๋“ฑ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ์ „ํŒŒ๊ฐ€ ๊ณ ๋ ค๋˜์–ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๋ผ์ธ๋  ์ˆ˜ ์—†์ง€๋งŒ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๋Ÿฐํƒ€์ž„ ์‹œ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ ๊ทœ์น™์€ Base.@assume_ํšจ๊ณผ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ์‚ฌ์ „ ์ปดํŒŒ์ผ(๋ช…์‹œ์ ์ธ ์‚ฌ์ „ ์ปดํŒŒ์ผ ์ง€์‹œ๋ฌธ ๋˜๋Š” ์ง€์ •๋œ ์ž‘์—… ๋ถ€ํ•˜ ํฌํ•จ)์„ ํ†ตํ•ด ๋” ๋งŽ์€ ์œ ํ˜• ์ •์˜ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋ฏ€๋กœ ์ตœ์ดˆ ์‹คํ–‰์ด ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋œ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ํŒจํ‚ค์ง€์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ/์œ ํ˜• ์กฐํ•ฉ์€ ์ด์ œ ํŒจํ‚ค์ง€์— ์†ํ•œ ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์ „ ์ปดํŒŒ์ผ ํŒŒ์ผ์— ์บ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ
    • @inbounds ์„ ์–ธ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋™์ž‘์€ ์ด์ œ "--check-bounds=yes|no|auto"์˜ ์ž๋™ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋…์ŠคํŠธ๋ง, ์†Œ์Šค ์œ„์น˜ ์ •๋ณด ๋ฐ ๋กœ์ปฌ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ œ๊ฑฐํ•˜๋Š” ์ƒˆ๋กœ์šด "--strip-metadata" ์˜ต์…˜์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ค‘๊ฐ„ ์†Œ์Šค ์ฝ”๋“œ ํ‘œํ˜„์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด ์˜ต์…˜ "--strip-ir". ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋Š” "--compile=all"์ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ํŒŒ์ผ ์ด๋ฆ„ ๋Œ€์‹  "-" ๋ฌธ์ž๊ฐ€ ์ง€์ •๋˜๋ฉด ํ‘œ์ค€ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์—์„œ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ง€์› ๋ณ€๊ฒฝ ์‚ฌํ•ญ
    • Threads.@threads๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์˜ˆ์•ฝ ์˜ต์…˜์ธ :dynamic์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ˜๋ณต์ด ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ ์ „์ฒด์—์„œ ๋™์ ์œผ๋กœ ์˜ˆ์•ฝ๋œ๋‹ค๋Š” ์ ์—์„œ ์ด์ „ ๋ชจ๋“œ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด @spawn ๋ฐ @threads๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ
    • ๊ฐ๊ฐ์˜ ๋ถ„ํ• (str)์€ ๋ถ„ํ• (str)์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • allequal(itr)์€ ๋ฐ˜๋ณต์ž์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋™์ผํ•œ์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
    • hardlink(src, dst)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋“œ ๋งํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • setcpuaffinity(cmd, cpus)๋Š” ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด์˜ ์„ ํ˜ธ๋„๋ฅผ ์‹œ์ž‘๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • diskstat(path=pwd())๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””์Šคํฌ ํ†ต๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • ํ‰๊ฐ€ ์ค‘์ธ ๋ผ์ธ๊ณผ @time ๋ณด๊ณ ์„œ๋ฅผ ๋ชจ๋‘ ํ‘œ์‹œํ•˜๋Š” ์ƒˆ๋กœ์šด @showtime ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.
    • ์˜ค๋ฅ˜ ๊ฒฝ๋กœ์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์ง€์—ฐ ๊ตฌ์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด LazyString ๋ฐlazy"str" โ€‹โ€‹โ€‹โ€‹๋งคํฌ๋กœ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • Dict ๋ฐ ๊ธฐํƒ€ ํŒŒ์ƒ ๊ฐœ์ฒด(์˜ˆ: ํ‚ค(::Dict), ๊ฐ’(::Dict) ๋ฐ Set)์˜ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์‚ฌ์ „์ด๋‚˜ ์„ธํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ˜ธ์ถœ์ด ์—†๋Š” ํ•œ ์‚ฌ์ „์ด๋‚˜ ์„ธํŠธ์—์„œ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • @time ๋ฐ @timev์—๋Š” ์ด์ œ ์„ ํƒ์  ์„ค๋ช…์ด ์žˆ์–ด ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ๊ฐ„ ๋ณด๊ณ ์„œ ์†Œ์Šค์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @time "foo ํ‰๊ฐ€ ์ค‘" foo().
    • range๋Š” ์œ ์ผํ•œ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋กœ stop ๋˜๋Š” length๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Precision ๋ฐ setprecision์€ ์ด์ œ base๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ œ TCP ์†Œ์ผ“ ๊ฐœ์ฒด๋Š” closewrite ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋ฐ˜ ๊ฐœ๋ฐฉ ๋ชจ๋“œ ์‚ฌ์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • extrema๋Š” ์ด์ œ init ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Iterators.countfrom์€ ์ด์ œ + ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • @time์€ ์ด์ œ ๋ณ€๊ฒฝ๋œ ์œ ํ˜•์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„(%)์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ
    • ๊ฐ’์ด Nothing์ธ ํ‚ค๋Š” ์ด์ œ addenv์˜ ํ™˜๊ฒฝ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
    • Iterators.reverse(๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰)๋Š” ๊ฐ ์ค„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ • ์œ ํ˜•์˜ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๊ธธ์ด ํ•จ์ˆ˜๋Š” ๋” ์ด์ƒ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ธ check_length๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ๋น„ํŠธ ์ „์†ก ์ œ์–ด ๋…ผ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ SaferIntegers.jl์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์œ„ ์œ ํ˜•์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • Iterators.Reverse ๋ฐ˜๋ณต์ž๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฐ ์ธ๋ฑ์Šค ๋ฐ˜์ „์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž
    • ์ƒˆ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” "pkg>" ์ƒํƒœ์˜ ํŒจํ‚ค์ง€ ์˜†์— ์ƒˆ๋กœ์šด โŒƒ ๋ฐ โŒ… ํ‘œ์‹œ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. โŒ…๋Š” ์ƒˆ ๋ฒ„์ „์„ ์„ค์น˜ํ•  ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ์ด์ „ ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๋Š” Pkg.status(REPL ๋ชจ๋“œ์˜ --outdated ๋˜๋Š” -o)์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด outdated::Bool ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • Project.toml์˜ ๋ชจ๋“  [compat] ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ Pkg.status(REPL ๋ชจ๋“œ์˜ --compat ๋˜๋Š” -c)์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด compat::Bool ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ํ”„๋กœ์ ํŠธ ํ˜ธํ™˜์„ฑ ํ•ญ๋ชฉ ์„ค์ •์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด "pkg>compat"(๋ฐ Pkg.compat) ๋ชจ๋“œ. ํƒญ ์™„์„ฑ์„ ํ†ตํ•ด ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” "pkg>compat"๋ฅผ ํ†ตํ•œ ๋Œ€ํ™”ํ˜• ํŽธ์ง‘๊ธฐ ๋˜๋Š” "pkg>Foo 0.4,0.5"๋ฅผ ํ†ตํ•œ ์ง์ ‘ ๋ ˆ์ฝ”๋“œ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "pkg> compat Fo"๋Š” ์ž๋™์œผ๋กœ "pkg> Foo 0.4,0.5"๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด ๊ธฐ์กด ํ•ญ๋ชฉ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ Pkg๋Š” ์„œ๋ฒ„๊ฐ€ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํŒจํ‚ค์ง€ ์„œ๋ฒ„์—์„œ ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
    • Pkg.instantiate๋Š” ์ด์ œ Project.toml์ด Manifest.toml๊ณผ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ๋•Œ ํ”„๋กœ์ ํŠธ์˜ deps ๋ฐ compat ๋ ˆ์ฝ”๋“œ(๋‹ค๋ฅธ ํ•„๋“œ๋Š” ๋ฌด์‹œ๋จ)์˜ ํ•ด์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ Project.toml deps ๋˜๋Š” compat ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค์‹œ ํ™•์ธํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • "pkg>add"๊ฐ€ ํ•ด๋‹น ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ์ด์ œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์Šทํ•œ ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
    • ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ €์žฅ๋œ Julia ๋ฒ„์ „์—๋Š” ๋” ์ด์ƒ ๋นŒ๋“œ ๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ œ ๋งˆ์Šคํ„ฐ๊ฐ€ 1.9.0-DEV๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
    • ์ด์ œ ํ…Œ์ŠคํŠธ ์ค‘๋‹จ "pkg>"๊ฐ€ ๋” ์ผ๊ด€๋˜๊ฒŒ ๊ฐ์ง€๋˜๊ณ  REPL์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • InteractiveUtils
    • ํŒจํ‚ค์ง€ ๋ฐ ํ•ด๋‹น ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„์„ ๋ณด๊ณ ํ•˜๊ณ  ์ปดํŒŒ์ผ ๋ฐ ์žฌ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋น„์œจ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋Š” ์ƒˆ๋กœ์šด @time_imports ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.
  • ์„ ํ˜•๋Œ€์ˆ˜ํ•™
    • BLAS ํ•˜์œ„ ๋ชจ๋“ˆ์€ ์ด์ œ ๋ ˆ๋ฒจ 2 BLAS spr! ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • LinearAlgebra.jl ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด์ œ ์†Œ์Šค ์ฝ”๋“œ์™€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ด€์  ๋ชจ๋‘์—์„œ SparseArrays.jl๊ณผ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํฌ์†Œ ๋ฐฐ์—ด์€ Base ๋˜๋Š” LinearAlgebra ๊ฐ์ฒด์— ์ ์šฉ๋œ LinearAlgebra์˜ ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๋” ์ด์ƒ (์•”์‹œ์ ์œผ๋กœ) ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
      • ํŠน์ˆ˜ํ•œ "ํฌ์†Œ" ํ–‰๋ ฌ(์˜ˆ: ๋Œ€๊ฐ์„ )์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๋ฉด ์ด์ œ ์กฐ๋ฐ€ํ•œ ํ–‰๋ ฌ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ getproperty ํ˜ธ์ถœ๋กœ ์ƒ์„ฑ๋œ SVD ๊ฐ์ฒด์˜ D1 ๋ฐ D2 ํ•„๋“œ๋Š” ์ด์ œ ์กฐ๋ฐ€ํ•œ ํ–‰๋ ฌ์ด ๋ฉ๋‹ˆ๋‹ค.
      • ์œ ์‚ฌํ•œ(::SpecialSparseMatrix, ::Type, ::Dims) ๋ฉ”์„œ๋“œ๋Š” ์กฐ๋ฐ€ํ•œ ๋„ ํ–‰๋ ฌ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ 2, 3 ๋ฐ ๋Œ€์นญ ์‚ผ์ค‘๋Œ€๊ฐ ํ–‰๋ ฌ์˜ ๊ณฑ์€ ์กฐ๋ฐ€ํ•œ ํ–‰๋ ฌ์˜ ์ƒ์„ฑ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ (๋น„์ •์ ) ํ–‰๋ ฌ์˜ ํŠน์ˆ˜ "ํฌ์†Œ" ํ–‰๋ ฌ์—์„œ ์„ธ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ํ–‰๋ ฌ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ด์ œ "zero(::Type{Matrix{T}})"๋กœ ์ธํ•ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์‡„
    • %s ๋ฐ %c๋Š” ์ด์ œ textwidth ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ˆ๋น„ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœํ•„
    • CPU ๋กœ๋“œ ํ”„๋กœํŒŒ์ผ๋ง์€ ์ด์ œ ์Šค๋ ˆ๋“œ ๋ฐ ์ž‘์—…์„ ํฌํ•จํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. Profile.print()์—๋Š” ์Šค๋ ˆ๋“œ, ์ž‘์—… ๋˜๋Š” ํ•˜์œ„ ์Šค๋ ˆ๋“œ/์ž‘์—…, ์ž‘์—…/์Šค๋ ˆ๋“œ, ์Šค๋ ˆ๋“œ ๋ฐ ์ž‘์—… ์ธ์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํ•„ํ„ฐ๋ง์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด groupby ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ œ ๊ฐ ์ƒ˜ํ”Œ์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ์œ ํœด ์ƒํƒœ์ธ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋ฅ ์ด ์ „์ฒด ๋˜๋Š” ์Šค๋ ˆ๋“œ๋ณ„๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. Profile.fetch()์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ์˜ ์™ธ๋ถ€ ์†Œ๋น„์ž์™€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด include_meta=false๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ์šด Profile.Allocs ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์˜ ์œ ํ˜•๊ณผ ํฌ๊ธฐ์— ๋Œ€ํ•œ ์Šคํƒ ์ถ”์ ์ด ๊ธฐ๋ก๋˜๋ฉฐ, Sample_rate ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ• ๋‹น ์ˆ˜๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ํ”„๋กœํ•„์„ ๋จผ์ € ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ์ • ๊ธฐ๊ฐ„ CPU ํ”„๋กœํŒŒ์ผ๋ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ–‰ ์ค‘์— ๋ณด๊ณ ์„œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. MacOS ๋ฐ FreeBSD์—์„œ๋Š” ctrl-t๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ SIGINFO๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”. ๋‹ค๋ฅธ ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ SIGUSR1์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. % kill -USR1 $julia_pid. Windows์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ต์ฒด
    • RadioMenu๋Š” ์ด์ œ ์˜ต์…˜์„ ์ง์ ‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • "?(x, y" ๋‹ค์Œ์— Tab ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ธ์ˆ˜ x, y, ....์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. (์•ž์— ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ๋„์›€๋ง ๋ชจ๋“œ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.) "MyModule.?(x, y "๋Š” ๊ฒ€์ƒ‰์„ "MyModule"๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. TAB์„ ๋ˆ„๋ฅด๋ ค๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ์ˆ˜๊ฐ€ Any๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” TAB ๋Œ€์‹  SHIFT-TAB์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ์ „์—ญ ๋ณ€์ˆ˜ err์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ์‘๋‹ต์— ๋Œ€ํ•œ ans์˜ ๋™์ž‘๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ตœ์‹  ์˜ˆ์™ธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. err์„ ์ž…๋ ฅํ•˜๋ฉด ์˜ˆ์™ธ ์ •๋ณด๊ฐ€ ๋‹ค์‹œ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.
  • ์ŠคํŒŒ์Šค๋ฐฐ์—ด
    • SparseArrays ์ฝ”๋“œ๋ฅผ Julia ์ €์žฅ์†Œ์—์„œ ์™ธ๋ถ€ SparseArrays.jl ์ €์žฅ์†Œ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ํ•จ์ˆ˜ sparse_hcat, sparse_vcat ๋ฐ sparse_hvcat๋Š” ์ž…๋ ฅ ์ธ์ˆ˜์˜ ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด SparseMatrixCSC ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” LinearAlgebra.jl ๋ฐ SparseArrays.jl ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•œ ํ›„ ํ–‰๋ ฌ ๊ฒฐํ•ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊น…
    • ํ‘œ์ค€ ๋กœ๊น… ์ˆ˜์ค€ BelowMinLevel, Debug, Info, Warn, Error ๋ฐ AboveMaxLevel์ด ์ด์ œ ํ‘œ์ค€ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • ์œ ๋‹ˆ ์ฝ”๋“œ
    • ์ •๊ทœํ™”๋œ ๋ฌธ์ž์—ด์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  ์œ ๋‹ˆ์ฝ”๋“œ ๋™๋“ฑ์„ฑ์„ ํ™•์ธํ•˜๋Š” isequal_normalized ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ Unicode.normalize ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฌธ์ž ๋งคํ•‘์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Charttransform ํ‚ค์›Œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉฐ, Julia ํŒŒ์„œ๊ฐ€ ์‹๋ณ„์ž๋ฅผ ์ •๊ทœํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋งคํ•‘์„ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Unicode.julia_chartransform ํ•จ์ˆ˜๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • Test
    • ์ด์ œ '@test_throws "some message" Triggers_error()'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์˜ˆ์™ธ ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด ํ‘œ์‹œ๋œ ์˜ค๋ฅ˜ ํ…์ŠคํŠธ์— "some message" ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๊ทœ์‹, ๋ฌธ์ž์—ด ๋ชฉ๋ก ๋ฐ ์ผ์น˜ ํ•จ์ˆ˜๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
    • ์ด์ œ @testset foo()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜์—์„œ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ด๋ฆ„์€ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์—๋Š” ๋ชจ๋“  ์ค‘๊ฐ„ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํฌํ•จํ•˜์—ฌ @test ๋ฐ ๊ธฐํƒ€ @testset ์ •์˜๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • TestLogger ๋ฐ LogRecord๋Š” ์ด์ œ ํ‘œ์ค€ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • ๋ถ„์‚ฐ
    • ์ด์ œ SSHManager๋Š” addprocs() ๋ฉ”์„œ๋“œ์™€ shell=:csh ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด csh/tcsh ๋ž˜ํผ๊ฐ€ ์žˆ๋Š” ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐํƒ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ
    • GC.enable_logging(true)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜์ง‘๋œ ๋ฉ”๋ชจ๋ฆฌ ์–‘ ๋ฐ ์‹œ๊ฐ„๊ณผ ํ•จ๊ป˜ ๊ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ์ž‘์—…์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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