10月8日、WasmerはClangをブラウザ上で直接動作させる革新的な技術を発表した(Running Clang in the browser using WebAssembly · Blog · Wasmer)。
Wasmer: Wasmerは、WebAssemblyをローカルやサーバー、さらにはブラウザなど、あらゆる環境で実行できるランタイム環境を提供するオープンソースプロジェクトだ。これにより、プログラムはさまざまなプラットフォームで再コンパイルなしに実行可能となる。
Clang: Clangは、LLVMプロジェクトの一環として開発されたC言語やC++、Objective-C用のコンパイラである。主に高速なコンパイルとプログラム解析機能を特徴としている。
この新機能により、Cプログラムのコンパイルがブラウザ内で行えるようになり、WebAssemblyを活用してどこでもClangを実行可能となった。この発表は、Wasmer 4.4とWasmer JS SDK 0.9.0のリリースによるものであり、これによりC言語のプログラムをChrome、Safari、Firefoxなどの主要なブラウザ上でコンパイルして実行することができるようになった。Wasmerの進化により、ブラウザ上でのCプログラムのコンパイルはかつてないほど簡単で実用的なものとなり、Webアプリケーションの開発者にとって画期的な選択肢となっている。
WebAssemblyでのClang実行の利点
この新機能により、WebAssemblyを活用することで、Cコードを簡単にコンパイルして実行できる環境が整った。従来は、C言語のコンパイルに多くのツールチェーンや設定が必要だったが、Wasmerを使えば、わずかなステップでCコードをWasmに変換し、ブラウザ上で動作させることができる。特に、以下の点で大きな利便性がある。
シンプルなコンパイル環境:Wasmer CLIを使うことで、複雑なツールチェーンやインストール手順なしにCプロジェクトをWebAssemblyにコンパイルできる。インストールさえ行えば、Wasmer環境内でどのプラットフォームからでも同じ手順でコンパイルが可能だ。
WASIXの自己ホスト機能:Wasmerが提供するWASIXは、自分自身をコンパイルできるため、他のCプログラムも容易にコンパイルできる。これにより、より効率的に開発が進められ、開発者は多くの作業を一つの環境で完結させることができる。
- WASIX: WASIXは、WebAssembly System Interface(WASI)の拡張版であり、従来のWASIにない機能や互換性を提供する。これにより、従来のオペレーティングシステムのような機能をWebAssembly内で実現できる。
JavaScriptからの直接コンパイル:Wasmer JS SDKを活用することで、JavaScript環境から直接Cプログラムをコンパイルし、実行することが可能だ。これにより、オンラインIDEやウェブアプリケーションでもCコードのコンパイル・実行をシームレスに行える。
再現可能なビルド:Wasmerは同じバージョンで再現可能なビルドを提供するため、どの環境でも一貫した結果が得られる。これは特にチーム開発や大規模プロジェクトにおいて重要なメリットだ。
ClangとWasmerの組み合わせによる実行例
Wasmerの公式ウェブサイトwasmer.shにアクセスすると、Clangのデモをライブで体験できる。このデモでは、C言語のプログラムをWebAssemblyにコンパイルし、ブラウザ上で実行する流れを確認できる。例えば、以下のようなコマンドでCコードをコンパイルし、ブラウザで実行できる。
# 注意: clangパッケージのダウンロードには100MBかかる
wasmer run clang/clang donut.c -o donut.wasm
wasmer run donut.wasm
このコマンドを実行すると、「donut.c」というCプログラムがコンパイルされ、Wasmファイルとして出力される。これにより、開発者はブラウザ内でCコードを実行し、WebAssemblyのパフォーマンスを体感できる。
また、Wasmerを使用して実行できるプログラムは「donut.c」に限らず、複雑なC言語プログラムでも対応可能である。Wasmerの強力なコンパイル機能により、従来のプラットフォーム依存の問題を回避し、ブラウザ内での実行が実現した。
以下は、「donut.c」のコード例だ。このプログラムはDonut Mathの例に基づいており、Wasmer上で動作させることができる。
#include <stdio.h>
#include <string.h>
k;double sin()
,cos();main(){float A=
0,B=0,i,j,z[1760];char b[
1760];printf(""\x1b[2J"");for(;;
){memset(b,32,1760);memset(z,0,7040)
;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
>i;i+=0.02){float c=sin(i),d=cos(j),e=
sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
h*e+f*g+5),l=cos (i),m=cos(B),n=s\
in(B),t=c*h*g-f* e;int x=40+30*D*
(l*h*m-t*n),y= 12+15*D*(l*h*n
+t*m),o=x+80*y, N=8*((f*e-c*d*g
)*m-c*d*e-f*g-l *d*n);if(22>y&&
y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
"".,-~:;=!*#$@""[N>0?N:0];}}/*#****!!-*/
printf(""\x1b[H"");for(k=0;1761>k;k++)
putchar(k%80?b[k]:10);A+=0.04;B+=
0.02;}}/*****####*******!!=;:~
~::==!!!**********!!!==::-
.,~~;;;========;;;:~-.
..,--------,*/
このように、WasmerのClangサポートにより、複雑なCコードも簡単にブラウザで実行できる。加えて、Wasmerはwasm-opt
を自動的に使用してファイルの最適化を行い、より軽量で効率的な実行を実現している。これにより、WebAssemblyのパフォーマンスを最大限に引き出すことが可能だ。
WasmerとClangの組み合わせは、WebAssemblyの可能性を広げるだけでなく、オンラインIDEやウェブアプリケーションにおける新しい開発手法を提供している。今後、この技術がさらに進化し、開発者にとっての強力なツールとなることが期待されている。