GraalVM ๊ฐ€์ƒ ๋จธ์‹  ๋ฆด๋ฆฌ์Šค 19.3.0 ๋ฐ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Python, JavaScript, Ruby ๋ฐ R ๊ตฌํ˜„

์˜ค๋ผํด ํšŒ์‚ฌ ะพะฟัƒะฑะปะธะบะพะฒะฐะปะฐ ๋ฒ”์šฉ ๊ฐ€์ƒ ๋จธ์‹  ์ถœ์‹œ ๊ทธ๋ž„VM 19.3.0, ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‰ะตะน ะทะฐะฟัƒัะบ ะฟั€ะธะปะพะถะตะฝะธะน ะฝะฐ JavaScript (Node.js), Python, Ruby, R, ะปัŽะฑั‹ั… ัะทั‹ะบะฐั… ะดะปั JVM (Java, Scala, Clojure, Kotlin) ะธ ัะทั‹ะบะฐั…, ะดะปั ะบะพั‚ะพั€ั‹ั… ะผะพะถะตั‚ ั„ะพั€ะผะธั€ะพะฒะฐั‚ัŒัั ะฑะธั‚ะบะพะด LLVM (C, C++, Rust). ะ’ะตั‚ะบะฐ 19.3 ะพั‚ะฝะตัะตะฝะฐ ะบ ะบะฐั‚ะตะณะพั€ะธะธ ะฒั‹ะฟัƒัะบะพะฒ ั ะดะปะธั‚ะตะปัŒะฝั‹ะผ ัั€ะพะบะพะผ ะฟะพะดะดะตั€ะถะบะธ (LTS) ะธ ๋†€๋ž„ ๋งŒํ•œ ์ง€์›ํ•˜๋‹ค JDK11, Java ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํŒŒ์ผ(GraalVM ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€)๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฐฐํฌ์ž GPLv2์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— GraalVM์„ ์‚ฌ์šฉํ•˜๋Š” Python, JavaScript, Ruby ๋ฐ R ์–ธ์–ด ๊ตฌํ˜„์˜ ์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GraalPython, GraalJS, ํŠธ๋Ÿฌํ”Œ๋ฃจ๋น„ ะธ FastR.

๊ทธ๋ž„VM ์ œ๊ณต JavaScript, Ruby, Python ๋ฐ R์„ ํฌํ•จํ•˜์—ฌ JVM์—์„œ ์ฆ‰์‹œ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  LLVM ๋น„ํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ JVM์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” JIT ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. GraalVM์—์„œ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ์—๋Š” ์–ธ์–ด ๋…๋ฆฝ์ ์ธ ๋””๋ฒ„๊ฑฐ, ํ”„๋กœํŒŒ์ผ๋ง ์‹œ์Šคํ…œ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ถ„์„๊ธฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. GraalVM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์–ธ์–ด์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ฒฐํ•ฉ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ฝ”๋“œ์—์„œ ๊ฐœ์ฒด ๋ฐ ๋ฐฐ์—ด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JVM ๊ธฐ๋ฐ˜ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ๊ธฐํšŒ ์ตœ์†Œํ•œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋กœ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋œ ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ(๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ๊ตฌํ˜„๋จ) ๊ธฐํŒ VM).

GraalJS์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • Node.js 12.10.0๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋น„ํ‘œ์ค€ ์ „์—ญ ์†์„ฑ ๋ฐ ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ „์—ญ(globalThis๋กœ ๋Œ€์ฒด, js.global-property๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •), ์„ฑ๋Šฅ(js.performance), print ๋ฐ printErr(js.print);

  • ECMAScript 2020 ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Promise.allSettled ๋ฐ nullish ํ†ตํ•ฉ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(โ€œ-js.ecmascript-version=2020โ€).
  • ์ข…์†์„ฑ ICU4J๋ฅผ 64.2๋กœ, ASM์„ 7.1๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ GraalPython์—์„œ:

  • gc.{enable,disable,isenabled} ์Šคํ…์„ ์ถ”๊ฐ€ํ•˜๊ณ  charmap_build, sys.hexversion ๋ฐ _lzma๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Python 3.7.8 ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • NumPy 1.16.4 ๋ฐ Pandas 0.25.0์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ะ”ะพะฑะฐะฒะปะตะฝะฐ ะฟะพะดะดะตั€ะถะบะฐ timeit;
  • ์†Œ์ผ“.socket์€ "graalpython -m http.server"๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€(TLS ์—†์ด) http ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • pandas.DataFrame ๊ฐœ์ฒด ํ‘œ์‹œ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    bytes.startswith์˜ ํŠœํ”Œ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋ฐ˜๋ณต์ž์˜ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ๋ฐ ์‚ฌ์ „์— ๋Œ€ํ•œ dict.__contains__ ์‚ฌ์šฉ;

  • ast.PyCF_ONLY_AST์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ ๋œ pytest๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ์ถ”๊ฐ€๋จ ์ง€์› PEP 498(๋ฆฌํ„ฐ๋Ÿด์˜ ๋ฌธ์ž์—ด ๋ณด๊ฐ„);
  • ๊ตฌํ˜„ ์ผ๋ฐ˜ Python ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ JVM ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  Python ์ฝ”๋“œ์—์„œ JVM ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๋Š” "--python.EmulateJython" ํ”Œ๋ž˜๊ทธ
  • ะฃะปัƒั‡ัˆะตะฝะฐ ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฟะฐั€ัะตั€ะฐ, ะบะตัˆะธั€ะพะฒะฐะฝะธั ะธัะบะปัŽั‡ะตะฝะธะน,
    JVM ์ฝ”๋“œ์—์„œ Python ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. Python ์ฝ”๋“œ ๋ฐ ๊ธฐ๋ณธ ํ™•์žฅ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(llvm ์œ„์—์„œ ๊ธฐ๋ณธ ํ™•์žฅ์„ ์‹คํ–‰ํ•˜๋ฉด ๋น„ํŠธ์ฝ”๋“œ llvm์ด JIT ์ปดํŒŒ์ผ์„ ์œ„ํ•ด GraalVM์— ์ „๋‹ฌ๋จ์„ ์˜๋ฏธํ•จ).

๋ณ€๊ฒฝ ์‚ฌํ•ญ ํŠธ๋Ÿฌํ”Œ๋ฃจ๋น„์—์„œ:

  • ๊ธฐ๋ณธ ํ™•์žฅ์„ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด ์ด์ œ ๋‚ด์žฅ๋œ LLVM ํˆดํ‚ท์ด ์‚ฌ์šฉ๋˜์–ด ๊ธฐ๋ณธ ์ฝ”๋“œ์™€ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋” ๋งŽ์€ ๊ธฐ๋ณธ ํ™•์žฅ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ๋Œ€๋ถ€๋ถ„์˜ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • TruffleRuby์— ๊ธฐ๋ณธ ํ™•์žฅ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ LLVM ์„ค์น˜;
  • TruffleRuby์— C++ ํ™•์žฅ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ ๋” ์ด์ƒ libc++ ๋ฐ libc++abi๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ตœ์‹  JRuby์™€ ๋™์ผํ•˜๊ฒŒ EPL 2.0/GPL 2.0/LGPL 2.1๋กœ ๋ผ์ด์„ผ์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • GC.stat์— ์„ ํƒ์  ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kernel#load ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  :chdir์„ ์‚ฌ์šฉํ•˜์—ฌ Kernel#spawn์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • rb_str_drop_bytes๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, ์ด๋Š” OpenSSL์ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.
  • Rails 6์˜ ์ƒˆ๋กœ์šด ๋ ˆ์ผ์— ํ•„์š”ํ•œ ์‚ฌ์ „ ์„ค์น˜๋œ gem์˜ ํ™•์žฅ์ด ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ํ™•์žฅ์„ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด MRI์—์„œ์™€ ๊ฐ™์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ FastR์—์„œ:

  • R 3.6.1๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  • LLVM ๊ธฐ๋ฐ˜ ๊ธฐ๋ณธ ํ™•์žฅ ์‹คํ–‰์— ๋Œ€ํ•œ ์˜ˆ๋น„ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ R ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ FastR์€ GraalVM์˜ ๋‚ด์žฅ LLVM ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์™€ LLVM ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์ „ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋„ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค.
    FastR์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ํ™•์žฅ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜์ง€๋งŒ "--R.BackEnd=llvm" ์˜ต์…˜์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. LLVM ๋ฐฑ์—”๋“œ๋Š” "--R.BackEndLLVM=pkg1,pkg2"๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ผ๋ถ€ R ํŒจํ‚ค์ง€์— ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์„ค์น˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ fastr.setToolchain("native")์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ $FASTR_HOME/etc/Makeconf ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์—์„œ FastR์€ GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํฐ ๋ฒกํ„ฐ(>1GB)๋กœ ์ž‘์—…ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • grepRaw๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ,fixed=T์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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