GraalJS 25.1: Modern JavaScript on GraalVM

原文はこちら。
The original article was written by Andreas Wöß (Senior Researcher at Oracle Labs).
https://medium.com/graalvm/graaljs-25-1-modern-javascript-on-graalvm-25f5c7cea361

GraalVM上で動作する高性能な組み込み型JavaScript実装のGraalJSが、最新のECMAScript機能を搭載しました!

GraalJS | A high-performance embeddable JavaScript runtime for Java

JavaScriptは、最新のWeb開発において中核をなす要素です。Oracleでは、製品やサービスの構築、開発者によるプラットフォームの拡張、アプリケーションとOracleサービスの連携など、さまざまな場面でJavaScriptを活用しています。

また、私たちは言語の進化にも貢献しています。Oracleは、Ecma Internationalおよび、JavaScriptエンジンによって実装される標準化言語であるECMAScriptの進化を担う委員会TC39の一員です。

Members – Ecma International

GraalJSは、その取り組みの重要な一翼を担っています。GraalJSは最新鋭で高速であり、JavaやKotlinアプリケーションへの組み込みが容易で、GraalPyやその他のGraal言語との相互運用性も備えています。また、GraalJSはNodeをサポートしているため、Node.jsアプリケーションを実行することも可能で、GraalWasmを使用してWebAssembly JavaScript APIを実装しています。

GraalJSはオープンに開発されており、ソースコードおよびコミュニティディストリビューションはUniversal Permissive License (UPL) の下で利用可能です。GraalJSはGitHubおよびMaven Centralで公開されており、その互換性に関する検証は、50,000件以上のテストを含む公式のECMAScript適合性スイートであるTest262を用いて行われています。

oracle/graaljs: GraalJS – A high-performance, ECMAScript compliant, and embeddable JavaScript runtime for Java

ECMAScript 2016+ compatibility table

GraalJSの組み込み可能性やJavaとの高速な相互運用性といった独自の機能により、Oracleのシステムにおいていくつかの重要なユースケースが実現されています。NetSuiteはその好例です。高度な手続き型ロジックをサポートするスクリプトエンジンであるSuiteScriptは、GraalJSで動作しています。これにより、SuiteScriptで開発を行う顧客やパートナーにとっては、最新のJavaScript言語機能をそのままフルに活用できるようになります。

NetSuite Applications Suite – SuiteScript Overview

Oracle Databaseは、組み込み可能性という概念を別の方向へと発展させています。Oracle DatabaseのMultilingual Engine (MLE)により、開発者は、動的なスニペットやデータベースに格納されたJavaScriptモジュールを含め、データに近い場所でJavaScriptを実行できるようになります。内部的には、MLEはGraalVMの組み込み機能とNative Image機能を活用して、JavaScriptの実行をデータベース環境内に取り込んでいます。

Introduction to Oracle AI Database Multilingual Engine for JavaScript

最新リリースであるGraalJS 25.1では、ECMAScript標準の第17版であるECMAScript 2026を完全にサポートし、これをデフォルトの言語バージョンとしています。

ECMAScript® 2026 Language Specification

ほとんどのアプリケーションでは、追加の設定は不要です。最新の標準化されたJavaScript言語およびライブラリ機能が、導入直後から利用可能です。互換性の理由で特定のECMAScriptバージョンを固定する必要があるアプリケーションは、js.ecmascript-versionオプションを使用して、そのバージョンを使うことができます。

ECMAScript 2026 Highlights

ECMAScript 2026では、数値計算、イテレータ、非同期データコレクション、エラー検出、キー付きコレクション、バイナリエンコーディング、およびJSON処理にわたる実用的な追加機能が標準化されています。これらの機能は、GraalJS 25.1でデフォルトで利用可能です。

Array.fromAsync()

非同期反復可能オブジェクト、同期反復可能オブジェクト、および配列のような入力から配列を構築します。また、各要素に適用されるオプションのマッピング関数を受け入れ、結果は配列に追加される前に待機します。

Iterator.concat()

複数のイテレータまたは反復可能オブジェクトの入力を1つの遅延イテレータに連結するため、イテレータベースのコードは中間配列を割り当てなくても、composableのまま維持できます。

Math.sumPrecise()

特に値の絶対値が異なる場合において、数値の安定性を向上させ、精度の損失を最小限に抑えながら、浮動小数点数の反復可能オブジェクトを合計します。例えば、Math.sumPrecise([1e16, 0.1, -1e16])0.1を返しますが、単純な合計演算では0が返されます。

Get-or-insert APIs for Map and WeakMap

すでに存在する場合に既存の値を返し、キーが存在しない場合は取得時にデフォルト値を提供します。Map.prototypeおよびWeakMap.prototype上のgetOrInsert()およびgetOrInsertComputed()です。これらのAPIにより、一般的なキャッシュ、メモ化、およびグループ化パターンが簡素化されます。

Hex and Base64 string support for Uint8Array

16 進数および Base64 エンコードされたバイナリデータの文字列に対するバイナリ変換 API が追加されました。これには、fromBase64()toBase64()setFromBase64()fromHex()、toHex()、および setFromHex()が含まれます。

More expressive JSON APIs

JSON.parse() のリバイバーは、現在の値に対応する JSON ソーステキストのセグメントにアクセスできるようになり、正確な数値を保持するのに役立ちます。ES2026 では、JSON.rawJSON()および JSON.isRawJSON()も追加されています。JSON.rawJSON()を使用すると、検証済みの生の JSON フラグメントを文字列化中に埋め込むことができ、アプリケーションはプリミティブ値に対する JSON.stringify()の出力をきめ細かく制御できるようになります。これらの追加機能により、BigInt値のシリアライズが可能になり、JSONの処理がより拡張しやすくなります。

Error.isError()

instanceof Errorのような、信頼性が低く、領域間の違いに左右されやすいチェックに頼るのではなく、値が実際のエラーオブジェクトであるかどうかをテストするための標準的な方法を提供します。

Beyond ECMAScript 2026

GraalJS 25.1には、ECMAScript 2026以外の特定の言語機能に対するサポートも含まれています。Temporal は ECMAScript 2027 モードで利用可能です。初期段階の提案の一部は ECMAScript ステージングモードで利用可能ですが、その他は明示的な実験的オプションを使用します。

Temporal in ECMAScript 2027 Mode

GraalJS 25.1 では、Temporal のサポートが完成しており、カレンダー日付用の Temporal.PlainDate や、タイムゾーンを意識したスケジューリングおよび演算用の Temporal.ZonedDateTime といった最新の date/time API が利用可能です。

TemporalはECMAScript 2026の一部ではないため、デフォルトでは有効になっていません。有効にするには、ECMAScript 2027モードを使用してください:

js --js.ecmascript-version=2027 app.mjs

Non-Final ECMAScript Features

GraalJS 25.1には、まだ確定していないいくつかの提案に対するサポートが含まれています。これらの機能は実験的なものであり、今後変更される可能性があります。

ECMAScript ステージングモードにおいて、GraalJS 25.1 には以下の機能が含まれています:

Immutable ArrayBuffers

変更、サイズ変更、切り離し、転送ができない ArrayBuffer を作成するための API。

  • transferToImmutable()
  • sliceToImmutable()

Joint Iteration

Iterator.zip() および Iterator.zipKeyed() を使用すると、複数のイテレータを同時に進め、位置が揃った値を扱うことができます。

ECMAScriptのステージング機能を有効にするには、js.ecmascript-versionstagingに設定します。

js --js.ecmascript-version=staging app.mjs

GraalJS 25.1には、明示的な実験的オプションによる追加の提案も含まれています。

Explicit Resource Management ( --js.explicit-resource-management)

`using`および`await using`宣言と、ディスポーザブルなリソーススタックを使用して、決定論的なクリーンアップを行います。

Import Text (--js.import-text)

YAML やテンプレートファイルなどのテキストリソースを文字列としてインポートします。

Import Bytes (--js.import-bytes):

import 属性を使用して任意のファイルを生のバイトとしてインポートし、不変の ArrayBuffer をバックエンドとする Uint8Array を返します。

Node.js 24

GraalJS 25.1 では、Node のサポートが Node.js 24.14.1 に更新され、ECMAScript 2026 のサポートとともに Node.js 24.x LTS シリーズがリリースに含まれるようになりました。

Experimental Web Crypto API Option

GraalJS 25.1 では、Web Crypto API の getRandomValues() および randomUUID() を公開するための実験的な--js.cryptoオプションも追加されています。使用するには、--experimental-options --js.crypto=true app.mjsと指定してください。.

GraalJSの変更点の完全なリストについては、GitHubのCHANGELOGをご覧ください。

graaljs/CHANGELOG.md at master · oracle/graaljs

まとめ

GraalJS 25.1では、最新のJavaScript機能がデフォルトでGraalJSに組み込まれ、一方で互換性を必要とするアプリケーション向けに互換性オプションも引き続き利用可能です。また、Node.js 24 へのアップデートが行われ、今後の機能をお試しになりたい開発者のために実験的な機能も含まれています。

本リリースの実現に際し、フィードバック、提案、貢献をしてくださったコントリビューターおよびコミュニティの皆様に感謝申し上げます。GraalJS 25.1 に関するフィードバックや今後のリリースに向けたご提案がございましたら、Slack、GitHub、または Twitter でお知らせください。

Slack でgraalvmに参加する | Slack
oracle/graal: GraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources 🚀
GraalVM (@graalvm) / Twitter

さあ、今すぐ GraalJS 25.1 を試してみてください!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください