開発環境を有効に使う:目指せ! Cプログラマ(6)(3/3 ページ)
開発環境を使ったプログラミングについて解説します。プログラム上のミス、いわゆるバグを発見するのに役立つデバッガを使ったデバッグの基礎についても学びます。
字句解析について知る
Cのプログラムをよく眺めてみると、同じことをするプログラムでも、書き方が人によって少しずつ異なっていることが分かります。
例えば、あるHello Worldプログラムを見てみましょう。これは、PleiadesでHello Worldプロジェクトを作ったときに生成されるコードから、コメントを除いたものです。
#include <stdio.h> #include <stdlib.h> int main(void) { puts("!!!Hello World!!!"); return EXIT_SUCCESS; }
よく見ると、いくつかスペースやタブが入っていることが分かります。「int」と「main」の間にはスペースが入っていますし、「main(void)」と「{」の間にもスペースが入っています。「{」のうしろには改行があって、「puts」の手前にはタブが入っています。
実は、これらのスペースやタブは、Cプログラムにとって必要なものと、そうではないものがあります。
- 「int」と「main」の間にあるスペース:必要
- 「main(void)」と「{」の間にあるスペース:なくてもかまわない
- 「{」のうしろにある改行:なくてもかまわない
- 「puts」の手前にあるタブ:なくてもかまわない
なくても構わないものは、もしそれがなくてもプログラムはコンパイルできますし、実行にも問題がありません。ただ、読みやすくするために入っているだけです。
しかし、必要なスペースやタブをなくしてしまうと、コンパイルエラーになります。
なぜこのようになっているかを知るためには、コンパイラが行っている「字句解析」という処理について知る必要があります。字句解析とは、文字の並びを意味のある単位に分けることをいいます。
といっても、それほど難しいことはありません。Cコンパイラが処理する字句とは次の物を指します。
- キーワード(intやdoubleといった、Cで予約されているワード)
- 識別子(変数名や関数名など、オブジェクトを識別するための名前)
- 定数
- 文字列リテラル
- 区切り子(わずかな例外を除いて演算子のこと)
C99のキーワードは37個の種類があり、その中には連載のこれまでの記事では説明していないものもあります。すでに説明したものでキーワードに相当するものとして、intやdoubleといった型名や、sizeof演算子、typedefがあります。
Cコンパイラが備える字句解析は、これらのものがソースコード中に現れると、それぞれを字句として分割していきます。文脈から明らかに字句として分けられるものは、スペースがなくても分けてくれます。
ところが、もし「int main」にスペースがなかったら「intmain」となりますが、これを「int」と「main」に分ける、ということは行われません。「intmain」という、1つの字句として解釈されます。なぜなら、「intmain」という文字列は、字句の1つである識別子として解釈することが可能だからです。
逆に字句の分かれるところにはスペースを入れることができます。「main(void)」は「main ( void )」と書いても問題ありません。スペースがあってもなくても、同じように字句解析が行われます。
このようなルールで字句解析が行われますが、Cプログラムの字句はスペースや記号という直感的に分かりやすいところで分割されますので、字句解析のルールがあまりよく理解できなくても違和感なく読めると思います。もちろん、理解できていればさらにスムーズに読み書きできるでしょう。
ちなみにスペースを入れることができるところには、スペースをいくつ書いてもかまいません。さらには、スペースの代わりにタブや改行を入れることもできます。これらを駆使することで読みやすいプログラムを書くことができます。
他人の書いたプログラムを読もう
自分一人でプログラムを書いていると、正しいのか間違っているのか、あるいは見当違いのことをやっているのか、分からなくなることがあります。まわりに聞ける人がいるときには、素直に聞いてみましょう。
聞ける人がいないときには、インターネットでほかの人が書いたプログラムがどうなっているか探してみましょう。Webにはさまざまなソースコードが公開されていますが、ここではそれらをまとめて検索してくれるGoogleソースコード検索を紹介しておきます。
「http://www.google.com/codesearch」にアクセスして、検索ボックスに何かキーワードを入れてみましょう。ただしそのままでは、ほかの言語のソースコードも一緒に出てきてしまいますので、検索キーワードと一緒に「lang:c」と指定します。これでCで書かれたソースコードだけが表示されます。ただし、お手本としたいソースコードと、そうでないソースコードがあります。もちろん、見分けることは難しいのですが、有名で更新が頻繁にされているオープンソースソフトウェアのコードであれば、お手本として良いと筆者は考えています。1つの目安程度にしかなりませんが、参考にしてください。
基本をきちんと押さえることと、たくさんのコードに触れることが上達の近道です。ほかにもWebにはたくさんのソースコードがありますので、連載のお供にしてみてください。
今回学んだこと
- Pleiadesでのコンパイルの様子はコンソールの「C-ビルド」に表示されます。
- Pleiadesと同じようにコマンドプロンプトからもコンパイルできます。
- 作成したプログラムはPleiadesを使わなくても実行できます。ほかのPCに持って行って実行することもできます。
- Pleiadesでデバッグ パースペクティブに変更し、プログラムの実行をステップごとに確認しました。
- printfの基本的な使い方と、書式文字列の種類について学びました。
- コメントには2種類の書き方があります。
- main関数はプログラムが始まるところです。
- Cコンパイラにおける字句解析について学びました。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう - Zope 3の魅力に迫る
Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? - 貧弱環境プログラミングのススメ
柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? - Haskellプログラミングの楽しみ方
のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう - ちょっと変わったLisp入門
Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう