GraalVM виртуал машины 19.3.0 хувилбар болон түүн дээр суурилсан Python, JavaScript, Ruby болон R-ийн хэрэгжилт

Oracle компани Нийтлэгдсэн бүх нийтийн виртуал машиныг гаргах GraalVM 19.3.0, JavaScript (Node.js), Python, Ruby, R, JVM-д зориулсан дурын хэл (Java, Scala, Clojure, Kotlin) болон LLVM бит код үүсгэж болох хэл (C, C++) дээр ажиллаж байгаа програмуудыг дэмждэг. , Зэв). 19.3 салбар нь Урт хугацааны дэмжлэг (LTS) хувилбар болон ангилагдсан гайхалтай дэмжлэг үзүүлэх JDK11, үүнд Java кодыг гүйцэтгэгдэх файл болгон хөрвүүлэх чадвар (GraalVM Native Image). Төслийн код тараасан GPLv2 дагуу лицензтэй. Үүний зэрэгцээ GraalVM ашиглан Python, JavaScript, Ruby, R хэлний программуудын шинэ хувилбарууд гарсан. GraalPython, GraalJS, TruffleRuby и FastR.

GraalVM олгодог JIT хөрвүүлэгч нь JavaScript, Ruby, Python, R зэрэг JVM дээр ямар ч скрипт хэлнээс кодыг шууд ажиллуулж, LLVM бит код болгон хөрвүүлсэн JVM дээр эх кодыг ажиллуулах боломжтой болгодог. GraalVM-ийн өгсөн хэрэгслүүд нь хэлээс хамааралгүй дибаглагч, профайл үүсгэх систем, санах ойн хуваарилалтын анализатор зэргийг агуулдаг. GraalVM нь өөр хэл дээрх бүрэлдэхүүн хэсгүүдтэй хавсарсан програмуудыг үүсгэх боломжийг олгож, бусад хэл дээрх кодоос объект, массив руу хандах боломжийг олгодог. JVM дээр суурилсан хэлнүүдийн хувьд байдаг боломж Хамгийн бага санах ойн зарцуулалтаар шууд гүйцэтгэх боломжтой машины код болгон хөрвүүлсэн гүйцэтгэх файлуудыг үүсгэх (санах ой болон урсгалын удирдлагыг хүрээг холбох замаар хэрэгжүүлдэг) Субстрат VM).

GraalJS-д гарсан өөрчлөлтүүд:

  • Node.js 12.10.0-тэй нийцэж байгаа эсэх;
  • Стандарт бус глобал шинж чанарууд болон функцууд нь анхдагчаар идэвхгүй байна:
    global (globalThis-ээр солигдсон, js.global-property-г буцаахаар тохируулсан), гүйцэтгэл (js.performance), хэвлэх болон printErr (js.print);

  • ECMAScript 2020 горимд ашиглах боломжтой Promise.allSettled болон хүчингүй болсон нэгтгэх саналыг хэрэгжүүлсэн (“-js.ecmascript-version=2020”);
  • ICU4J хамаарлыг 64.2, ASM-г 7.1 болгон шинэчилсэн.

Өөрчлөлтүүд GraalPython дээр:

  • Нэмсэн stub gc.{enable, disable,isenabled}, хэрэгжсэн charmap_build, sys.hexversion болон _lzma;
  • Python 3.7.8 стандарт номын сан шинэчлэгдсэн;
  • NumPy 1.16.4 болон Pandas 0.25.0-д зориулсан дэмжлэг нэмэгдсэн;
  • Цагийн дэмжлэг нэмсэн;
  • socket.socket нь "graalpython -m http.server"-ийг ажиллуулж, шифрлэгдээгүй (TLS-гүй) http нөөцийг ачаалах боломжийг олгодог байдалд хүргэсэн;
  • Pandas.DataFrame объектуудыг харуулахтай холбоотой асуудлыг зассан.
    байт дахь залгууруудын буруу боловсруулалт.startswith,
    давтагчийн хуваарилалтыг устгах, толь бичигт dict.__contains__ ашиглах;

  • ast.PyCF_ONLY_AST-ийн дэмжлэгийг нэмсэн зөвшөөрсөн pytest ажиллаж байгаа эсэхийг шалгах;
  • Нэмсэн дэмжлэг PEP 498 (загвар утгын интерполяци);
  • Хэрэгжүүлсэн ердийн Python импортын синтакс ашиглан JVM ангиудыг импортлох "--python.EmulateJython" туг ба Python кодоос JVM үл хамаарах зүйлсийг барих;
  • Сайжруулсан задлан шинжлэлийн гүйцэтгэл, онцгой тохиолдлын кэш,
    JVM кодоос Python объектуудад хандах. Python код болон үндсэн өргөтгөлүүдийн гүйцэтгэлийн туршилтын үр дүн сайжирсан (llvm дээр уугуул өргөтгөлүүдийг ажиллуулах нь llvm биткодын GraalVM-д JIT эмхэтгэлд шилжсэн гэсэн үг).

Өөрчлөлтүүд TruffleRuby-д:

  • Уугуул өргөтгөлүүдийг эмхэтгэхийн тулд одоо суурилагдсан LLVM хэрэгслийг ашиглаж, эх код болон биткодыг хоёуланг нь үүсгэж байна. Энэ нь илүү олон уугуул өргөтгөлүүдийг хайрцагнаас гаргаж эмхэтгэх ёстой гэсэн үг бөгөөд ихэнх холболтын асуудлуудыг арилгана;
  • TruffleRuby дээр уугуул өргөтгөлүүдийг суулгахын тулд тусдаа LLVM суулгац;
  • TruffleRuby дээр C++ өргөтгөлүүдийг суулгахад libc++ болон libc++abi-г суулгах шаардлагагүй болсон;
  • Лицензийг EPL 2.0/GPL 2.0/LGPL 2.1 болгон шинэчилсэн, сүүлийн үеийн JRuby-тэй адил;
  • GC.stat-д нэмэлт аргументуудын дэмжлэгийг нэмсэн;
  • Kernel#load аргыг боодолтой, Kernel#spawn аргыг :chdir;
  • Нэмсэн rb_str_drop_bytes, учир нь OpenSSL үүнийг ашигладаг;
  • Rails 6-д шинэ төмөр замд шаардлагатай урьдчилан суулгасан үнэт чулуунуудын өргөтгөлүүдийг багтаасан болно;
  • Төрөлхийн өргөтгөлүүдийг эмхэтгэхийн тулд MRI шиг тугуудыг ашигладаг;
  • Гүйцэтгэлийг оновчтой болгож, санах ойн хэрэглээг багасгасан.

Өөрчлөлтүүд FastR-д:

  • R 3.6.1-тэй нийцэж байгаа эсэх;
  • LLVM дээр суурилсан уугуул өргөтгөлүүдийг ажиллуулах урьдчилсан дэмжлэгийг нэмсэн. Төрөл бүрийн R багцуудыг бүтээхдээ FastR нь GraalVM-ийн суурилуулсан LLVM хэрэгслийг ашиглахаар тохируулагдсан байдаг. Үүссэн хоёртын файлууд нь эх код болон LLVM биткодыг хоёуланг нь агуулна.

    Урьдчилан суулгасан багцуудыг мөн ийм байдлаар бүтээдэг.
    FastR нь үндсэн өргөтгөлийн кодыг ачаалж, ажиллуулдаг боловч "--R.BackEnd=llvm" сонголтоор эхлүүлэхэд бит кодыг ашиглах болно. "--R.BackEndLLVM=pkg1,pkg2"-г зааж өгснөөр LLVM арын хэсгийг зарим R багцад сонгон ашиглаж болно. Хэрэв танд багц суулгахад асуудал гарвал fastr.setToolchain("native") руу залгаж эсвэл $FASTR_HOME/etc/Makeconf файлыг гараар засварлаж бүгдийг буцаах боломжтой;

  • Энэ хувилбарт FastR нь GCC-ийн ажиллах цагийн номын сангүйгээр илгээгддэг;
  • Тогтмол санах ойн алдагдал;
  • Том векторуудтай ажиллахад гарсан асуудлуудыг зассан (>1 ГБ);
  • grepRaw-г хэрэгжүүлсэн, гэхдээ зөвхөн fixed=T-д зориулагдсан.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх