ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Julia 1.9 ์‚ฌ์šฉ ๊ฐ€๋Šฅ

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

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

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

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

  • ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ
    • "setproperty!(::Module, ::Symbol, x)"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ตœ์ข… ์œ„์น˜๊ฐ€ ์•„๋‹Œ ๋‹ค์ค‘ ํ• ๋‹น์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด "a, b..., c = 1, 2, 3, 4"๋Š” "a = 1; bโ€ฆ, = 2, 3; c = 4". ์ด๋Š” Base.split_rest๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ผ ๋ฌธ์ž ๋ฆฌํ„ฐ๋Ÿด์€ ์ด์ œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ๊ตฌ๋ฌธ์€ Char ์œ ํ˜•์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ž˜๋ชป๋œ UTF-8 ์‹œํ€€์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์œ ๋‹ˆ์ฝ”๋“œ 15 ์‚ฌ์–‘์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ํŠœํ”Œ๊ณผ ๋ช…๋ช…๋œ ๋ฌธ์ž ํŠœํ”Œ์˜ ์ค‘์ฒฉ๋œ ์กฐํ•ฉ์„ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋‹จ๋…์œผ๋กœ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋‚ด์žฅ ํ•จ์ˆ˜ "getglobal(::Module, ::Symbol[, order])" ๋ฐ "setglobal!(::Module, ::Symbol, x[, order])". ์ด์ œ ์ „์—ญ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ๋•Œ getfield ๋ฉ”์„œ๋“œ๋ณด๋‹ค getglobal ๋ฉ”์„œ๋“œ๋ฅผ ์„ ํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์–ธ์–ด ๋ณ€๊ฒฝ
    • ์ด์ œ ๋ฒ„์ „ 1.7์— ๋„์ž…๋œ "@invoke" ๋งคํฌ๋กœ๋ฅผ ๋‚ด๋ณด๋‚ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ œ "x" ์ธ์ˆ˜์— ๋Œ€ํ•ด ์œ ํ˜• ์ฃผ์„์ด ์ƒ๋žต๋œ ๊ฒฝ์šฐ "Any" ๋Œ€์‹  "Core.Typeof(x)" ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ์œ ํ˜•์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„์ „ 1.7์— ๋„์ž…๋œ "invokelatest" ํ•จ์ˆ˜์™€ "@invokelatest" ๋งคํฌ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ/๋Ÿฐํƒ€์ž„ ๊ฐœ์„ 
    • ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰๊นŒ์ง€์˜ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค(TTFX - ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰๊นŒ์ง€์˜ ์‹œ๊ฐ„). ์ด์ œ ํŒจํ‚ค์ง€ ์‚ฌ์ „ ์ปดํŒŒ์ผ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ "pkgimage"์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์ „ ์ปดํŒŒ์ผ ์ค‘์— ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "--pkgimages=no" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด pkgimages ๋ชจ๋“œ ์‚ฌ์šฉ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์œ ํ˜• ์ถ”๋ก ์˜ XNUMX์ฐจ ๋ณต์žก์„ฑ์ด๋ผ๋Š” ์•Œ๋ ค์ง„ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”๋ก ์€ ๋” ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ƒ์„ฑ๋œ ๊ธด ํ•จ์ˆ˜(์˜ˆ: ํŽธ๋ฏธ๋ถ„ ๋ฐฉ์ •์‹ ๋ฐ ๋Œ€๊ทœ๋ชจ ์ธ๊ณผ ๋ชจ๋ธ์ด ํฌํ•จ๋œ ModelingToolkit.jl)๊ฐ€ ์žˆ๋Š” ์ผ๋ถ€ ๊ทน๋‹จ์ ์ธ ์‚ฌ๋ก€๋Š” ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.
    • ์œ ํ˜•๋ณ„ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ˜ธ์ถœ์€ ์ด์ œ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋””์ŠคํŒจ์น˜ ํ›„๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฝ์ž… ๋˜๋Š” ์ •์  ํ•ด๊ฒฐ์„ ์œ„ํ•ด ํ†ตํ•ฉ ๋ถ„ํ•  ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "@nospecialize-d" ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ์ •์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ์žฌ์ปดํŒŒ์ผ์„ ๋ฐฉ์ง€ํ•จ์œผ๋กœ์จ ๊ฐœ์ฒด ์œ ํ˜•์ด ์™„์ „ํžˆ ์ •์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ํŠน์ • ์ƒํ™ฉ์—์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ ๋ชจ๋“ˆ์—์„œ @pure ๋งคํฌ๋กœ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์€ Base.@assume_ํšจ๊ณผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ f(args...)์— ์‚ฌ์šฉ๋˜๋Š” ์œ ํ˜•๋ณด๋‹ค ๋œ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ(f, Invokesig, args...)์„ ํ˜ธ์ถœํ•˜๋ฉด ๋” ์ด์ƒ ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ
    • Linux ๋ฐ Windows์—์„œ "--threads=auto" ์˜ต์…˜์€ ์ด์ œ CPU ์„ ํ˜ธ๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์„œ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ HPC ๋ฐ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์„ค์ •๋˜๋Š” ๋งˆ์Šคํฌ์ž…๋‹ˆ๋‹ค.
    • "--math-mode=fast" ์˜ต์…˜์ด ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์˜๋ฏธ๊ฐ€ ์ž˜ ์ •์˜๋œ "@fastmath" ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    • "--threads" ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ˜•์‹์€ ์ด์ œ "auto | N[,auto|M]", ์—ฌ๊ธฐ์„œ M์€ ์ƒ์„ฑํ•  ๋Œ€ํ™”ํ˜• ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ์ž๋™์€ 1์„ ์˜๋ฏธํ•จ).
    • "--heap-size-hint= ์˜ต์…˜์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ€๋Š” ํ™œ์„ฑ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ์‹œ์ž‘๋˜๋Š” ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” ๋ฐ”์ดํŠธ, ํ‚ฌ๋กœ๋ฐ”์ดํŠธ(1000KB), ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ(300MB) ๋˜๋Š” ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ(1,5GB)๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ณ€๊ฒฝ ์‚ฌํ•ญ
    • "Threads.@spawn"์—๋Š” ์ด์ œ ":default" ๋˜๋Š” ":interactive"๋ผ๋Š” ์„ ํƒ์  ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ์ž‘์—…์—๋Š” ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์˜ ์‘๋‹ต์ด ํ•„์š”ํ•˜๋ฉฐ ์งง๊ฑฐ๋‚˜ ์ž์ฃผ ์ˆ˜ํ–‰๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ์ž‘์—…์€ Julia๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ง€์ •๋œ ๊ฒฝ์šฐ ๋Œ€ํ™”ํ˜• ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • Julia ๋Ÿฐํƒ€์ž„ ์™ธ๋ถ€(์˜ˆ: C ๋˜๋Š” Java)์—์„œ ์‹œ์ž‘๋œ ์Šค๋ ˆ๋“œ๋Š” ์ด์ œ "jl_adopt_thread"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Julia ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "cfunction" ๋˜๋Š” "@ccallable" ์ง„์ž…์ ์„ ํ†ตํ•ด Julia ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด์ œ ์Šค๋ ˆ๋“œ ์ˆ˜๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ
    • ์ƒˆ๋กœ์šด "Iterators.Flatmap" ๊ธฐ๋Šฅ.
    • ์ƒˆ๋กœ์šด "pkgversion(m::Module)" ํ•จ์ˆ˜๋Š” "pkgdir(m::Module)"๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํŠน์ • ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•œ ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • "reduce(hcat, x::Vector{<:Vector})"๋ฅผ ๋ชจ๋“  ์ฐจ์›์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜๊ณ  ๋ฐ˜๋ณต์ž์˜ ๋ฐ˜๋ณต์ž๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด "stack(x)" ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. "stack(f, x)" ๋ฉ”์„œ๋“œ๋Š” "mapreduce(f, hcat, x)"๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๋ฉฐ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
    • ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ „์ฒด ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด "@allocations"์™€ ์œ ์‚ฌํ•œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ "@allocations"๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.
  • ๋„์„œ๊ด€์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ
    • "RoundFromZero"๋Š” ์ด์ œ "BigFloat" ์ด์™ธ์˜ ์œ ํ˜•์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ œ "Dict"๋ฅผ "sizehint!"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ "@time"์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„์˜ ๋น„์œจ์„ ๋ณ„๋„๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ
    • Dict ๋ฐ ๊ธฐํƒ€ ํŒŒ์ƒ ๊ฐœ์ฒด(์˜ˆ: ํ‚ค(::Dict), ๊ฐ’(::Dict) ๋ฐ Set)์— ๋Œ€ํ•œ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ์˜ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ๋Š” ์ด์ œ ์‚ฌ์ „์ด๋‚˜ ์ง‘ํ•ฉ์„ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์ด ์—†๋Š” ํ•œ ๋ฌด์ œํ•œ์˜ ์Šค๋ ˆ๋“œ์—์„œ Dict ๋˜๋Š” Set์— ๋Œ€ํ•ด ๋ณ‘๋ ฌ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ์กฐ๊ฑด์ž ํ•จ์ˆ˜ "!f"๋ฅผ ๋ถ€์ •ํ•˜๋ฉด ์ต๋ช… ํ•จ์ˆ˜ ๋Œ€์‹  ๋ณตํ•ฉ ํ•จ์ˆ˜ "(!) DF"๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
    • ์ฐจ์› ์กฐ๊ฐ ํ•จ์ˆ˜๋Š” ์ด์ œ ์—ฌ๋Ÿฌ ์ฐจ์›์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. "eachslice", "eachrow" ๋ฐ "eachcol"์€ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ—ˆ์šฉํ•˜๋Š” "Slices" ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณต๊ฐœ API์— "@kwdef" ๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • "fld1"์˜ ์ž‘์—… ์ˆœ์„œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ์ •๋ ฌ์€ ํ•ญ์ƒ ์‹œ๊ฐ„์— ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค(QuickSort๋ฅผ ์žฌ์„ค๊ณ„).
    • ์ด์ œ "Base.splat"์ด ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ "Base.Splat" ์œ ํ˜•์ด๋ฏ€๋กœ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž
    • "ํŒจํ‚ค์ง€ ํ™•์žฅ": Julia ์„ธ์…˜์— ๋กœ๋“œ๋œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ฝ”๋“œ ์กฐ๊ฐ ๋กœ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ "Requires.jl" ํŒจํ‚ค์ง€์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์‚ฌ์ „ ์ปดํŒŒ์ผ ๋ฐ ๊ตฌ์„ฑ ํ˜ธํ™˜์„ฑ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • ์„ ํ˜•๋Œ€์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ์š”์†Œ๋ณ„ ๋ถ„ํ• ๊ณผ์˜ ํ˜ผ๋™ ์œ„ํ—˜์œผ๋กœ ์ธํ•ด ์Šค์นผ๋ผ "a" ๋ฐ ๋ฒกํ„ฐ "b"๊ฐ€ ํฌํ•จ๋œ "a / b" ๋ฐ "b \ a" ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "a * pinv(b)"์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    • BLAS ๋ฐ LAPACK ํ˜ธ์ถœ์€ ์ด์ œ "libblastrampoline(LBT)"์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. OpenBLAS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€๋งŒ ๋‹ค๋ฅธ BLAS/LAPACK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  LBT ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ BLAS/LAPACK์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ๋กœ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    • "lu"๋Š” ์ƒˆ๋กœ์šด ์‚ฐ์ˆ  ์œ ํ˜• ๋ฐ ๊ต์œก ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด XNUMX์ด ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ ํšŒ์ „ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ์ƒˆ๋กœ์šด "RowNonZero()" ํ–‰๋ ฌ ํšŒ์ „ ์ „๋žต์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • "normalize(x, p=2)"๋Š” ์ด์ œ ์Šค์นผ๋ผ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ •๊ทœํ™”๋œ ๋ฒกํ„ฐ ๊ณต๊ฐ„ "x"๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ œ ๊ธฐ๋ณธ BLAS ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ARM ์•„ํ‚คํ…์ฒ˜์˜ CPU ์Šค๋ ˆ๋“œ ์ˆ˜์™€ ๋™์ผํ•˜๊ณ  ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์˜ CPU ์Šค๋ ˆ๋“œ ์ˆ˜์˜ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค.
  • Printf: ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์žฌ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœํ•„: Chrome์—์„œ ์ง€์›ํ•˜๋Š” JSON ๊ธฐ๋ฐ˜ ".heapsnapshot" ํ˜•์‹์œผ๋กœ ํŒŒ์ผ์„ ์บก์ฒ˜ํ•˜๋Š” ์ƒˆ๋กœ์šด "Profile.take_heap_snapshot(file)" ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • Random: ์ด์ œ randn ๋ฐ randexp๊ฐ€ rand๋ฅผ ์ •์˜ํ•˜๋Š” ๋ชจ๋“  AbstractFloat ์œ ํ˜•์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ต์ฒด
    • ์ด์ œ "Alt-e" ํ‚ค ์กฐํ•ฉ์„ ๋ˆ„๋ฅด๋ฉด ํŽธ์ง‘๊ธฐ์—์„œ ํ˜„์žฌ ์ž…๋ ฅ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ (๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ)๋Š” ํŽธ์ง‘๊ธฐ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • REPL์—์„œ ํ™œ์„ฑํ™”๋œ ํ˜„์žฌ ๋ชจ๋“ˆ ์ปจํ…์ŠคํŠธ๋Š” "REPL.activate(::Module)" ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ REPL์— ๋ชจ๋“ˆ์„ ์ž…๋ ฅํ•˜๊ณ  "Alt-m" ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ Main). ์ฝค๋น„๋„ค์ด์…˜.
    • ๊ฐ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ์ˆซ์ž๋ฅผ ์ธ์‡„ํ•˜๊ณ  ํ‰๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ Out์— ์ €์žฅํ•˜๋Š” "๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ํ”„๋กฌํ”„ํŠธ" ๋ชจ๋“œ๋Š” "REPL.numbered_prompt!()"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํƒญ ์™„์„ฑ์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • SuiteSparse: "SuiteSparse" ์†”๋ฒ„์˜ ์ฝ”๋“œ๋ฅผ "SparseArrays.jl"๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์†”๋ฒ„๋Š” "SuiteSparse.jl"์— ์˜ํ•ด ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • ์ŠคํŒŒ์Šค๋ฐฐ์—ด
    • ์ด์ œ SuiteSparse ์†”๋ฒ„๋ฅผ SparseArrays์˜ ํ•˜์œ„ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • UMFPACK ๋ฐ CHOLMOD ์ŠคํŠธ๋ฆผ ๋ณดํ˜ธ ๋ชจ๋“œ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ "ldiv!" ์ด์ œ UMFPACK ๊ฐœ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‹คํ—˜์  ํ•จ์ˆ˜ "SparseArrays.allowscalar(::Bool)"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ์†Œ ๋ฐฐ์—ด์˜ ์Šค์นผ๋ผ ์ธ๋ฑ์‹ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์„ฑ๋Šฅ ๋ฌธ์ œ์˜ ์ผ๋ฐ˜์ ์ธ ์›์ธ์ธ "SparseMatrixCSC" ๊ฐ์ฒด์˜ ๋ฌด์ž‘์œ„ ์Šค์นผ๋ผ ์ธ๋ฑ์‹ฑ์„ ๊ฐ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํŒจ ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์กฐ๊ธฐ์— ์ข…๋ฃŒํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ชจ์Œ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์žฅ์•  ์กฐ์น˜ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. "@testset kwarg failurefast=true" ๋˜๋Š” "export JULIA_TEST_FAILFAST=true"๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•˜์„ธ์š”. ์ด๋Š” CI ์‹คํ–‰ ์‹œ ์ดˆ๊ธฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ ์งœ: ๋นˆ ๋ฌธ์ž์—ด์€ ๋” ์ด์ƒ ์œ ํšจํ•œ "DateTime", "Dates" ๋˜๋Š” "Times" ๊ฐ’์œผ๋กœ ์ž˜๋ชป ๊ตฌ๋ฌธ ๋ถ„์„๋˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์‹  ์ƒ์„ฑ์ž ๋ฐ ๊ตฌ๋ฌธ ๋ถ„์„์—์„œ "ArgumentError" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ "tryparse"๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ถ„์‚ฐ ํŒจํ‚ค์ง€
    • ์ด์ œ ๋กœ์ปฌ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด(์˜ˆ: "addprocs(N::Int)" ๋˜๋Š” ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ "-procs=N") ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ(ํ™œ์„ฑ ํ”„๋กœ์ ํŠธ, "LOAD_PATH", "DEPOT_PATH")์ด ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.
    • ๋กœ์ปฌ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ "addprocs"๋Š” ์ด์ œ "env"๋ผ๋Š” ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ๋‹ˆ์ฝ”๋“œ: "graphemes(s, m:n)"์€ "s"์˜ m๋ฒˆ์งธ๋ถ€ํ„ฐ n๋ฒˆ์งธ ๋ฌธ์ž์†Œ๊นŒ์ง€์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • DelimitedFiles ํŒจํ‚ค์ง€๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ์ข…์†์„ฑ
    • Linux๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ libstdc++์˜ ๋ฒ„์ „์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ตœ์‹  ๋ฒ„์ „์ธ ๊ฒฝ์šฐ ์ด๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ฒ„์ „์— ๊ด€๊ณ„์—†์ด ๋‚ด์žฅ๋œ libstdc++๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ด์ „ ๋™์ž‘์€ "JULIA_PROBE_LIBSTDCXX=0" ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • "RUNPATH" ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์ง€ ๋ชปํ•œ Linux์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” "RPATH"๋ฅผ julia ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋„๊ตฌ ๊ฐœ์„ : ์ด์ œ "MethodError" ๋ฐ ๋ฉ”์„œ๋“œ(์˜ˆ: "methods(my_func)")์˜ ์ถœ๋ ฅ์ด ์Šคํƒ ์ถ”์ ์—์„œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ํ˜•์‹์ด ์ง€์ •๋˜๊ณ  ์ƒ‰์ƒ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

    ์ถœ์ฒ˜ : opennet.ru

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