連載
» 2017年05月18日 05時00分 UPDATE

main()関数の前には何があるのか(1):「Hello World!」の中身を探る意義と環境構築、main(C言語)のアセンブラコードの読み方 (1/4)

C言語の「Hello World!」プログラムで使われる、printfやmainの中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。初回は、「Hello World!」の中身を探る意義と環境構築について触れ、mainのアセンブラコードを読んでみる。

[坂井弘亮,著]

連載目次

ハロー“Hello,World” OSと標準ライブラリのシゴトとしくみ

書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍『ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ(2015年9月11日発行)』からの抜粋です。

ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。


はじめに

 C言語プログラミングの入門書などでは、「Hello World!」というメッセージを出力するだけのいわゆる「ハロー・ワールド」というプログラムが、最初に書くプログラムの定番になっています。

#include <stdio.h>
 
int main(int argc, char *argv[])
{
  printf("Hello World! %d %s\n", argc, argv[0]);
  return 0;
}

 そんなハロー・ワールドですが、しかしその実、謎は多いのではないでしょうか。

  • printf()の先では、何が行われているのか?
  • main()の前には、いったい何があるのか?
  • stdio.hとは何で、どこにあるものなのか?

 入門書では、もちろんこれらの疑問点は後回しにされています。入門書なので、これは当然のことでしょう。しかしそれらの疑問が後回しにされたまま、謎が謎のまま残ってしまってはいないでしょうか。

 こうしたことは筆者も長い間の疑問でした。本書は筆者がそのように日々疑問に思っていたことを調べ、その結果をまとめたものです。

 ひとつのものをあらゆる角度からとことん調べてみた、という本です。

手を動かすことで、調べかたを知る

 調べたとはいっても、答えがそのまま書いてあるような資料はなかなかあるものではありません。そもそもそのような資料が無いからこそ、謎が謎のままになっているわけです。

 このため本書では資料に頼ったりするのではなく、手を動かして自分で調べてみることに主眼を置いています。また調べた結果だけを説明するのではなく、どのようにして調べたのか、その過程を多く書くように心がけました。

 つまり「調べかた」を説明しようとしたわけです。

ひとつのものを様々な角度から見ることで、確かめかたを知る

 そして本書でもうひとつ説明しようとしたのは「確かめかた」です。

 実際の解析作業では、確証と自信を持って一直線に答えにたどり着けるようなことはありません。自分の調査と推測は本当に正しいのだろうかと不安に思いながら進めるものです。このため重要なのは「確かめかた」を知ることです。

 例えば本書の第2章(※編集部注:次回の連載第2回で公開予定)では、プログラムを実行させることでprintf()関数の動きを追っています。それに対して第6章(※編集部注:連載第5回で公開予定)では、printf()関数のソースコードを追うことでそれを確かめています。これらは見ているものは同じかもしれませんが、異なる方法で得られた結果を照らし合わせることで「確からしさ」が深まり、調査結果に自信が持てるようになるわけです。

 このように、ある調査結果をまた別の方法でもう一度調べて確認しているような箇所が、本書にはいっぱいあります。「どのようにして確かめるか」といったことを説明しようとしたわけです。

 また本書では「〜だろう」「〜のようだ」といった記述が非常に多くなっています。これはそのような「少しずつ確証を得ていく」「ひとつの結果だけを見て安易に納得しない」という姿勢を重視しているためです。こうした慎重な態度は、エンジニアにとって欠かせないものだと思います。

とりあえず、読んでみよう

 近年はわからないことがあってもネット検索すれば何でもわかる、だから検索力だけが必要…というような風潮がありますが、筆者はこれは半分合っていて、半分間違っていると思います。

 本当に知りたいことというのは、ネット検索しても出てこないものだからです。

 なんでも検索で知ることができる時代だからこそ、必要とされるのは高い検索力を活用して広く浅く早く知るか、もしくは検索では得られないような深い知識を自身で身につけるかに二極化しているように思います。

 そして本書が目指すのは後者です。

 深く知るためには、たとえ今は知識がなくて理解できないとしても、疑問に思うことがあればとりあえず手を動かして、見てみましょう。

 そしてそれでもやっぱりぜんぜん理解できなかったりもするものですが、気にしなくていいです。まずは理解できる範囲で見てみましょう。理解できない部分はとりあえずほうっておいて、1年くらいして思い出したときに、また見てみましょう。

 どんなに知識のある人でも、「まったく知らないファイルをとりあえず開いて見てみた」という瞬間があったはずです。読めるか読めないかではなく、読もうとするかどうかなわけです。

 本書では、様々なソースコードを「とりあえず」読んでみます。そしてとりあえず読むための方法を、本書ではいっぱい説明しています。ぜひLinuxカーネルやglibcやFreeBSDのソースコードを、恐れずに読んでみてください。その先にはどんなに詳しいドキュメントをいくら読んでも得られない、素晴らしい体験があることと思います。

なぜ「ハロー・ワールド」なのか

 本書を書くきっかけとなったのは、ハロー・ワールドのプログラムについて「A4用紙で5ページのレポートを書きなさい」といったような課題が出たことがあるという話を聞いたことでした。

 たった数行のプログラムに対して、どれほどのレポートが書けるものか、疑問に思う読者のかたも多いかもしれません。

 しかしそのような短いプログラムでも、様々な要素を内包しています。

 例えばハロー・ワールドは、printf()という関数によってメッセージを出力しています。しかしprintf()関数のその先を見たことはあるでしょうか。「出力」と一言で言ってしまってはいますが、その「出力」は最終的にはいったいどのような処理によって行われているのでしょうか?

 またC言語では、実行はmain()という関数から始まります。そしてreturnによってmain()から戻ると、プログラムは終了します。しかし、これはいったいどこに戻っていくのでしょうか?

 そういったことを考えていくと、単なる「ハロー・ワールド」であっても様々な要素が前提となって動作しており、だからこそプログラマが楽をできているわけであって、実はそこにはいくつもの興味深いテーマが潜んでいるということがわかります。本書を読んでいただければ、ハロー・ワールドを単なる数行のプログラムであると片づけることはできず、レポート5枚どころか1冊の本のテーマとしてふさわしいときっと思っていただけることでしょう。

本書の環境について

 本書はとくに断りが無い場合には、CentOS 6の環境を利用しています。

 プログラミングや解析の環境はGNUツールをベースとして、コンパイラにはGCC、デバッガにはGDBを利用します。

サポートサイトについて

 書籍の補足や修正情報などを以下のサポートサイトで提供しています。追加情報などもあればサポートサイト上で適宜発信しますので、ぜひご参照ください。

書籍のサポートサイト

http://kozos.jp/books/helloworld/

 サポートサイトでは、書籍中で紹介するサンプル・プログラムやその実行ファイル、書籍の内容の検証に利用したVMイメージ、書籍中で参照している様々なツールのソースコード等も配布しています。内容の確認にご活用ください。

※編集部注:本ページは「はじめに」なので、「です・ます」調ですが、次ページ以降の本編からは、「である」調になります。

       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。