diff options
Diffstat (limited to 'services/nuldoc/content/posts/2023-10-02')
| -rw-r--r-- | services/nuldoc/content/posts/2023-10-02/compile-php-runtime-to-wasm.md (renamed from services/nuldoc/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj) | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/services/nuldoc/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj b/services/nuldoc/content/posts/2023-10-02/compile-php-runtime-to-wasm.md index 2664b7a..3751f20 100644 --- a/services/nuldoc/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj +++ b/services/nuldoc/content/posts/2023-10-02/compile-php-runtime-to-wasm.md @@ -16,15 +16,13 @@ remark = "公開" date = "2025-04-23" remark = "fflush() の前に改行の出力が必要だった理由と正しい実装について追記" --- -{#intro} -# はじめに +# はじめに {#intro} [Emscripten](https://emscripten.org/) を用いて [PHP の処理系](https://github.com/php/php-src) を [WebAssembly](https://developer.mozilla.org/docs/WebAssembly) にコンパイルした。機能をある程度絞ることで、思ったよりも簡単に実現できたので、備忘録として記しておく。 なお、この記事では Emscripten や WebAssembly とは何か知っていることを前提とする。 -{#version} -# バージョン情報 +# バージョン情報 {#version} この記事中で使用するソフトウェア等のバージョンを記載する。 @@ -36,14 +34,12 @@ remark = "fflush() の前に改行の出力が必要だった理由と正しい なお、Docker から下は Docker 上で導入するので、ホストマシンにはインストールしなくてよい。 -{#goal} -# 本記事のゴール +# 本記事のゴール {#goal} 先にこの記事のゴールを示しておく。これから示す手順のとおりに進めると、次のようなコードが動くようになる。 このコードはこのあと使うので、`index.mjs` の名前で保存しておくこと。 -{filename="index.mjs"} -```javascript +```javascript filename="index.mjs" import { readFile } from 'node:fs/promises'; import PHPWasm from './php-wasm.mjs' @@ -60,11 +56,9 @@ console.log(`exit code: ${result}`); 標準入力から与えたコードを WebAssembly にコンパイルされた PHP 処理系の上で実行している。このような `php-wasm.mjs` (とそこから呼び出される `php-wasm.wasm`) を作成する。 -{#build} -# ビルド +# ビルド {#build} -{#write-c-entrypoint} -## C のエントリポイントを書く +## C のエントリポイントを書く {#write-c-entrypoint} 先ほどのコードでも使っていたエントリポイントである `php_wasm_run` を用意する。 @@ -107,8 +101,7 @@ int EMSCRIPTEN_KEEPALIVE php_wasm_run(const char* code) { これにより、PHP コードの出力の後ろに余分な改行が追加されてしまう。 改行を出力せずともバッファを消費させる手段をご存知のかたはご教示願いたい。 -{editat="2025-04-23" operation="追記"} -::: edit +:::edit{editat="2025-04-23" operation="追記"} `fflush()` の前に改行の出力が必要だった理由が判明したので追記する。 これは、`index.mjs` で標準出力・標準エラー出力へ出力する方法を指定せず、デフォルトの実装に任せているため。 Emscripten のデフォルト実装では、改行コードを出力するまで出力内容がバッファリングされ、`fflush()` が機能しない。 @@ -132,8 +125,7 @@ const { ccall } = await PHPWasm({ 記事末尾のリポジトリはすでにこの変更を適用済み。`stdout` や `stderr` の完全なサンプルはそちらを参照のこと。 ::: -{#compile-to-wasm} -## WebAssembly にコンパイルする +## WebAssembly にコンパイルする {#compile-to-wasm} それでは WebAssembly にコンパイルしていこう。ここからは `Dockerfile` 上のコマンドとして操作を示す。 @@ -286,8 +278,7 @@ COPY index.mjs /app/ ENTRYPOINT ["node", "index.mjs"] ``` -{#run} -# 実行 +# 実行 {#run} `Dockerfile`、`php-wasm.c`、`index.mjs` を用意したら、Docker コンテナをビルドして実行する。 @@ -300,14 +291,12 @@ Hello, World! exit code: 0 ``` -{#outro} -# まとめ +# まとめ {#outro} [ここまでをまとめた Git リポジトリ](https://github.com/nsfisis/tiny-php.wasm) を用意した。 簡単にコンパイルできるので、興味があれば試してみてほしい。 -{#references} -# 参考リンク +# 参考リンク {#references} * [php/php-src: ビルドの方法について](https://github.com/php/php-src) * [Emscripten: チュートリアル](https://emscripten.org/docs/getting_started/Tutorial.html) |
