以前、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 Libraries (bun.js)
- n-api
- JavaScriptCore (JSC)
- pico-http-parser
- BoringSSL
- zlib
- http/2, quic層は未実装
- kqueue/iouring
Mac用のI/OとLinux用のI/Oを抽象化するライブラリ
https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
Standard Library
bunはNode.js互換を絶賛実装中
V8 vs JSC
JITする時のギヤ数に違いがある
ざっくりJSエンジンにおける低速ギヤと高速ギアの解釈
- 低速ギヤ:JSの実行を開始するまでの時間は短いが、JSの実行速度は遅い
- 高速ギヤ:JSの実行を開始するまでの時間は長いが、JSの実行速度は速い
JITは低速ギヤでがむしゃらに動いているところ(ホットスポット)を高速ギヤにして高速にしようとする
V8とJSCの違いはそれが何段あるかの違い
JSCは4段(safariの中で動いている)
Introducing the WebKit FTL JIT | WebKit
V8は3段
Sparkplug — a non-optimizing JavaScript compiler · V8
http parser vs pico http parser
- http parserはTSで書いたらCが出てくるパーサ(indutny製)
GitHub - nodejs/llhttp: Port of http_parser to llparse - pico http parserはC業界では有名な高速手軽パーサ(kazuho製)
GitHub - h2o/picohttpparser: tiny HTTP parser written in C (used in HTTP: :XS et al.)
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 追記)