◆研究構想(具体的な研究内容および3年間におけるその進め方) 目的:「プログラム言語のPC互換機化」 ------------------------------------- パーソナルコンピュータは、いわゆる「PC互換機」の登場により、部品の接続イ ンターフェースが事実上標準化された。その結果、無数の企業が新しい部品を開発・ 製造し、自由競争の原理により爆発的な性能向上・多様化を遂げた。本研究は、「プ ログラム言語のPC互換機化」をはかり、いままで進歩の遅かったプログラミング言 語の進歩速度を、飛躍的に向上させることを目的とする。 背景:「言語機能のだきあわせ」 ----------------------------- 現在のプログラミング言語は、巨大な一枚岩のシステムである。特に近年、実用的 プログラミング言語に必要とされる言語機能は増大し、プログラミング言語の仕様は 肥大化の一途をたどっている。このことは、以下のような問題を引き起こしている。 1.言語研究者にとって、新しい言語機能の実験を非常に難しくする原因になって いる。 新たな言語機能が現実のアプリケーションの中でどのように使われるかを調べるため には、必要な言語機能を一通り持った実験用言語処理系を実装しなければならない。 しかし、必要な言語機能が増大した今日では、それは極めて困難になってきている。 他の手段としてソースコードが公開されている言語処理系の一部を改造して新たな言 語機能を追加する方法もあるが、言語処理系が巨大で一枚岩なため、それも容易では ない。 2.プログラマーにとって、自分が望む言語機能が、手元の言語処理系になかなか 採用されない、という問題が生じている。 すべての言語機能は「だきあわせ」の形でしか提供されない。プログラマーには、自 分の欲しい機能を選択する自由はほとんどない。使用するプログラミング言語を選択 した段階で、利用できる言語機能は決まってしまう。時には、言語設計者の好みによっ て機能が選択され、それがプログラマーに押し付けられることになる。最新の言語研 究の成果が、手元の言語処理系に採用される確率は極めて小さく、採用されるとして も何年もの時間がかかってしまう。プログラミング言語の言語仕様が巨大で一枚岩な ために、新たな言語機能を追加することが非常に難しいからである。 これらの問題を解決するために、プログラミング言語処理系の部品化を試みる。 言語処理系の部品化で何が起きるのか? ------------------------------------ 1.「プログラミング言語の拡張性の向上」 プログラマーは、自分が書こうとするプログラムの特徴に応じて、必要な部品を組み 合わせることによって、自分の目的に最適なプログラミング言語を簡単に作り上げる ことができるようになる。 例えば、書こうとするアプリケーションがリアルタイム性を要求するか、トータル の実行効率が重要かによって、異なるアルゴリズムに基づくガーベージコレクション (GC)部品が選択できるようになる。 これはちょうど、PC互換機の市販の部品(例えばCPU、グラフィックスボード、 メモリなど)を組み合わせることによって、自分の用途に最適なパーソナルコンピュー タを作り上げることができるのと同じである。数値計算目的なら速いCPU、CAD 目的なら3Dグラフィックスボード、フォトレタッチ目的なら多くのメモリを選択す る、といった具合である。もちろん後から部品を追加・交換することでシステムを拡 張することもできる。 言語の部品化は、言語処理系を実装する側の手間も大幅に減らす。 例えば、 terminal emulator ソフトウエアで、接続手順を自動化するためのプログ ラミング言語が必要になったとする。従来はこのような場合、そのソフトウエア専用 のスクリプト言語を実装して組み込むしか方法はなかった。 もし部品化された言語処理系があれば、 terminal emulator を操作するための制御 構造のみを部品として実装すれば良い。その部品以外は、完成度の高い 「off-the-shelf」な言語機能がそのまま利用できる。またユーザにとっては、今ま でのように専用スクリプト言語を習得する手間が不要になるというメリットがある。 2.「自由競争の原理による言語の高機能化」 言語が部品化され、標準的な言語部品接続インターフェースが規定・公開されれば、 それに基づき、大学や企業なども独自の言語部品を開発することができる。部品単位 の研究・開発であれば、比較的小規模のグループでも完成度の高いものが実現できる。 そして、プログラマーは、市場に出た部品のうち、もっとも高性能なものを選択する。 部品の開発者は、利用者からのフィードバックを元に、部品をより便利で高機能なも のに改良してゆける。 部品の組み合わせの自由度が高ければ、いい部品が普及する(売れる)という自由競 争の原理が健全に働き、その結果、個々の部品の機能・性能は向上すると考えられる。 3.「言語機能の多様化」 需要が比較的少ない言語機能であっても、小さい部品単位であれば、容易に開発する こと可能である。したがって、従来は確実に切り捨てられていた特殊用途向けの言語 機能が利用可能になる。これにより、プログラミング言語機能の多様化が進む。 例えば、ある制御構造を導入することによって、特殊な数値計算プログラムの記述が 飛躍的に容易になるとする。しかし、もしその制御構造の利用者が全体の1%にも満 たなければ、その制御構造がプログラマーの手元の言語の標準仕様に採用されること は絶対にない。プログラム言語が持つマクロのような言語拡張機能で、その制御構造 が実現できる場合は問題ないが、常にそうとは限らない。もし言語処理系が部品化さ れていれば、新しい制御構造も比較的小さな追加部品として実現可能になる。 部品の多様化は、PC互換機の部品においても見られる現象である。 4.「言語間の厚い壁の消滅」 部品化された言語処理系は、様々な目的の言語のシームレスな統合という効果ももた らす。 現在は、用途に応じてシステム記述言語、数値計算用言語、スクリプト言語など異な る種類の言語が使い分けられている。それぞれの言語は歴史的経緯から全く異なる文 法を持っており、個別に習得する際の障壁になる。また、1つのアプリケーション内 で、異なる種類の言語を混在させることができないため、複合的なアプリケーション の構築を難しくしている。この問題は、例えばデーターベースの研究者の間ではイン ピーダンスミスマッチという名で知られている。 言語が部品化されていれば、1つのプログラムの中で文法・制御構造・データ構造の 統一性を保ちつつ、異なった用途の言語を混在させることが可能になり、「プログラ ミング言語間の厚い壁」が取り払われることになる。 例えば、 Java のような汎用言語の内部に、 shell script のようなファイル操作を 得意とするスクリプト言語を埋め込むことが可能になる。ファイル名のパタンマッチ などはスクリプト言語による記述が簡潔であり、数値の四則演算や制御構造について は汎用言語による記述の方が簡潔で強力である。シームレスな言語統合の結果、それ ぞれの言語の得意な部分を1つのプログラム中で混在させて使い分けることが可能に なる。 従来研究 -------- 従来からも、一定の枠組の中で高い拡張性を持たせた言語処理系の研究がなされてい る。 ・「小さい核で拡張性の高い言語」 小さい言語仕様と高い拡張性を持たせることで成功した言語として、forth および lisp 系の言語が古くからある。最近でも、拡張性の高さから広く使われた例として Tcl という言語がある。しかし、これらの言語はいずれも極めて制限の強い文法・実 行モデルに基づいた言語であり、一般的なアプリケーションの開発には向かず、ソフ トウエア産業界での主流言語とはなっていない。 ・「リフレクション、メタオブジェクトプロトコル(MOP)」 プログラミング言語に非常に高い拡張性を持たせる手段としてリフレクション、MO Pがある。しかし、いずれの方法も、想定された範囲内での言語拡張は容易であるが、 想定を越えた範囲の拡張は不可能である。例えば、GCの機構を交換できるリフレク ション、MOPのシステムは存在しない。 ・「コンパイラ生成系」 宣言的記述による言語仕様を入力として受け取り、コンパイラを出力するコンパイラ 生成系の研究が古くから行なわれている。言語仕様記述を部品化できるEli などのシ ステムもあるが、生成できる言語のクラスに制限があるため、広く普及したシステム はない。 ・「conservative GC」 実行時系(runtime system)の部品化に関しては、既存のプログラムをほとんど手直し せずに自動記憶域管理機構を追加する Boehm らの conservative GC の研究が有名で ある。しかし、メソッドディスパッチ機構など他の実行時系を、簡単に交換可能な部 品として提供するための研究はない。 研究内容の概要:「部品化された言語処理系の存在証明」 --------------------------------------------------- 現在のところ、 C++ 言語や Java 言語などに匹敵する実用レベルの言語処理系を、 細かく部品化する試みは存在しない。言語処理系の部品化が難しい理由は、内部構造 が複雑に相互依存しているため分割しにくいという点と、実行時系に高い実行効率が 要求されるという点にある。そこで、以下のアプローチによって言語処理系部品化を 試みる。 ・複雑に相互依存するプログラムを、再利用性の高い部分に部品化するための言語機 構の設計・開発を行なう。 ・この部品化機構を用いて、言語処理系を構成する構文解析、意味解析、最適化、コー ド生成のそれぞれに対して、再利用性が最大になるように部品化を行なう。 ・実行時系生成システムを設計し、その内部を部品化する。実行時系生成システムは、 実行時系のプログラムを生成するプログラムである。実行時系そのものを部品化する のではないため、実行効率の損失をほとんど起こさない。 ・これら部品化機構および実行時系生成システムを用いて、広く普及している言語 (C または Java)と互換性のある言語処理系を実装する。 以上により、現在は一般に不可能と思われている、「プログラミング言語の部品化」 が可能であることを証明する。 研究内容の詳細 -------------- ・「オブジェクト指向を越えた、部品化支援言語の設計・実装」 まず、対象を言語処理系に特定せず、一般のアプリケーションに対して、プログラム を部品化するために必要な言語機構について研究する。 現在、ソフトウエアの部品化および再利用化の道具としてオブジェクト指向言語が普 及している。しかし従来のオブジェクト指向言語では、内部が複雑に相互依存するプ ログラムの部品化は難しい。また、組み合わせ自由度および安全性の高い部品化を支 援する機構も持たない。 そこでオブジェクト指向の機構を一歩進めたものとして、筆者は system mixin と呼 ぶ差分プログラミングをサポートする一種の継承機構を持った言語 Ld-2 を提案して いる。この機構を用いれば、クラス境界とは完全に独立にプログラムを部品化するこ とができる。この言語をさらに発展させ、部品のパラメタ化や結合時の機能衝突検出 などを行ない、再利用性、利便性を向上させる。また、従来のオブジェクト指向で不 可能だった部品化を可能にする考え方としてXerox PARC の Kiczales らが提唱する Aspect Oriented Programming などが存在するが、これらの考え方も取り入れる。 なお、現在主に行なわれている部品化の研究は、ソフトウエア生産性向上に主眼を置 いているものがほとんどである。しかし、本研究が目指す部品化は、個々の部品の記 述には多少手間がかかっても、部品の組み合わせ方の自由度を最大にすることを第一 目的とする。 部品の粒度が細かい場合、それを組み合わせる手間も増大するが、この問題に対処す るために、必要な部品をある程度自動的に選別する機能についても検討する。 ・「コンパイラの部品化」 上記の「部品化支援言語」を用いて、部品化されたコンパイラを記述する。 構文解析器については、現在 Java 言語のみを対象として、広範囲に文法拡張が可能 なシステム、「拡張可能 Java プリプロセッサ EPP 」を開発中である。このシステ ムが持つ構文解析器のアーキテクチャを Java 以外の言語の文法にも適用可能にする 方法を開発する。 コード生成については、 g++ 言語のソースコードを出力言語とする。g++ のコンパ イラは無償で提供され、広範囲のプロセッサ用に移植されている。g++ は、レジスタ 制御、アセンブラ命令埋め込み、関数を越えた goto などの機構を有するため、アセ ンブラ言語を出力言語として用いる場合と遜色ない自由度で言語処理系を構築できる。 最適化に関しては、抽象構文木の意味解析をした後、データフロー、依存関係などを 解析するためのライブラリおよびそれらを拡張するためのインターフェースを決定す る。 ・「実行時系の部品化」 実行時系に関しては、「実行時系ソースコードを生成するプログラム」を部品化する アプローチを取る。実行時系は、そのまま素直に部品化したのでは、部品間の通信の オーバーヘッドが大きくまともな実行効率は望めない。そこで、「実行時系生成シス テムの部品」を用意する。利用者はこの部品を組み合わせ、その結果できた実行時系 生成システムを起動して実行時系のプログラムを生成する、という手順になる。る。 筆者はすでに、GCがこの方法で部品化できることを確かめている。この考えを、メ ソッドディスパッチ、並列・分散機構など他の部分に対しても適用し、実装する。 ・「実用的言語処理系の構築」 以上のアプローチをもとに、オブジェクト指向、GC、スレッドなど実用的な機能を 一通り備えた言語処理系が構築できる部品を設計・実装する。具体的には、 C++ 言 語のサブセットまたは Java 言語とほぼ互換なものを実装する。 計画 ---- ・1年目 差分プログラミングによる部品化を支援するオブジェクト指向言語 Ld-2 を機能拡 張し、記述性・安全性・実行効率を高める。この記述言語を用いて、Java 言語を含 む一般の言語の構文解析部の部品化が可能かどうかを検証する。 ・2年目 コンパイラ、実行時系の部品のプロトタイプシステムを構築する。 ・3年目 実用的機能を一通り備えた言語処理系の部品を実装する。