【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
Cocoaの素、Objective-Cを知ろう

Objective-Cは特殊な言語?

竹下 肯己
株式会社 qnote

2008/9/9

iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう(編集部)
- PR -

 唐突ですが、皆さんは新たに1つのプログラミング言語を修得しようと思い立ったとき、最初に何をしますか。その言語の入門用サイトを見て回る、関連書籍を立ち読みする、サンプルを入手して取りあえず動かしてみる、といったところでしょうか。ちなみに私は書籍が好きで、しかも立ち読みではなく購入派です。

 いずれにしても、まずはその言語のコードを目で見て、「いったいどんな言語なのか」というイメージをつかむのが最初の一歩となるでしょう。何かしらのプログラミング経験がある人なら、コードを眺めて、「ああ、あの言語に似ているな」とか「うわ、これはとっつきにくい」といった印象を抱くはずです。例えば、初めて見たPerlのコードが複雑な正規表現でびっしりだった場合、それは不幸な出合いといえるかもしれません。

コードの「見た目」から入る

 さて、Objective-Cのコードの特徴的な部分をいくつか盛り込み、かつ不幸な出合いとならないようになるべくシンプルにまとめたコードを提示してみましょう。

#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <stdio.h>

// クラスの宣言
@interface MyTestClass : NSObject {
    NSString *myTestString;
}
- (void)setMyTestString :(NSString *)testString;
- (void)printMyTestString;
@end

// クラスの実装
@implementation MyTestClass : NSObject
- (void)setMyTestString :(NSString *)testString {
    myTestString = testString;
}
- (void)printMyTestString {
    printf("myTestString is %s \n", [myTestString UTF8String]);
}
@end

// 実行プログラム
int main(void) {
    id myTestClass;
    myTestClass = [[MyTestClass alloc] init];
    [myTestClass setMyTestString:@"aiueo"];
    [myTestClass printMyTestString];
    return 0;
}
objc.m

 細かい話は後にして、まずは上記のコードを先入観抜きでさらっと眺めてみましょう。所々に「おや?」と思う個所があるはずです。ほかの言語との「見た目」の違いはどこでしょうか。

・あちこちに「@」が……

 最初に目に付くのは「@(アットマーク)」かもしれません。「@interface」とか「@implementation」とかが目に付きますね。

 Objective-CはC言語を拡張することで成立しているので(これについては後ほど説明します)、コンパイラに対して特にObjective-C的な概念や処理方法を明示するために、@で始まる記述が用意されています。これをコンパイラディレクティブと呼びます。

・クラスの記述が2つある?

 たいていのオブジェクト指向型の言語では、クラスの定義は「class」という予約語で始まります。ところが上記のコードではそういったキーワードが見当たりません。「MyTestClass」がクラス名であることは想像がつくと思いますが、その前に記述されているのは、@で始まるコンパイラディレクティブで、しかも「@xxx クラス名……」という記述が2つも存在します。

 Objective-Cでは、クラスの定義にはコンパイラディレクティブを利用します。かつ、クラスの宣言と実装は分けて記述します。「@interface」でクラスを宣言し、そのクラスがどんな変数やメソッドを保持しているかを示します。「@implementation」ではメソッドの具体的な処理内容を実装します。

・idって何?

 Objective-Cでは、オブジェクト型の変数を宣言する場合、idという共通のデータ型が利用できます。どんなクラスのオブジェクトでも保存できる便利なデータ型です。もちろん、クラス名を明示してクラス名 *変数名と記述することもできます。

・オブジェクトにメッセージを送る

 もう1つ、上記のコード中で特徴的な部分があります。[]で囲まれた部分です。

 Objective-Cでは、あるオブジェクトのメソッドを呼び出したいときには、そのオブジェクトに対してメッセージを送ります。そのための記述が、[と]で囲まれた部分で、これはメッセージ式と呼ばれます。

 C++やJavaなどでは、メソッドの呼び出しは「オブジェクト.メソッド()」のようにドットでつないで記述されますから、この部分も異質と感じる人は多いかもしれません。

C言語を「拡張」するということ

 ここまで、コードの「見た目」からObjective-Cの記述上の特徴をいくつか見てみました。

 Objective-Cの少し風変わりな記述法は、この言語が、C言語を拡張してオブジェクト指向を実現している言語であるということ、オブジェクト指向のお手本としてSmalltalkという言語を参考にしているということに由来しています。

 C++も「C言語を拡張してオブジェクト指向を実現している言語」ですが、C++とObjective-Cでは「拡張」の考え方が少々異なるようです。

 言語を拡張するということは、新たな概念やそれに伴うコードの表記方法を導入し、それらを解釈・処理できるようにコンパイラを拡張することが中心となります。例えばオブジェクト指向を取り入れたいのならば、「クラス」などの概念と、それを表現するための表記方法を決め、しかるべくコンパイラを拡張する、といった具合です。

 このとき、既存の概念と同等のキーワードとして新たな概念を導入するのか、あるいはコンパイラに対して「これ、ちょっと特殊な処理をしてほしいんだけど……」といった明示的な記述として導入するのか、といった選択が考えられます。C++は前者、Objective-Cは後者ですね。

 C++とObjective-Cの名前の違いにも表れているように、前者はより抜本的に言語仕様を改変し、新たな言語として生まれ変わらせる拡張、後者は基となる言語の記述法を保持しつつ拡張機能を明示的に埋め込むことで、言語に新たな側面を付与する拡張、と考えることもできます。

 このような違いから、Objective-Cは、基のC言語に対し「マクロ的である」とか「メタ言語的である」などといわれることがあります。先ほど紹介した、コンパイラディレクティブによるクラスの定義などはその代表例で、Objective-Cのコードの最大の特徴ともいえます。

 マクロ的な言語拡張の場合、コードの「見た目」の面では、純粋なC言語の世界との境界が明確で分かりやすいというメリットがあります。半面、特殊な表記がコードの中に溶け込まず、なんだかマニアックでとっつきにくく見えてしまう場合もあるかもしれません。

 
1/2

Index
Objective-Cは特殊な言語?
Page1
コードの「見た目」から入る
C言語を「拡張」するということ
  Page2
Smalltalkの影響
Objective-Cはマニアックか
Objective-Cとアプリケーション開発

Cocoaの素、Objective-Cを知ろう

 Mac OS X関連記事
プログラマーを引き付けるMac OS Xの魅力
続々移行するそのワケとは
 Mac一筋という熱狂的なユーザーだけでなく、「面白いことをしたい」と考えるエンジニアもMac OS Xを利用し始めている。いったいなぜだろう
Mac OS XでAMP構築
3通りの方法で整備できる開発環境
 Mac OS Xの上にWebアプリケーションの定番、AMP(Apache+MySQL+PHP)環境を3通りの方法で導入してみましょう
Mac OS Xで動かす軽量プログラミング言語
導入からPHP拡張モジュール組み込みまで
 Leopardでは、インストール直後からいくつかの軽量プログラミング言語が利用できます。早速試してみませんか?
Objective-Cは特殊な言語?
Cocoaの素、Objective-Cを知ろう(1)
 iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう
Mac内にPHP4、5、6を同居させるコツ
Mac OS X+PHPでオールインワン環境(インストール編)
 PHP4の開発は終了したが、移行の問題は残されている。異なるバージョンのPHPをスムーズに切り替えるには?
  Coding Edgeフォーラムフィード  2.01.00.91

Coding Edge フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています