ΠžΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ QEMU ΠΈ FFmpeg ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» JavaScript-Π΄Π²ΠΈΠΆΠΎΠΊ QuickJS

Ѐранцузский ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊ Ѐабрис Π‘Π΅Π»Π»Π°Ρ€ (Fabrice Bellard), основавший Π² своС врСмя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ QEMU ΠΈ FFmpeg, Π° Ρ‚Π°ΠΊΠΆΠ΅ создавший ΡΠ°ΠΌΡƒΡŽ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ вычислСния числа Пи ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ BPG, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ выпуск Π½ΠΎΠ²ΠΎΠ³ΠΎ JavaScript-Π΄Π²ΠΈΠΆΠΊΠ° QuickJS. Π”Π²ΠΈΠΆΠΎΠΊ отличаСтся ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° встраиваниС Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ систСмы. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° написан Π½Π° языкС Π‘ΠΈ ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT. Π’Π°ΠΊΠΆΠ΅ доступна сборка Π΄Π²ΠΈΠΆΠΊΠ°, скомпилированная Π² WebAssembly ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Emscripten ΠΈ пригодная для выполнСния Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ….

РСализация JavaScript ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ES2019, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, асинхронныС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ прокси. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ нСстандартныС матСматичСскиС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для JavaScript, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹ BigInt ΠΈ BigFloat, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². По ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ QuickJS сущСствСнно прСвосходит ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² тСстС
bench-v8 ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°Π΅Ρ‚ Π΄Π²ΠΈΠΆΠΎΠΊ XS Π½Π° 35%, DukTape Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² Π΄Π²Π° Ρ€Π°Π·Π°, JerryScript Π² Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°, Π° MuJS Π² сСмь Ρ€Π°Π·.

ΠšΡ€ΠΎΠΌΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для встраивания Π΄Π²ΠΈΠΆΠΊΠ° Π² прилоТСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ прСдлагаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ qjs, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для запуска JavaScript-ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, доступСн компилятор qjsc, способный Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹Π΅ для обособлСнного запуска исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности:

  • ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ простота встраивания Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Код Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ лишь нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° языкС Π‘ΠΈ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… для сборки Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 190 Кб;
  • ΠžΡ‡Π΅Π½ΡŒ высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°Π»ΠΎΠ΅ врСмя запуска. ΠŸΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ 56 тысяч тСстов Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ECMAScript Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 100 сСкунд ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ядрС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ПК. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ runtime Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΅ 300 микросСкунд;
  • ΠŸΠΎΡ‡Ρ‚ΠΈ полная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° спСцификации ES2019 ΠΈ полная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прилоТСния «B», ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для совмСстимости со старыми web-прилоТСниями;
  • ПолноС ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ всСх тСстов ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ECMAScript Test Suite;
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° компиляции ΠΊΠΎΠ΄Π° Π½Π° языкС Javascript Π² исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π±Π΅Π· Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй;
  • Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Π½Π° основС подсчёта ссылок Π±Π΅Π· Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π½ΠΎΠ³ΠΎ выполнСния чистки, позволивший Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ прСдсказуСмого повСдСния ΠΈ сниТСния потрСблСния памяти;
  • Набор Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ для матСматичСских вычислСний Π½Π° языкС JavaScript;
  • ΠžΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° для выполнСния ΠΊΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ ΠΊΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΡƒΡŽ подсвСтку ΠΊΠΎΠ΄Π°;
  • ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π°Ρ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с обвязками Π½Π°Π΄ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, задСйствованныС Π² QuickJS ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹Π΅ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ примСнСния:

  • libregexp — быстрая рСализация рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совмСстимых со спСцификациСй Javascript ES 2019;
  • libunicode — компактная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Unicode;
  • libbf — рСализация ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ точности ΠΈ трансцСндСнтных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru