第2回 サルでも分かるプログラミング言語の新潮流【後編】:プログラミング言語の進化を追え(3/3 ページ)
「ガーベジコレクション」「リフレクション」「アスペクト指向」「クロージャ」「イテレータ」「型推論」など、近年、プログラミング言語の世界に新しい概念が続々となだれ込んでいるように見えます。しかし、この背景には、実はあまり知られていない歴史が隠されているのです。
リフレクション
「リフレクション」とは、プログラムがプログラム自身を操作する機能です。例えば、現在実行中のプログラムに関する情報を得たり、現在実行中のプログラムを書き換えたり(メソッドやクラスを追加/変更など)する機能が、リフレクションに相当します。プログラムそのものを扱うプログラミングであることから、しばしばメタプログラミングと呼ばれます。自分自身でインタープリタが記述されることの多いLispなどの言語では、リフレクションは言語の本質的機能の一部です。
リフレクションは非常に強力で、いろいろなことが可能になります。例えば、Rubyで記述されたWebアプリケーションフレームワークであるRuby on Railsでは、Rubyのリフレクション機能を使って、
- データベーススキーマに対応したオブジェクトを作る
- オブジェクト間の関係を維持する機能を生成する
- バリデーションを行う機能を生成する
などの処理を行っています。これによって、人間がいちいちプログラムを書き換えたり設定ファイルを用意したりする手間が減り、生産性を向上させています。
アスペクト指向
「アスペクト指向」は複数のクラスを横断するような機能(例えばデバッグ用にさまざまなメソッド呼び出しのログを取る機能)を、ひとまとめにして管理する機能です。従来のオブジェクト指向言語では、機能をクラスに従って組織化します。しかし、「ログを取ること」のように複数のクラスにまたがる機能は、あちこちのクラスに分散してしまいがちです。このような機能は1つの関心事に所属するので、できればひとまとまりの塊として扱いたいものです。これを「関心の分離(Separation of Concerns)」と呼び、機能をクラスから「引きはがして」まとめる単位となるのがアスペクトです。
アスペクト指向は比較的新しい概念ですが、その基礎になっているのは、Common Lispのオブジェクト指向機能であるCLOS*に含まれている「メソッドコンビネーション」という技術です。実際、アスペクト指向の提唱者Gregor Kiczalesは、CLOSの設計者の1人でもあります。
型推論
JavaやC++のように、変数や式に型のある言語*では、プログラムを解析することでプログラム自身に型の矛盾があるかどうかを検出できます。プログラム中の多くのエラーは型の矛盾によって検出できますから、コンパイルするだけで実際に実行しなくても網羅的にエラー(の一部)を検出できるのは大変うれしいことです。
しかし、変数や関数などにいちいち型宣言を行うのはいろいろと面倒を伴います。そのこともあって、Javaのプログラムと型宣言のないRubyのプログラムを比較すると、Javaの方がずいぶん冗長に見えます。また、いちいち型を考えないといけないのは、プログラマーにとって少々負担です。
「型推論」は、静的型のメリットはそのままに、型指定の手間を省く技術です。MLやHaskellなどの関数型言語では広く採用されている技術で、定数や定義済み関数の型などを手がかりに、変数や式の型をできる限りコンパイラが推定してくれます。ですから、プログラマーは型を指定する必要がほとんどありませんし、それでいて型の矛盾はコンパイル時に検出されます。
まとめ
2回にわたって、近年メインストリームのプログラミング言語に取り込まれつつある「新技術」の幾つかについて概観してみました。現代のプログラミング言語は、生産性向上のための新しい技術を貪欲に取り込みつつあります。
プログラミング言語は、IDEなどのツールと並んでプログラミング効率を左右する存在です。プログラミング言語の進化には、これからも注目していきたいと思います。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
CLOS
Common Lisp Object Systemの略。当初のCommon Lispには含まれておらず、後から追加になったため独立した名前がついている。多重継承、マルチメソッド、メソッドコンビネーションなど、よく見かけるオブジェクト指向機能とは一線を画している。発音は、「くろす」でも「しーろす」でも何でも構わない、というのが公式見解らしい。
変数や式に型のある言語
このような言語は、「静的型」に分類される。Rubyのように変数や式に型を指定しない言語は「動的型」に分類される。
本記事は、オープンソースマガジン2006年10月号「プログラミング言語の進化を追え」を再構成したものです。
関連記事
- developersLife〜開発者という生き方
- サルでも分かるプログラミング言語の新潮流【前編】
近ごろプログラマーかいわいで、「関数型プログラミング言語」という言葉をよく耳にするようになった。本連載では、プログラミング言語を取り巻く状況をあらためて俯瞰し、プログラミング言語開発の現場で何が起こっているのかを解説する。 - ちょっぴりLinuxが語れるようになる基礎知識
Linuxディストリビューションは数多く、どれを選ぶか悩むところだ。特にここ最近で各ディストリビューターやプロジェクトに動きがあり、数年前とは状況が変わってきている。ディストリビューション選びのポイントとなる部分を整理し、Linuxディストリビューションのいまを掌握しよう。 - ちょっぴりLinuxの開発/配布体制が語れるようになる基礎知識
インストールが楽になるようにと始まったディストリビューションだが、その開発/配布体制にも発展の流れがある。ライセンスの話も整理しながらポイントをまとめていこう。 - オープンソースライセンス事情を俯瞰する
フリーソフトやプロプライエタリなソフトウェアから「オープンソース」を区別しているのがライセンスである。GPL、LGPL、Apache License……数多く存在するライセンスだが、それぞれの違いについてまとめる。
関連リンク
Copyright © ITmedia, Inc. All Rights Reserved.