プログラミングをはじめよう
いよいよ2010年度がはじまりました。この春からの新入社員や新入学生の方の中には、これからLinuxでプログラミングを始めるという方も多くいると思います[1]。Windowsでプログラミングといえば、Visual Studioのような統合開発環境を使用するのが一般的のようですが、Ubuntuではどうすればよいのでしょうか。
UbuntuはUnixの文化を受け継ぐOSですから、プログラミングのためのツールは豊富に揃っています。しかしそれゆえに「とりあえずこうすればOK」という定石がよくわからないという人も多いかもしれません。
Linuxにおける開発環境は色々ありますが、やはり一番メジャーな統合開発環境といえばEclipseとNetBeansでしょう。しかし今回から3回にわたって、開発環境としてのEmacsを紹介します[2]。
Emacsのインストール
Emacs自体のインストールは第73回が参考になるはずです。ただし、Ubuntu 10.04ではEmacsはバージョン23が標準であるため、emacs-snapshotパッケージではなくemacsパッケージを使用してください。
C言語でプログラミング
Ubuntu 10.04を使用しているのであれば、C言語での開発に必要なコンパイラやライブラリは最初から導入済みとなっているため、すぐに開発に入ることができます。EmacsでC言語のソースファイルを開けば、自動的にメジャーモードがC言語のコーディングに適したc-modeになり[3]、キーワードが色分けされて表示されます。
tabキーを押すことでEmacsがC言語の構文を解析し、現在の行を適切な深さにインデントしてくれます。複数の行をまとめてインデントしたい場合は、リージョンを選択して C-M-\ で、現在のリージョンをインデントすることができます。コメント関連では、M-; で現在の行にコメントを入力することができ、C-c C-c では現在のリージョン全体をコメントアウトすることができます。これはリージョン内に既存のコメントがあった場合、自動的にコメントをネストしてくれるため、手でコメントアウトするのに比べ非常に効率的です。
他には c-toggle-auto-newline(セミコロンを入力した時に自動改行する機能)や、c-hungry-delete-forward(Backspaceで複数の空白文字を一気に削除する機能)など、C言語のコードの効率的な入力を支援する機能が用意されています。
プログラムを記述したら、コンパイルしてみましょう。M-x compile を実行すると、外部プログラムを使用してソースファイルをコンパイルすることができます。ミニバッファにカーソルが移り、コンパイルに使用するコマンドの入力を促されます(デフォルトは make -k)。Makefileが用意されているならば、このままEnterを押すとmakeコマンドが実行され、コンパイルの様子は *compilation* バッファに表示されます。
Emacs上でのデバッグ
プログラムの開発において、コーディングよりも重要なのがデバッグです。小さなプログラムであれば変数の内容を表示させるような、いわゆるprintfデバッグでもいいのですが、ある程度以上の規模のプログラムであればデバッガの使用は絶対です。デバッガを使えば変数の内容を監視したり、プログラムを一行ずつ実行したり、また特定の条件でブレークさせたりといったことが可能になります。
Linuxにおけるデバッガといえば主にgdbですが、コマンドラインからgdbを実行しても、お世辞にも使いやすいデバッガとは言い難いのが現実です。しかしEmacs上でgdbを実行すると、統合開発環境さながらの、ソースコードと連携したデバッグを行うことができます。プログラムをデバッグオプションつきでコンパイルしたら、M-x gdbを実行してみましょう。
gdbのバッファ上で "r" と入力すると、プログラムが実行されます。"s" でステップ実行、"c" で実行再開と、このあたりは通常のgdbと同じです。ブレークポイントを設定するには、"b ソースのブレークさせたい行番号" と入力する必要がありますが、Emacs上でソースとgdbを同時に表示させておけば、行番号を指定するのも簡単です。ブレークポイントを設定すると、ソースコードの該当行に丸印がつき、ブレークポイントが一目でわかるようになっています。
ブレークポイントを設定したら、"r" でプログラムを走らせてみましょう。実行中のプログラムがブレークポイントに到達したら実行が中断されます。この状態で "p 変数名" と入力すると、現在の変数の内容を表示させることもできます。
ソースコードが表示されているなら、"b 行番号" などと面倒なことをせずに、ソースコード上で直接ブレークポイントを指定したくなるかもしれません。その場合はブレークポイントを設定したい行にカーソルを移動して C-x Space と入力することで、ブレークポイントを設定することもできます。
デバッグ時に有効なマイナーモードに、gud-tooltip-modeがあります[4]。デバッグ中に M-x gud-tooltip-mode を実行してみましょう。gud-tooltip-modeが有効になっている状態で、プログラムをブレークして変数の上にマウスポインタを移動させると、現在の変数の内容をtooltipで表示させることができます。これもEmacs上でのデバッグならではの便利機能です。
タグジャンプ
ある程度大きなプログラムになると、機能ごとにファイルを分割するのは当然です。特に他人が書いたプログラムを読むときには、多数のファイルを渡り歩きながら関数の定義を参照し、ネストされた関数呼び出しを追っていくというのはよくあることです。「この関数どこで定義されてたっけ?」や「この関数、どこで呼ばれてるの?」と悩むことも多いのですが、そんな時に便利なのがgtagsによるタグジャンプ機能です。gtagsを使えば、任意の関数や変数の定義元や、関数を呼び出している箇所を探してジャンプすること、またそこから復帰することが簡単に行えるようになります。
gtagsを使うには、まずglobalパッケージをインストールする必要があります。
インストールが完了したら、ソースコードのディレクトリのトップでgtagsコマンドを実行してください。GPATH、GTAGS、GRTAGS、GSYMSといったディレクトリが作成されます。Emacs上からgtagsを利用するには、ソースコードを開いてM-x gtags-modeを実行してください。gtagsが有効になっている状態では、以下のような操作が可能です。
M-x gtags-find-tag | 指定した関数の定義を探します |
M-x gtags-find-rtag | 指定した関数が参照されている部分を探します |
M-x gtats-find-symbol | 指定した変数の定義を探します |
M-x gtags-pop-stack | ジャンプする前の場所に戻ります |
また、C言語のソースを開いた時に自動的にgtagsを有効にするには、.emacsに以下のようにhookを書いておくとよいでしょう。