Upgrade to Pro — share decks privately, control downloads, hide ads and more …

作って学ぶ コンピュータアーキテクチャ 出版にあたっての経験談

msyksphinz
September 01, 2022

作って学ぶ コンピュータアーキテクチャ 出版にあたっての経験談

msyksphinz

September 01, 2022
Tweet

More Decks by msyksphinz

Other Decks in Technology

Transcript

  1. 作って学ぶ コンピュータアーキテクチャ LLVMとRISC-Vによる低レイヤプログラミングの基礎 出版にあたっての経験談 @msyksphinz_dev

  2. 作って分かるコンピュータアーキテクチャ LLVMとRISC-Vによる低レイヤプログラミングの基礎 • 著者:木村 優之 • 発行:技術評論社 2022年7月1日 • ISBN:978-4297129149

    • コンピュータアーキテクチャの本 • ISAの知識 • RISC-Vの知識 • マイクロアーキテクチャ • これらをLLVMに落とし込む • 関数の作成 • C言語はどのようにアセンブリに落とし込まれる? • グローバル変数って具体的にアセンブリでどうなってい る? • ELFファイルって何? • … などを、LLVMの具体的な実装とともに解説
  3. 執筆までのスケジュール 2018年 2019年 2020年 2021年 2022年 Fixstars主催 「コンパイラ勉強会」 参加 LLVMの勉強

    CPU0をベースに勉強 LLVMについてひたすらブログに書く 出版社に 打診 打ち合 わせ 執筆開始 初期原稿 レビュー 初期原稿 指摘事項修正 第2原稿 指摘事項修正 第3原稿 修正 第3原稿 修正 初期原稿 指摘事項 修正 最終確認 出版
  4. LLVM勉強のきっかけ「コンパイラ勉強会」 • フィックスターズ主催 「コンパイラ勉強会」に参加 • 2018年11月10日開催 • 当時はRISC-Vの「リ」の字もなかった • たぶんまだオモチャだと思われていた

    • LLVMのRISC-V対応もまだ初期段階 • 「それならイッチョ自分でやったろうか」と思い勉強を開始 → モタモタしてたら海外チームの実装が メインストリームにマージされた • 筆者は修士論文もコンパイラネタで書いており、 もともと興味があった • 非常にコミュ障な筆者は、懇親会が怖くて、発表会が終わると速攻で帰った。 https://proc-cpuinfo.fixstars.com/2018/11/compiler_study_report/
  5. 「きつねさん」は神本 • おそらく最古のLLVMについて書かれた日本語書籍 • フロントエンド・バックエンド両方について解説 • 弱点 • 情報が古くなっている。 2013年に出版されたのでしかたなし

    • LLVM 3.5をベースに書かれている • 猛烈な量の日本語。図がほとんど無く理解に苦しむ • 表紙の可愛いキツネさんは内部にほとんど登場しない • LLVM+RISC-V本は「きつねさんに追いつけ追い越せ」を 目標に執筆されました。
  6. 「CPU0」は神資料 • Creating an LLVM Backend for the Cpu0 Architecture

    • CPU0という仮想のアーキテクチャに対して LLVMのバックエンドを一から作成する • かなり詳細なところまで解説されている • 可変長引数 • C++の例外 • ELFの生成 • 「RISC-V + LLVM本」の執筆に際して、本資料は かなり参考にしました。感謝いたします https://jonathan2251.github.io/lbd/
  7. 執筆から出版まで • 本書は「出版社への持ち込み」から始まりました • こういうケースはレアらしい • LLVMバックエンドについてブログ記事を書いていると、 最終的にWord 300ページ程度の規模になった •

    「これ出版できるんじゃない?」 • メールをしてみると、すごい勢いでミーティングが設置された すみません、 LLVMの本出版 したいんですけど 了解です。 担当者つけるんで 待ってください 返信はや! 担当者です。 ミーティングしま しょう
  8. 本書のターゲットをどこにもっていくか? • 「LLVMバックエンド」だけでは、 ブルーオーシャンどころか誰得?になってしまう コンピュータ アーキテクチャ 勉強したいなあ… ハードから 学ぶ? ソフトから

    学ぶ? • 本書はソフトウェアからのアプローチ • というかそういう方針でストーリーを作った • コンピュータを学ぶには いろんなアプローチがある • CPUを作る? • コンパイラを作る? • OSを作る? • コンパイラ作成を通じて、 ハードとソフトの境界を体験
  9. ストーリーを考える • 具体的には「目次」 • どういう構成でいくか • 編集者さんと、Google Docsで 目次を管理 •

    まあこの辺のツールはなんでもいい • このへん、めっちゃ大事 • Go / No Goに関わるところだと思う
  10. 目次 • 第1部 • 第1章:コンピュータアーキ テクチャとISAの基礎知識 • 第2章:RISC-Vの基礎知識 • 第3章:LLVMの基礎知識

    • 第2部 • 第4章:LLVMバックエンドの仕組み • 第5章:簡単な関数や演算のサポート • 第6章:算術演算・グローバル変数・ ポインタ・制御構文のサポート • 第7章:オブジェクトファイル・ ELFファイル出力のサポート • 第8章:LLVMでのテスト記述と リグレッション 最終的には伝わりにくくなってしまったが、 2部構成 すごく偏りがあるように見えるが、それは 気にしない
  11. こだわり「いま何の話をしているの?」 • ラベルを付与「今なんの話をしているのか?」

  12. こだわり「大量の図」 • きつねさんは神本だが、図が極端に少ない • アルゴリズム、データフロー、クラスの関係など、各種図を大 量に追加 • 執筆のかなりの時間を占める • 分かりやすさにこだわっているので、見てくれると嬉しい

    • リポジトリを検索すると、全体で230個のPNGファイル • 全部入っているとすると、2ページに1枚の図が入っている
  13. 校正つらい • 「出版」舐めてました… • 筆者の稚拙な原稿のせいで、大量の修正が発生 • 技術的なミス • ストーリー的なミス •

    実際、最初の原稿に対して9割は校正により書き換わったと思う • 指摘項目はGitHub上のレビュー機能で管理したが、多すぎて途中でページが開けなくなる • 特にストーリー的なミス • 「ある節では、何を言いたいのか?」「ある章が、どういうストーリーで進むのか?」 • 章の最初に、読者に明確にゴールを示す必要性 • このあたりの見積もりが甘く、文章の位置をかなり入れ替えることに
  14. レビュー • 筆者は知り合いが少ない • LLVMの専門家となればなおさら • レビュアーは、当然著者が依頼しなければならない • 数少ないハードウェアの専門家の方々に頼んで大まかなチェック •

    特に第1部、コンピュータアーキテクチャに関して • LLVMの細かいところはともかく、 明らかな矛盾、読みにくさなどについて徹底的なレビュー 謝辞:ハードウェア ツヨツヨ軍団 (敬称略) adachi6k dalance shuntarot taichi-ishitani tom01h
  15. GitHub Issues/PRを用いたレビュー • GitHubの機能を用いて レビュー • 割と便利だと思った。 • 執筆はMarkdown

  16. LLVMでかすぎ、コードの管理どうする? • 本書内に大量にLLVMのコードを埋め込む • バージョンが変わると実装が変わり危険 • LLVMのAPIの変わりやすさは異常 • 解決策: •

    原稿内に自動的にコードを埋め込むスクリプト で最新コードを追いかける • 利点:スクリプトを走らせると、原稿内の埋め 込みコードがすべて最新版に置き換わる • 欠点:埋め込み無し原稿、埋め込みあり原稿が 存在し混乱 オリジナル原稿 ~は、以下を実装します。 @ref: source1 LLVMリポジトリ // @ref: source1 int main () printf(“Hello¥n”); // @endref: source1 スクリプト 生成済み原稿 ~は、以下を実装します。 int main () printf(“Hello¥n”);
  17. LLVMコードにアノテーションを埋め込む オリジナル原稿 ソースコード 生成原稿 問題点:まちがえて自動生成した方を 変更し、スクリプト再実行時に 全部消してしまう。 → とりあえず、自動生成側はRead Onlyに

    して編集できないようにする。
  18. 消えた章:より高度な構文のサポート • サポートページより無料公開予定 • しばらく触っていないのでテストが落ちないか心配 • 編集者さんの圧倒的校正が入っていません。従って読みにくい。 • 構造体引数 •

    可変長引数 • 末尾再帰 まあすでに500Pもあるのに、より分厚くするわけにもいかんし
  19. 消えた章:浮動小数点のサポート • サポートページより無料公開予定 • レイトレースとかするよ! • しばらく触ってなかったので、LLVM12でビルドするとエラーが出て大焦り • 公開前には何とか修正したい •

    浮動小数点について • 浮動小数点命令をLLVMに実装する • 浮動小数点算術演算命令の追加 • さまざまな浮動小数点命令の追加 • まとめとレッスン:浮動小数点演算を用いた マンデルブロ集合の描画 • さらに一歩先へ:浮動小数点演算を用いたレイトレース プログラムの実行 これ自作LLVMバックエンドで 生成したよ!
  20. 印税の話? • あんまりべらべらしゃべってはいけない気がする • ヒント:4年かけたことを考えると、良くない • 筆者は本業があるので、あまり気にしていない

  21. 商業出版にあたり、 圧倒的なプロの仕事を見せつけられた • 同人では決して経験することのないプロの仕事を体験できた • 編集者すごい • 日本語のプロには、文章を書くことに関して絶対に敵わない、と思った • 文章を書いて、売って、お金をもらうというのはこういうこと

    • 文章を書くにあたっての、向き合い方を学ばしてもらった • それにしたって相変わらず筆者ブログの日本語はひどい
  22. みんなが買うとみんなが嬉しい • LLVMの実験はすべて1台のノートPC によって行われました • ノートPCでのLLVMデバッグビルド マジつらい • Surface Laptop

    2でのビルド:夜通し • ビルドを仕掛けてから就寝 → 朝に確認 • 埋め込みスクリプトでリビジョンを綺麗に出すために、LLVMリポ ジトリのリベース・リコンパイルを何度も行う必要がある • 計算パワーは必須の世界 • 継続的サポート、新規技術調査の ためにも、金銭的支援を… 調査・実装・ビルド・執筆・校正 すべてを司ったSurface Laptop 2 スペースキーが死んでいる。この間ついに引退した。
  23. None