AssemblyScript のご紹介 : 次世代のコンピューティング言語
注 : Fastly Compute@Edge 向けの AssemblyScript SDK (@fastly/as-compute) は廃止され、より先進的で機能が豊富な JavaScript SDK (@fastly/js-compute) を代わりにご利用いただけます。
こんにちは!Compute@Edge サーバーレスコンピューティング環境担当のシニアソフトウェアエンジニアで、AssemblyScript のコアチームメンバーのアーロン・ターナーです。最近の Compute@Edge アップデートで、AssemblyScript をサポートしていることを発表しました。この記事では、この新しい言語について詳しくご紹介します。ただしその前に、まずは JavaScript についてお話ししたいと思います。
JavaScript は、最も広く使用されているプログラミング言語のひとつです。しかし、エッジでロジックを実行する場合と同様に、常に完璧にフィットするわけではありません。欠点の多くは、主に JavaScript が動的に型付けされたインタープリタ型言語であり、実行にはランタイム が必要であることです。
まず、JavaScript のランタイムは徹底的に最適化されている必要があります。さらに、静的に型付けされたコンパイル言語と同レベルで JavaScript を実行するには、Just-in-Time コンパイルなどのテクニックが必要です。V8 のようなランタイムは、それなりの量のリソースを使って JavaScript を実行する場合には素晴らしい効果を上げますが、動的に型付けされる、または解釈される言語を使用しない方がより高いパフォーマンスを発揮できます。 もし、JavaScript と同じような開発者体験が得られるだけでなく、静的に型付けされコンパイルされた言語のメリットも得られるとしたらどうでしょうか?
TypeScript は、JavaScript に型を追加、つまり JavaScript アプリケーションに型安全性を導入することによってその一部を実現しています。TypeScript は JavaScript 開発者の間で広く使われています。JavaScript 開発者の80%以上が TypeScript を使用している、もしくは習得したいと考えています。しかし、TypeScript は完全なコンパイル型言語ではありません。コードを型検査しますが、最終的には完全にコンパイルされたバイナリではなく、純粋な JavaScript を生成するために型を削除します。
AssemblyScript を入力
AssemblyScript は WebAssembly バイナリを生成する TypeScript の変形版で、Fastly の Compute@Edge を動かすバイナリフォーマットです。これは、すべての主要なブラウザでサポートされている新しいテ クノロジーであり、JavaScript と比較して、予測可能なパフォーマンスを提供するため、WebAssembly は計算負荷の高いタスクに適しています。また、WebAssembly は npm のようなパッケージレジストリで簡単に配布でき、ブラウザと Lucet のようなスタンドアロンランタイムの両方で実行できるため、移植性が非常に高いと言えます。
AssemblyScript は、TypeScript よりも厳密な型付けを必要としますが、TypeScript のシンタックスとセマンティクスに限りなく近いため、ほとんどの JavaScript 開発者は AssemblyScript を使いやすいと感じるでしょう。これは、先進的な JavaScript エコシステムへの大きなサポートになります。例えば、AssemblyScript コンパイラは npm で利用できる上、as-pectのような一般的な AssemblyScript ツールやライブラリでも利用可能です。また、AssemblyScript ファイルには TypeScriptの「.ts」というファイル拡張子が使われており、TypeScript リンターのような TypeScript ツールに AssemblyScript がピギーバックするための型付けが含まれています。ちょっとした調整を行うことで、AssemblyScript は TypeScript コンパイラと一緒に使うことも可能です。
AssemblyScript は、JavaScript 開発者が WebAssembly を出力する言語を選択する上で、オーバーヘッドの少ないエントリーポイントを提供するため、これは非常にエキサイティングです。AssemblyScript を学ぶという点でも、JavaScript 開発者のワークフローにすでに存在する既存のツールの多くを使用できるという点でも、両方の点で優れています。WebAssembly コミュニティでは、AssemblyScript は WebAssembly を使いこなすための優れたゲートウェイと考えられています。AssemblyScript は Web アプリケーションを書いている大勢の開発者たちに、WebAssembly を学ぶきっかけをもたらします。JavaScript や TypeScript に特に精通していない初心者の方の場合でも、AssemblyScript は WebAssembly を出力するための言語として堅実な選択といえます。
しかし、AssemblyScript にもいくつか考慮すべき欠点があります。
2020年における AssemblyScript の伸び悩み
AssemblyScript はまだ非常に新しい言語のため、成熟度においていくつか問題があります。例えば、AssemblyScript では、一般的な言語機能であるクロージャと正規表現がサポートされていません。クロージャが欠如しているため、他の関数に関数を渡すことが困難になります (JavaScript や TypeScript では一般的)。また、正規表現がサポートされていないので、文字列の解析や修正も難しくなります。これは、一部のアプリケーションにとって重大な問題です。幸い、両機能共に AssemblyScript でサポートされるよう、開発が進められています。
さらに、AssemblyScript は若い言語であるため、コミュニティやエコシステムも成熟していません。コミュニティが成長するにつれ、一般的な JavaScript や TypeScript ライブラリの多くが AssemblyScript に移植されるようになるはずです。これら移植版は、npm のような一般的な JavaScript パッケージレジストリで共有することができます。また、一般的な JavaScript ライブラリに代わる非常に素晴らしい AssemblyScript 向けの代替ソリューションも、すでに見られるようになってきています。例えば、「as-pect」は AssemblyScript 用のユニットテストフレームワークで、Jest から多くを引き継いでいます。「as-wasi」は、WASI (WebAssembly System Interface) の上に位置する高レベルのライブラリで、Node API のようにシステムリソース (FileSystem、Time など) とやり取りをするためのものです。
AssemblyScript が向いているかどうかの判断
まず、AssemblyScript が向いていないものから取り上げたいと思います。この記事でも何度か述べたように、AssemblyScript は現在の JavaScript または TypeScript アプリケーションの代替にはなりません。「ts-node」アプリや、ブラウザの一般的なグローバルオブジェクト (「window」など) に依存する JavaScript スニペット を使って AssemblyScript コンパイラで実行し、WebAssembly を「無料で」取得することができる訳ではありません。
AssemblyScript が提供するのは、既存の JavaScript または TypeScript コード、そして JavaScript や TypeScript の依存関係を、ごく短期間の学習で WebAssembly に移植するための一種の足掛かりです。何故なら、新しい AssemblyScript アプリケーションと移植された依存関係 (すでに代替の依存関係が存在しない場合) は、AssemblyScript コンパイラを使って WebAssembly にコンパイル可能だからです。アプリケーションやライブラリがプラットフォームのグローバルオブジェクトに依存しない場合 (つまり JavaScript または TypeScript が「同型」または「ユニバーサル」の場合)、いくつかのコードの型を追加したり変更したりするだけで簡単に移植できます。プロジェクトやその依存関係がプラットフォーム固有のグローバルオブジェクトを使用している場合は、これらグローバルオブジェクトを再実装するか、ホストランタイムを通じてインポートする必要があるため、移植はより困難になります。JavaScript アプリケーションを AssemblyScript に移植するテクニックについては、今後の記事でご紹介します。
もしゼロから始めようと言うのであれば、AssemblyScript は WebAssembly を始めるのに最適な言語です。すでに JavaScript や TypeScript の知識をお持ちの場合は、特に簡単に AssemblyScript を習得することができるでしょう。シンタックスの類似点と最新の JavaScript ワークフローにより、AssemblyScript の使い方をあっという間に学習し、現在のプロジェクトに追加することが可能です。まだ JavaScript や TypeScript に慣れていない場合は、AssemblyScript の追加機能を使うことでより短期間に習得することもできます。例えば、AssemblyScript は WebAssembly を構成する概念の理解を助け、API ヘルパーを提供しています。したがって、WebAssembly モジュールとして実行される時に、コードがどのように実行され、データがアプリケーションに渡されるかを理解するのはそれほど難しくありません。AssemblyScript はエキサイティングな新言語であり、私たちもコミュニティが成長するのを楽しみにしています。
詳細については、下記の Web Directions Code 2020 での私の講演をご覧ください。この言語が、皆さまやお客様、Fastly の役に立つことを願っています。今後も、私たちと共に AssemblyScript の発展を見守ってください。