OSC東京2015春のLTで話した「ハロー・ワールド入門」ですが,「ハロー "Hello, World"」というタイトルで本日発刊されました.

Amazonのサイト
秀和システムのサイト
書籍サポートページ





内容はLTでしゃべったとおりで,以下のようなわずか7行のハロー・ワールドのプログラムをとことん解析する,というものです.

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello World! %d %s\n", argc, argv[0]);
return 0;
}

■ 表紙について

タイトルも表紙もなんだか爽やかな感じで,技術書とは思えない.笑
旅行のガイドブックか何かのようだ.

電車の中とかでフツーに読んでても違和感無い!?

■ 対象とする読者

対象読者は以下のようなかたです.

入門書でハロー・ワールドを説明されたとき,printf()の先はどうなっているのか? とかmain()が呼び出される前には何が行われているのか? とかmain()からreturnしたらどこに返るのか? といった疑問を持ったが,それらの疑問はそのまま棚上げにされ,放置されている.改めて知りたい,というひと.

動的解析や静的解析,Linuxカーネルやライブラリなどのコードリーディングというものに興味があるしやってみたいが,どこから手をつけたらいいかわからない,最初の一歩がいまいち踏み出せない,というかた.
(とにかく手を動かす系の本なので,初心者もとりあえず手を動かして,解析作業やコードリーディングを体験することができます)

プログラムがどのように動いているのか,OSは何をしているのか,といったことを知りたい人.とくに,机上の理論や図を使った抽象的な説明でなく,実際の現物ベースで知りたい人./usr/includeにあるヘッダファイルや/usr/libにあるライブラリが,誰によって提供されどのようにしてシステムが構築されているのかなどを知りたい人.

大学や専門学校でのOS系・解析系の授業の教科書として.
技術的な内容もいろいろ含んでいますし,OSの全体構成(カーネルとライブラリとアプリケーションの関係)について理解できるので,OSの授業とかにいいんじゃないかと思います.
大学等の講義で使うことを意識して,全12章にしてあります.(1回の講義で1章のペースで,半期で終わる感じ)

■ 書いた経緯

上のようなハロー・ワールドについてA4用紙で5枚のレポートを書け,という課題が大学かどこかで出たことがあるという話を聞いたことがあります.

要するに,単なる7行のプログラムだとしても,それくらい奥が深いということなのですが,だったら1冊の本が書けるんじゃないかなあと思って書いてみたものです.

■ 内容について

内容ですが,まずハロー・ワールドの実行ファイルを動的解析することでprintf()の処理の先を追い,文字出力が行われる瞬間(システムコール命令の発行)をとらえます.
次にLinuxカーネルのソースコードを見て,writeシステムコールがどのように処理されるのかを探ります.
さらに標準Cライブラリのソースコードを見て,システムコール命令の発行がどのように行われているのかを確認します.

さらにmain()が呼び出される前のスタートアップの処理を探って,main()からreturnする先の処理を探ります.exit()で何が行われているのかなどを探ります.
「main()の前にはスタートアップという処理がある」という話を漠然と聞いたことがある,という人はいるかと思います.しかしそのスタートアップを実際に見たことがあるという人は少ないですし,説明してある書籍もあまり無いです.このあたり,詳しく調べて説明しています.

あとはstdio.hなどのヘッダファイルがどこにあって誰によって提供されているのかとか,OSの仕事は何なのかとか,標準Cライブラリは誰によって提供されていて,いわゆるLinuxディストリビューションと呼ばれているシステムはどのように構築されているのかとか(GNU/Linuxの話とか),実行ファイルを解析してみるとか,最適化についてとか可変長引数の実現方法などについても説明しています.

ハロー・ワールドについて,かなりお腹いっぱいになる感じだと思います.

他にもシステムコール処理をLinuxカーネルとFreeBSDカーネルで比較したり,x86とARMで比較したりといったクロスプラットホームの話題もあります.(このあたりが私らしいところか)

秀和システムの書籍のサイトで,目次を確認することができます.
興味のあるかたは,ぜひ目次を見てみてください.

■ 発刊されて

内容的にはなかなかコアな内容で,類書の無い面白い感じに仕上ったかと思います.

理論だけの説明でなく実際に手を動かしてみて,現物を見てみた後で理論的な説明をする,調べた結果だけを見せるのではなく調べかたをちゃんと見せる,というのがだいたい私が書きたい書き方なのですが,バッチリそういう感じに仕上りました.

あと私の書き方の特徴なのですが,同じことを何箇所かで説明していたりします.(本書の場合は,システムコールラッパーの役割とかFreeBSDのソースコード配置などがそう)
これはまず一度説明して,いろいろ理解が進んだところでさらにもう一度説明することで理解を深める,というように書きたいからです.
この手の勉強は義務教育のようにカリキュラムがバッチリ決まっていて順番通りに進めていけばいい,というものではなく,Aを説明するためにはBの知識が必要で,でもBを説明するためにはAの知識が必要,ということはよくあります.なので,同じことを何度も説明するというのは,個人的には悪いことだとは思わないので,そういうふうに私は本を書いています.
なので読む人によっては「くどい」と感じられたりしますが,逆に「何度も説明してくれてありがたい」という意見をいただくこともあります.

あと表紙は爽やかでお気に入りですね.