先日、「Binary Hacks Rebooted」をご恵贈賜りました。通して読んでみたところ、私の心の琴線に触れる内容が多くあり、ブログ記事で紹介させてもらいます。
前回の記事では、JavaScript の実行エンジン V8 の JIT 出力コードを読んでみました。記事は M1 Mac 上で動かした結果でしたので、ARM アーキテクチャのアセンブラを読むことになりました。
さてそんな ARM アーキテクチャですが、最近の ARM には FJCVTZS という JavaScript 専用の機械語命令があるのをご存知でしょうか?CPU に、特定の言語(それもコンパイラを持たない JavaScript)専用の命令があると知ったとき、私は大いに驚きました(過去にも Jazelle みたいなものはありましたが)
今回は、この FJCVTZS 命令について、実際にどれだけ効果があるのか、V8 をビルドしながら調べてみましょう。
Chrome の JavaScript はとても高速なことでも有名ですが、その実行エンジンは V8 と呼ばれます。V8 自体は独立したモジュールであり、Node.js 等にも使われております。
V8 が JavaScript を高速に実行する技術の一つが JIT (Just In Time) コンパイルです(一般的に JIT と呼ばれます)。これは、そのまま実行すると遅い JavaScript を実行中にリアルタイムに直接マシンコードに変換し(これが Just In Time と呼ばれる所以です)、途中からそのコードに入れ替えて実行することで高速化を達成しています。特に何度も実行される関数で効力を発揮します。
JIT という名前は聞いたことがあろうとも、実際に JIT がどのようなコードを実行しているのかを確認する機会は滅多にないでしょう。この記事では、実際に V8 の JIT の出力を確認してみます。
Stable Diffusion は、GPU を利用した画像生成 AI の中でも最も有名なプロダクトだと思います。Stable Diffusion の利用者は一般的にまず GPU を準備し、そこで環境を構築してから画像生成を行うのですが、今回は Stability AI(Stable Diffusion の開発元)の用意している API を利用して、塗り絵の自動生成を作ってみました。
塗り絵 自動生成: https://color-painting.vercel.app/
子どもたちのために、塗り絵を自動生成するサービスです。この記事では、どのようにこのアプリを作ったのか簡単に紹介しております。コードは全て JavaScript です。
ソースコードも github で公開しています。Stability AI Developer Platform, Vercel, Google reCAPTCHA に依存しています。
https://github.com/tkihira/color_painting
なお免責事項として、私は Stablity AI Japan 社には仲の良い友人が多数おりますが、このブログを公開するにあたり Stability AI 社からの金銭授与ならびにクレジット授与は一切ありません。 また、AI の業界は変化が激しいので、ここに書かれている内容はすぐに時代遅れになる でしょう。提供されている機能や料金などは、必ず自分でお調べ頂くようにお願いします。
JavaScript において、特に苦手とする人が多い印象のある Promise ですが、await
と async
の文法が導入されたことで、Promise の仕様を深く理解しなくても非同期処理を自然に書けるようになってきたのではないかと思います。
極論ですが、JavaScript の非同期処理は
async
await
new Promise
のみで、(ほぼ)全て表現可能です。特別な理由がない限り then
を使わないようにしましょう、ということを周知するのがこの記事の目的です。
なお本記事では Promise の rejected
の状態についてほとんど解説しておりません。基本を理解したら、別記事でぜひ学んでみてください。