XCodeを使ってみよう

はじめに

2004年の3月からECCのシステムが一新し、 今までの無機質なNC端末からとは一転、 端末室には華やかな一面のiMacがずらりと並ぶようになりました。 さて、いままでの情報棟の環境でプログラミングをしようとした場合は、 NC端末上からEmacsなどのエディタでコードを書き、 ターミナルからgccなどを呼び出してコンパイルさせるという方法が一般的でした。 もちろん、今のシステムでもその方法は可能ですが、 MacOSXにはXCodeという統合開発環境が入っているのですから、 統合開発環境を使った優雅なプログラミングをしてみたいと思うのが人情というものです。

さて、かくいう僕もXCodeを使うのはこの4月に入ってからが初めてです。 ここでは、統合開発環境って何?という初心者の方を対象とし、 XCodeの基本的な使い方を習得したいと思います。 というわけで至らない点もあるかもしれませんが、どうかおつきあいください。

この記事を書いたのはCΔTです
質問等あればまでどうぞ。

とりあえず使ってみる

XCodeの起動

XCodeは起動ディスクのルートレベルにある「Developer」ディレクトリの 「Application」ディレクトリにあります。 デスクトップの右上にこんなかんじのアイコンが表示されていると思いますが、 それをダブルクリックしてFinderを開き、 Developer->Apprication とたどってください。
また、後々頻繁に使うことになると思うのでDock (画面最下部に表示されている、ショートカット集) に登録しておくと便利でしょう。 XcodeのアイコンをDockの適当なところまでドラッグしてくれば、 それだけで登録されます。

サンプルプロジェクトをビルドする

XCodeで一から開発を始める前に、 いったんサンプルプログラムをビルドしてみて開発環境全体の動きを 見てみることにしましょう。 既に他の統合開発環境を使い慣れている人はXCodeの感覚をつかみ、 こういうものは初めてだという人は、とりあえず手順通りにやってみてください。

サンプルプロジェクトのコピー

ルートディレクトリの「Developer」ディレクトリ以下の 「Examples」ディレクトリには何種類にも分類された XCodeのサンプルプログラムが格納されています。
まずは、ここにあるサンプルプログラムを自分でビルドしてみることにしましょう。
さて、ここからXcodeに読み込ませることももちろんできますが、 このディレクトリに対しては読み取り権限しかないので、 ソースを読むだけでビルドができません。 なので、とりあえず自分のホームディレクトリへコピーすることにします。
どれでもいいのですが、ここでは「AppKit」内の「Temperature Converter」を使ってみます。 「Temparature Converter」をディレクトリごと自分のホームディレクトリへコピーしてください。 コピーしたら早速「Temparature Converter.xcode」をダブルクリックしてみましょう。 XCodeが起動し、こんな感じの画面が表示されると思います。

ハンマーのマークのついたファイルが実際にコンパイルされて コードが生成される実装ファイルです。 また、ビルド後に生成されるファイルがTemparature Converter.appとして表示されていますが、 まだビルドしていないのでファイルが存在しないため、赤い文字で表示されています。

ビルドする

というわけで画面上部のハンマーマークのアイコンをクリックするとビルドが開始されます。 しばらく待つとプログラムが完成し、続けてプログラムが実行されます。

このプログラムは4つの温度の単位を相互に変換してくれるプログラムで、 どれか一つの場所に数字を入力してEnterキーを押すと、他の3つの表示がかわります。 Command+Qでプログラムは終了します。(Commandは無変換の左の「半角/全角漢字」キー)
すると実行ウィンドウに「Temparature Converter はステータス 0 で終了しました」 と表示されますが、このウィンドウも閉じてください。 以上がビルドの流れとなります。

コマンドラインののアプリケーションを作ってみる

というわけで実際にやってみる

では、早速何か作ってみることにしましょう。 HelloWorldと表示させるだけのHelloWorldプログラム作ってみることにします。
XCodeのメニューからファイル->新規プロジェクトを選択します。すると、「アシスタント」 の画面が出てくるので、一番下のToolのなかにあるStandard Toolを選択します。
選択画面のすぐ下に説明文が表示されていますが、Standard Toolを選択すると そこに書いてあるとおりC言語を使ってコマンドラインのプログラムを作ることができます。

次に、プロジェクト名を入力する画面が現れるので適当にプロジェクト名を決めてください。
プロジェクト名を入力すると自動的にプロジェクト名として入力したものと 同じ名前でディレクトリが作られます。 それで特に問題ないので、ディレクトリの部分はそのままにしておけばいいでしょう。

完了をクリックすると、必要なファイルが自動的に生成され、下のような画面が 現れます。 main.cが実際にソースコードを記述するファイルで、hogeが生成されるプログラムファイルです。 ですが、まだプログラムは生成されていないので、最初の状態では赤い文字で表示されています。

main.cをダブルクリックして、main.cの中身を見てみます。 すると、すでに数行の記述があることが確認できると思います。 また、//insert code here...との記述があることも確認できると思いますが、 プログラミングをする際にはそこにコードを記述していくことになります。
//insert code here...とある行の下に一行だけprintf("Hello, World!\n");と入力します。 そうしたらもうコードの記述はしないのでmain.cのウィンドウは閉じてしまってください。

ビルドを実行して、プログラムを生成させます。このアイコンをクリックするとビルドが行われます。
すると、下の図のような画面が表示されると思います。その画面の最初の行に Hello, World!と表示されることを確認してください。 これがprintf("Hello, World!");と記述したことによって表示された一文です。

また、ターミナルからもこれが実行できることも確認してみましょう。
画面下のDockからターミナルを起動してください。 そして、ターミナルで
cd hoge
./hoge
と入力します。すると、下の画面のように、ターミナルにHello, World!と表示されるはずです。
以上が、XCodeを用いたCプログラミングの流れになります。
試しに、まんさく先輩による 初心者用のC言語テキスト第二回 にあるソースをコピーしてきて プログラムをビルドしてみましょう。
というわけで、そこのページからソースをコピーしてきて、main.cに貼り付けます。

で、ビルドします。

できました。

デバッガを使ってみよう

とりあえず、ここまで読めばソースから実行ファイルを生成する ことはできるようになっているはずです。 以下はまだわからなければ読まなくても問題はないでしょう。

デバッガって?

プログラミングをする際に注意しなければならないことは、 ソースが「文法的に正しい」ということと、 「内容的に正しい」ということです。 さて、文法的に正しいということは、 その字が示す通りに、C言語ならC言語のJavaならJavaの 規則に則って正しく記述されているということです。 そして、作成したソースに文法的な間違いがある場合 ここ にも記述がありますが、コンパイラがコンパイル時にエラーを吐き出して止まってしまいます。 しかし、コンパイラ吐き出してくれたエラーを一つ一つ検討していくことで 文法的な間違いは根絶できるはずです。 ですが、コンパイラがチェックしてくれるのは文法的なエラーだけで、 その記述が一体何をさせようとしているのか、というところまでは見てくれません。 プログラムの実行ファイルはできたけれども実行させてみたら 予期していたものとは違う動作をしていた、 ということは残念ながらよくあることです。 その原因としては関数の使い方を勘違いしていた、変数の扱い方を間違えていたとか、 変数がオーバーフローを起こしていたとかまぁいろいろ考えられるわけです。 そんなときがデバッガの出番です。 Xcodeは統合開発環境としてソースコードレベルのデバッガーを内蔵しています。 それはどういうことかというと、実際にプログラムを走らせてその動きを制御しながら、 ソースコードと動きを見比べることでバグを追いつめていくことができる、ということです。 最も基本的な使い方としては、プログラムを途中で止めて、その時点での変数の値を調べ、 再び実行させるという操作を繰り返すことで動作を確認するということになるでしょう。
言葉だけで説明されてもなかなかピンとこないかもしれません。 それでは、簡単なサンプルプログラムを 用いてデバッガの簡単な使い方を見ていくことにします。

デバッガを使ってデバッグしてみる

ここでは、このサンプルプログラムを つかってデバッガの動きを実際に見ていく ことにしましょう。

その前に、このサンプルプログラムは何を目的としているのかを説明します。
ソースコードを見てください。 main関数の最初の部分でvalA,valB,answer,opsという四つの変数を宣言 しています。これはvalAに一つ目の値、valBに二つ目の値を与えて、 opsの値によってこの二つの値の和、差、積、商のいずれかを画面に 表示させてみようというプログラムです。ちなみに、opsの値と 計算の対応はopsが0ならvalAとvalBの和、opsが1なら差、opsが2なら積、 opsが3 なら商を求めるという具合になっています。
サンプルプログラムを見ると、valAが100、valBが50、 opsが3となっていますので、100÷50の値を 表示させようとしている訳です。

それでは早速ビルドしてみることにします。 今さっきの手順と同じに、新規プロジェクトからStandard Tool  を選択して、適当にプロジェクト名を決め、 main.cを開いてサンプルプログラムのソースを貼り付けます。 それがすんだらビルドをします。 ビルド自体は何の問題もなく完了するのですが、実行結果をみてみると 「answer is 100」となっていて、求めたい値の「2」とは異なっています。 それでは、デバッガを用いてデバッグをしてみることにしましょう。

main.cの画面を開いてください。すると、ウィンドウの左側に 他のウィンドウと違って少し幅のある柱があると思います。 そこで、ops=3;とswitch(ops){の間のところの柱をクリックしてください すると、右の画面のように目印が出てくると思います。 これはブレークポイントといって、デバッガを動かしたときに、 ここでプログラムがいったん停止するようになります。 では、ブレークポイントの設定がすんだら、デバッグをして見ましょう。

再生ボタンのついたハンマーのアイコンを長押しします。すると、 「ビルドと実行」「ビルドとデバッグ」「実行」「デバッグ」を 選択するパネルがでてきますので、「ビルドとデバッグ」を選択します。

するとこんな感じにデバッガが起動します。 いまさっきブレークポイントをつけたところでプログラムは一時停止するのですが そこには何も記述がないため、次の行のswitch(ops)の行でプログラムが停止 しているのがわかります。 また、ウィンドウ右上の変数と値の部分を見てください。 Localのグループの中にvalA,valB,answer,opsの4つが表示されて いることがわかると思います。


ステップオーバーのアイコンをクリックします。 するとプログラムがさっきの状態から一行進められて、 赤く表示されている行が変わっていることがわかると思います。 ここで、switch文がcase3にうまくジャンプしてくれていることが 確認できます。ここでコードを見てみると、 /であるべきところが+になっていて明らかに 間違っていることはすぐにわかるのですが、ちょっと見なかったフリ をしてさらにスッテプオーバーすることにします。 なお、この時点ではまだ赤く表示されている行は実行されていない ので、画面右上のLocalsのところの値には何の変化もありません。

というわけで、スッテプオーバーを実行すると右の画面の 用になります。さっきの状態から Localsのところのanswerの変数の値が変わったので 赤く表示されています。ここで、予期していた値と 実際にanswerに代入されている値が違う、ということで バグに気がつくわけです。

間違いに気付いたので、早速ソースの修正にかかります。 終了ボタン をクリックして、デバッグを止め、main.cの
case3:
  answer = valA + valB;
の部分を
case3:
  answer = valA / valB;
のように修正して、もう一度ビルドします。このとき ビルドの前にmain.cを保存することを忘れないでください。

で、もう一度実行してみます。 しかし、やっぱり実行結果は「answer is 100」のままです。

何か見落としがあったということなので、もう一度デバッガを 起動します。そして、2回ステップオーバーをして、 右の画面の状態まで進めます。 このとき、変数の値を見てみると、answerは2となっていて 変数に代入されている値には何の問題もないことがわかります。 そこで、いま赤く表示されているソースの行を見てみると
printf("answer is %d", valA);
となっていて、answerの値を表示させたいのにvalAの値を表示させ てしまっていることが見つかります。 早速ここも修正して、もう一度ビルドします。

というわけで、めでたくデバッグは完了しました。