今月(2024年8月)末にオライリージャパンから出る「Binary Hacks Rebooted」という本の執筆に、著者の一人として参加しました。私は主に浮動小数点数周りの記事を執筆しました。
サポートリポジトリはこちらになります。サンプルコードなどを掲載する予定です。
また、各Hackの中に踏み込んだ詳細な目次を以下のページで公開しています。購入に迷った際の判断材料にしてください。
- Binary Hacks Rebooted 目次 | Akira Kawata
- binary-hacks-rebooted/toc.md at main · oreilly-japan/binary-hacks-rebooted
オライリーの本は全ての書店に並ぶわけではありません。店頭で確認したい方は、オライリーの本を扱っている書店に足を運んでください。オライリーの本を扱っている書店はオーム社のページから確認できます(発行所はオライリージャパンですが、発売元はオーム社となっています):
【追記】電子版について
「Binary Hacks Rebooted」の電子版はオライリージャパンのページから購入できます。PDF版とEPUB版がセットになっています。値段は紙の本と同一です。
電子書籍の購入にAmazon Kindleを使っている方も多いと思いますが、オライリーの本は基本的にKindle版は出ないようです。Kindleで読みたい場合は、PDF/EPUBをオライリーから購入し、Kindleにインポートする形になります。
Binary Hacks Rebootedとは何か
Binary Hacks Rebootedは2006年に出た「Binary Hacks」という本の再構築版です。タイトルが英語ですがいずれも和書です。
Binaryとは「二進」、つまり0と1で構成されるもので、計算機の低レイヤー(ハードウェアに近い側)を指します。Hackは、技術をうまいこと活用してやる方法、みたいな意味です(私の解釈)。つまり、Binary Hacksは低レイヤーの技術をうまいこと活用してやる方法を集めた本ということです。
初代Binary Hacksが「100選」だったのに対しRebootedの方は89選とHackの数が減っていますが、全体のページ数が増えていることからも分かるとおり、一個一個のHackのボリュームが増えています。著者たちが欲張ったとも言えますし、読者からしたら読み応えがあるということでもあります。
初代Binary Hacksが出た2006年から、低レイヤーの世界にはさまざまな変化がありました。コンテナ技術の台頭(Rebootedではまるまる一章をコンテナ技術に割いています)、セキュリティ技術の進歩(初代にもセキュアプログラミングの章はありましたが、Rebootedにもより一層深くなったセキュリティの章があります)などは外せないでしょう。ちなみに、コンテナ関連の技術としてはchrootが昔からありましたが、Rebootedでは「chrootから脱出する方法」を扱っています。
ソフトウェアの世界では、LLVM/Clangの台頭があったり(Clangのサニタイザを使ったことがある人も多いかと思いますが、Rebootedにはサニタイザの仕組みの解説があります)、Rustのような新世代のプログラミング言語が登場したりしました(いくつかのHackではRustを使っています)。昔からあるC言語もC11という改訂があったり(Rebootedでは _Thread_local
キーワードを何箇所かで使っています)、C23がやってきます(C23への言及もちょいちょいあります)。
CPUのアーキテクチャとしてはAArch64やRISC-Vが登場しました。CPUではありませんがWebAssemblyも登場しましたね(Wasmを大々的に使ったHackはあまりない気がしますが、ちらほら言及があります)。浮動小数点数に関しては、IEEE 754が2回改定されました(IEEE 754-2008、IEEE 754-2019)。Rebootedには十進浮動小数点数のビット列表現を観察する話もあります。
Binary Hacks Rebootedはこのように、現代(2024年)のBinary Hacksにふさわしい内容となっています。
初代「Binary Hacks」を持っている人は、Binary Hacks Rebootedを買うべきでしょうか?もちろんです。Rebootedは全編書き下ろしであり、初代にはない内容ばかりです。厳密にいうと「浮動小数点数のビット列表現」のように話題として重複するものはありますが、Rebootedでは十進浮動小数点数のような新しい話題を追加しています。
逆に、Binary Hacks Rebootedがあれば初代は不要でしょうか?これには2つの回答があって、まず「Binary Hacks Rebootedは基本的に単独で読めるようになっている」という意味では初代は不要です。そして、「一部の内容については初代を参照している」という点では、初代も手元にあればより深くBinaryをHackできることは間違いないです。そもそも初代は今読んでも面白いですしね。
というわけで、初代「Binary Hacks」と今回の「Binary Hacks Rebooted」は両方読んで比較してもらえると一層楽しいのではないかと思います。初代の紙の本は絶版になっているのが残念ですが、電子版を買うか紙の古本を買うかしていただければ……。
ところで、「Binary Hacks Rebooted」はLinuxの話題が多めです(特に2章、3章、4章)。macOSユーザーは肩身の狭い思いをしなければならないのでしょうか?そうとも限りません。7章、8章はOSに依存しない話題が多いと思います。そして、最近のMacはx86-64からArm(AArch64)へ移行したので、AArch64に関する話題を試すのにはApple Silicon Macは適任だったりします(浮動小数点数に関するHackではAArch64の話題も出しています)。欲を言えばx86-64のマシンとAArch64のマシンの両方があると良いですね。
まあMacのOSの部分についての話題はあまり書けていないので、私のブログ等で適宜補足記事を出していけたらなあと思っています(「MacユーザーのためのBinary Hacks」みたいな?)。あるいは他の詳しい人が書くのに任せた方が良いかもしれません。
イベントやります
東京・神保町にある「書泉グランデ」様にて8月30日(金)に刊行記念イベントをやります。執筆者の何人かが登壇します。参加するには、書泉オンラインショップで本書を購入する必要があります。とはいえ、定員に限りがあり、本記事公開時点ではすでに埋まってしまっています(キャンセル待ち?)。ライブ配信はありません。
ただ、これだけだと参加できる人が少なすぎるので、他にも何か(オンラインで?)企画するかもしれません。
併せて読みたい記事(宣伝)
私が普段Webに書いている記事にも、低レイヤーをHackする記事がちょいちょいあるので、まとめてみます。これらには私がBinary Hacks Rebootedに執筆したHackの元ネタになった記事が含まれますし、Binary Hacks Rebootedでは紙面の都合から掘り下げられなかったネタを掘り下げる記事も含まれます。
まずは浮動小数点数の記事について。
- 浮動小数点数の min / max
- long doubleの話
- 浮動小数点数の16進表記
- FMA (fused multiply-add) の話
- 浮動小数点数の足し算と掛け算は可換か
- Javaの strictfp が実際に意味を持つ環境を用意する
- x87 FPUの呪い
- 初代Binary Hacksに同じ話題のHackがあります。
- ArmにあるというJavaScript専用命令とは何か、あるいは浮動小数点数を整数に変換する方法について
- Binary Hacks RebootedのとあるHackの元ネタです。
- 浮動小数点数オタクがM1 Macを触ってみた
- C言語で四倍精度浮動小数点数 (binary128) を使う
- 浮動小数点数の比較について
- 浮動小数点数の丸めの相対誤差を計算機イプシロンで評価する
- IEEE 754の十進浮動小数点数の基本
- Lua 5.1/5.2/LuaJITの%演算子と浮動小数点数の罠
- C言語で複素数値を構築する:CMPLXマクロの話
- Arm32のSIMD (NEON) と非正規化数
- Binary Hacks Rebootedでは深く掘り下げられなかったネタを扱っています。
- 半精度(16ビット)浮動小数点数をC言語から使う
- 浮動小数点数の演算の丸めモードを制御する
- Binary Hacks RebootedのとあるHackの元ネタです。
- 浮動小数点数の文字列化(基数変換)
- 浮動小数点数の指数部と仮数部への分解とその逆:logbとscalbn
- 2^53+1 は素数か
- 整数除算を浮動小数点演算でエミュレートできるか
- TwoSumの証明に2週間かかった
- BInary Hacks Rebootedではこういう理論的な話はあまり取り扱えていません。私の力量不足ということもありますし、紙面の都合的にもねじ込むのは難しかったでしょう。
機械語とCPUの機能について。
- GHCいじくり日誌・AArch64編
- AArch64でJITしてみる
- Binary Hacks RebootedのとあるHackの部分的な元ネタです。
- AArch64アセンブリーを出力するBrainfuckコンパイラーを書いてみる
- HaskellでつくるAArch64版MinCaml
- C言語でクロージャーを実現したい、あるいは実行時のコード生成によるクロージャー
- 内容の一部が、Binary Hacks RebootedのとあるHackの元ネタです。
- Universal MachineのJITコンパイラーを書いた/x86_64編
- 自動ベクトル化とC言語のrestrict
- Binary Hacks Rebootedに関連する内容があります。
- SIMD命令比較
- Arm64 (AArch64) のFPCRにC言語からアクセスする
- 書いた内容をBinary Hacks Rebootedのサンプルコードで活用しています。
- x86-64機械語入門
- x86-64機械語入門 AVX/AVX-512編
- ArmのScalable Matrix Extension (SME)を試す
- CPUの機能を実行時に検出する:x86編
- CPUの機能を実行時に検出する:Arm編
- CPUの機能を実行時に検出する:実践編
- Binary Hacks Rebootedに関連する内容があります。
- AVX10.2の新機能
謝辞
Binary Hacks Rebootedの企画を主導してくださった河田さん、私に声をかけてくれて、レビューでもたくさんのコメントをくださった渡邉さん、共著者としてたくさんの面白い記事を書いてくださった小池さんと佐伯さんと寄稿者の皆様(鈴木さん、中村さん、竹腰さん、光成さん、hikaliumさん)に感謝します。皆様と一緒にひとつの本を作り上げることができて光栄です。
レビューでたくさんの有益なコメントをくださった皆様(特に、面識のない私からのレビュー依頼を受けてくださった柏木先生)、格好いい表紙を作ってくださった宮本さん、編集として私たちをアシストしてくださったオライリー・ジャパンの浅見さん、組版に関する要望に迅速に応えてくださったGreen Cherryの山本さんにも感謝します。
そして「Binary Hacks」(初代)を執筆された皆様にも感謝します。「Binary Hacks」という名著の名前を受け継ぐ本に携われて幸せです。
そして最後に、執筆に邁進する私を応援してくれた妻へ感謝します。