UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Bun】BunとNode.jsの違いのメモ

以前、Bunについてざっくり調べたことがある uga-box.hatenablog.com

この時からBunについて、特にNode.jsとの違いについて、知る機会があったのでメモ

(2022/9/5 追記)ソース元はfurukawaさんがNode学園40限目で話された内容 speakerdeck.com

Node.jsの構成要素の一部

  • Standard Libraries
    HTTP、File systemとか
  • n-api
    C++とかCを呼び出すネイティブモジュールの抽象化ライブラリ
  • V8
    JavaScript エンジン
  • http-parser
    HTTP1.1用のパーサー
  • OpenSSL
    HTTPSとかTLSとかの暗号化周りのライブラリ
  • zlib 圧縮とか解凍とか
  • ng-http2 HTTP2用のライブラリ
  • ng-tcp QUIC用のライブラリ
  • libuv
    OSによって異なるシステムコールのIOを抽象化するもの
  • その他
    node/deps at main · nodejs/node · GitHub

Bunの構成要素の一部

Standard Library

bunはNode.js互換を絶賛実装中

V8 vs JSC

JITする時のギヤ数に違いがある

ざっくりJSエンジンにおける低速ギヤと高速ギアの解釈

  • 低速ギヤ:JSの実行を開始するまでの時間は短いが、JSの実行速度は遅い
  • 高速ギヤ:JSの実行を開始するまでの時間は長いが、JSの実行速度は速い

JITは低速ギヤでがむしゃらに動いているところ(ホットスポット)を高速ギヤにして高速にしようとする

V8とJSCの違いはそれが何段あるかの違い

JSCは4段(safariの中で動いている)

  • LowLevelInterpreter(LLInt)
  • Baseline JIT
  • Dataflow Graph (DFG)JIT
  • Faster Than Light (FTLJIT

Introducing the WebKit FTL JIT | WebKit

V8は3段

  • Ignition(LLInt相当)
  • SparkPlug(Baseline JIT相当)
  • TurboFan(FTL JIT相当)

Sparkplug — a non-optimizing JavaScript compiler · V8

http parser vs pico http parser

OpenSSL vs BoringSSL

OpenSSLは歴史が長いのでセキュリティ脆弱性などの負債が多いので、Googleが作り直したのがBoringSSL

libuv と kqueue/iouring

libuvはwindows, mac, linuxをまとめてI/Oの抽象化(それ以上のこと)をするライブラリ

Node.jsはそれを使っているが、Bunはそれを使わず kqueue/iouringを使って独自に実装している

kqueueはMacのI/O、iouringはLinuxのI/Oを抽象化するライブラリ

Windowsは捨てているみたい(WSLがあるためか)

https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

他参考

(2022/10/10 追記)

82. Node.js、Deno、Bun (前編) w/ yosuke_furukawa | fukabori.fm