マイクロソフト、.NET中間言語をWebAssemblyにコンパイルする「Jiterpreter」をBlazor WebAssemblyに搭載へ、.NET 8で

今回は「マイクロソフト、.NET中間言語をWebAssemblyにコンパイルする「Jiterpreter」をBlazor WebAssemblyに搭載へ、.NET 8で」についてご紹介します。

関連ワード (利用可能、性能改善、起動等) についても参考にしながら、ぜひ本記事について議論していってくださいね。

本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。


マイクロソフトは今年(2023年)11月にリリースが予定されている.NET 8のBlazor WebAssemblyにおいて、.NET中間言語をWebAssemblyに動的にコンパイルすることで、Blazor WebAssemlbyの高速化を実現する機能を備えた「Jiterpreter」を搭載予定であることを明らかにしました。

fig

BlazorはWebAssemblyで.NETランタイムを実装している

そもそもBlazor WebAssemblyは、.NETとC#などを用いてWebブラウザ上で実行可能なWebアプリケーションを開発できるフレームワークおよびランタイムです。

一般にWebブラウザはJavaScriptで記述されたコードを実行可能ですが、それ以外のプログラミング言語を実行する機能は備わっていません。

そこでBlazor WebAssemblyでは「WebAssembly」を用いて.NETフレームワークやランタイムなどを実装しています。

これはWebAssemblyで実装されたほぼフル機能の.NETであり、これを、C#など.NET言語で書かれたアプリケーションがコンパイルされて生成された.NETバイナリ(=.NET中間言語)と一緒にWebブラウザへロードします。

そしてWebAssembly版の.NETが、.NETのバイナリのランタイムであるインタプリタとして働くことで、Webブラウザ上で.NETアプリケーションが実行されるのです。

fig「ASP.NET Core Blazor | Microsoft Learn」から

今回明らかになったJiterpreterの機能は、このWebAssembly版.NETランタイムの部分に実装されています。

.NET中間言語インタプリタに部分的なJIT機能を組み込む

Jiterpreterはその名前の通り、JITコンパイラとインタプリタが組み合わされたものです。ただしこのJITコンパイラはフル機能のJITコンパイラではなく、インタプリタをベースにした部分的なJIT機能ということであえて「Jiterpreter」という名称にしたようです。

マイクロソフトのブログ「ASP.NET Core updates in .NET 8 Preview 2」から、説明の一部を引用します。

The jiterpreter is a new runtime feature in .NET 8 that enables partial JIT support in the .NET IL interpreter to achieve improved runtime performance.

Jiterpreterは.NET 8の新しいランタイム機能であり、.NET中間言語インタプリタでさらなる高性能を実現するために部分的にJITコンパイラの機能をサポートしたものです。

なぜインタプリタをJITで高速化したJiterpriterが必要なのか。その背景には、フルのJITコンパイラの実装は困難である一方で、事前コンパイルでは生成されるファイルが大きくなってしまう、といった課題があると説明されています。

Blazor WebAssembly apps are able to run .NET code in browser thanks to a small .NET runtime implemented in WebAssembly that gets downloaded with the app.

Blazor WebAssemblyアプリケーションは、アプリケーションと一緒にダウンロードされる、WebAssemblyで実装された小さな.NETランタイムのおかげで、Webブラウザ上で.NETコードを実行できるようになっています。

This runtime is a .NET IL interpreter that is fully functional, reasonably small in size, and allows for fast developer iteration, but lacks the runtime performance benefits of native code execution through just-in-time (JIT) compilation. JITing to WebAssembly requires creating new WebAssembly modules on the fly and instantiating them, which poses unique challenges for the runtime.

このランタイムは完全に動作し、十分に小さな.NET中間言語のインタプリタであり、迅速な開発のイテレーションを可能にします。しかしJITコンパイラによるネイティブコードの生成と実行による速度向上は望めません。WebAssemblyへのJITコンパイルは、新たなWebAssemblyモジュールを動的に生成し、それを起動することが要求されるため、ランタイムの実装を困難なものにします。

Blazor WebAssembly apps can instead choose to compile ahead-of-time (AOT) to WebAssembly to improve runtime performance but at the expense of a much larger download size. Since some common .NET coding patterns are incompatible with AOT, the .NET IL interpreter is still needed as a fallback mechanism to maintain full functionality.

Blazor WebAssemblyアプリではその代わり、事前コンパイルを選択することによる性能向上が可能ですが、その場合にはダウンロードサイズが大きくなってしまいます。また、いくつかの.NETコードのパターンでは事前コンパイルができないものもあり、それゆえに完全な実行のためにはフォールバック先としてのインタープリタは依然として欠かせないものになっています。

そこでJiterpreterが開発されたとのこと。

The jiterpreter optimizes execution of interpreter bytecodes by replacing them with tiny blobs of WebAssembly code. By leveraging the interpreter as a baseline, we’re able to optimize the most important parts of the app without having to handle more complex or obscure cases and without overly complicating the runtime. While the jiterpreter isn’t a full JIT implementation, it significantly improves runtime performance without the size and build time overhead of AOT.

このJiterpreterはインタプリタのバイトコードを小さなWebAssemblyコードに置き換えることで、その実行を最適化します。インタプリタを基盤として活用することで、アプリケーションの最も重要な部分を最適化できるだけでなく、(訳注:JITのフル実装にまつわる)複雑な処理や困難な処理、ランタイムの複雑な階層化などを避けることができました。JiterpreterはJITのフル実装ではなく、事前コンパイラで生じるビルド時間やサイズの問題に直面することもなく、大幅な性能改善が可能になりました。

下記がJiterpreterを利用した場合の性能向上の例として紹介されているグラフです。左の処理で2倍、右では7倍以上の性能向上が実現されています。

fig

Jiterpreterは.NET 8 Preview 2でデフォルトで利用可能になっているとのことです。

WebAssemblyで実装されたインタプリタが、WebAssemblyを生成し実行する方法はどのようになっているのか、といった点に疑問は残るのですが、それはまた分かり次第紹介したいと思います。

COMMENTS


Recommended

TITLE
CATEGORY
DATE
[速報]マイクロソフト、ArmネイティブなVSCode、.NET、WSLなど投入へ。Python、Node.jsなどのArm対応も進行中。Microsoft Build 2022
.NET
2022-05-25 07:47
Shopifyが世界で共通するeコマース人材の育成プログラムを青山学院大学で提供
EdTech
2021-06-02 10:17
凸版印刷、“くずし字”を解読する画像認識AIを開発 研究機関向けに月額7万円から提供
ロボット・AI
2021-02-17 10:50
CTCと埼玉県横瀬町、「Fitbit」を活用した実証実験–健康意識の向上へ
IT関連
2023-02-23 05:25
Ziddyちゃんの「私を社食に連れてって」:GA technologiesで英会話ランチジャムに参加編
IT関連
2023-07-29 22:27
みらい翻訳、「時短メール英作文サービスβ版+」を提供–英作文を支援
IT関連
2023-07-15 21:39
NECネッツエスアイ、自治体向けにLGWAN上で利用可能なAI-OCRサービスを販売開始
IT関連
2023-03-17 21:47
35年ぶりの第2版「プログラミング言語AWK 第2版」、オライリーから5月発売
Linux
2024-04-01 02:28
ハードは飛躍的に進化したPS5だが、ソフト不足・品不足は深刻
ゲーム / eSports
2021-01-31 09:17
杉並区、被虐待児の出欠確認アプリをノーコード開発 早期発見に活用
企業・業界動向
2021-06-16 08:13
アルゴ式、エンジニアの技術力を可視化するサービス開発–採用ミスマッチを防止
IT関連
2022-12-11 16:50
ポケモンGOで「ランドロス」など復刻 3月後半には“霊獣フォルム”が初登場
くらテク
2021-03-02 14:01
電動自転車やカーシェアリング車両などの交通データで都市のデジタル変革を支援するPopulusが約5.5億円調達
モビリティ
2021-03-13 23:14
「iPhone」「Android」で使える写真編集アプリ8選
IT関連
2022-01-23 19:42