バイナリフォーマットとは?解説
バイナリフォーマットは、人間が読めるテキストとしてではなく、機械向けの生のバイトとしてデータをエンコードします。
ほとんどのファイルフォーマットは二つの陣営に分かれます。エディタで開いて読めるテキストフォーマットと、プログラムにしか意味を持たない密なバイト列であるバイナリフォーマットです。バイナリフォーマットは可読性を速度とコンパクトさと引き換えにします。CIは絶えずそれらを扱います - コンパイル済みのartifact、イメージ、アーカイブ、cacheはすべてバイナリです。
バイナリフォーマットとは何か
バイナリフォーマットは、印字可能な文字としてではなく、特定の構造に従って解釈されるバイトとしてデータを格納します。テキストエディタで開くと、バイトが文字に対応するようには作られていないため文字化けが表示されます。フォーマットのレイアウトを知るプログラムは、バイトを直接読み取ります。
バイナリとテキストのフォーマット
JSONやYAMLのようなテキストフォーマットは可読でdiffが取れデバッグしやすい一方、サイズが大きく解析も遅めです。Protocol Buffers、イメージ、アーカイブのようなバイナリフォーマットはコンパクトで高速ですが、不透明で手作業での検査が困難です。適切な選択は、主な読み手が人間か機械かによって決まります。
なぜバイナリはコンパクトで高速なのか
バイナリフォーマットはテキストのオーバーヘッドを省きます。クォートも、文字列として繰り返されるフィールド名も、数字を数値へ解析する処理もありません。値はメモリ上の表現に近い形で格納されるため、エンコードとデコードが高速でファイルも小さくなります - これは規模が大きくなるほど重要です。
CIにおけるバイナリフォーマット
多くのCIのartifactはバイナリです。コンパイル済みバイナリ、コンテナイメージのレイヤー、zipアーカイブ、シリアライズされたcacheなどです。バイナリファイルは意味のあるdiffが取れないため、通常は検査ではなくchecksumで検証され、バージョン管理にコミットするのではなくartifactとして保存されます。
# Verify a downloaded binary artifact in CI
steps:
- run: curl -LO https://example.com/tool.tar.gz
- run: sha256sum -c tool.tar.gz.sha256Latchkeyについて
バイナリのbuild出力やcacheは、実行間でLatchkeyのartifactおよびcacheとして保存されます。バイナリのblobはchecksumで検証するのが最適なため、cacheレイヤーはコンテンツハッシュを使って、復元したバイナリが保存されたものと一致することを確認します。
重要なポイント
- バイナリフォーマットは、読めるテキストではなく機械向けの生のバイトとしてデータを格納する。
- バイナリはコンパクトで高速だが不透明。テキストは可読でdiffも取れるがサイズが大きい。
- コンパイル済みバイナリ、イメージ、cacheといったCIのartifactはバイナリであり、checksumで検証される。