ObectSquare

[技術情報]オブジェクト指向プログラミング環境『Uva』





オブジェクト指向プログラミング環境『Uva』

一オブジェクト指向愛好家 古川 文生

快適なオブジェクト指向プログラミングをするためには、手になじむプログラミング言語が必要です。作ったプログラムを気軽に実行し、手軽に配布できれば、ちょっとしたアイデアをすぐに実現できます。スクリプト言語のように扱いやすく、本格的なオブジェクト指向プログラミング言語に負けない表現力を持ち、かつスリムで高速である、そんな言語が欲しくてUvaを作り始めました。さらにUvaは、本当の意味での「オブジェクト指向らしさ」を実現しようとしています。オブジェクト指向で考えたことを、素直にそのまま表現できる快感を、是非味わってみてください。

オブジェクト指向プログラミングを楽しくする言語『Uva』

2001年2月、Uva(『ウバ』)はインターネット上で一般公開されました。
紅茶の好きな私は、Uvaを設計するにあたって最も参考にした言語であるJavaにちなみ、世界三大銘茶の一つである『ウバ』の名を取りました。ミルクティーの好きな私は『ウバ』を好んで飲みます。それはさておき・・・

サンのJavaが徐々に普及しはじめ、マイクロソフトのC#が発表される中、企業製のプログラミング言語は、高機能であることばかりに重点が置かれ、バージョンアップの度に肥大化の道を歩んでいます。膨れ上がった言語仕様やライブラリを持つ言語ばかりが目立つ今の世の中に、私は一抹の不安を感じていました。プログラミングがどんどん難しいものになり、「楽しさ」が失われるてしまうのではないかということに。

プログラミングの楽しさを、オブジェクト指向プログラミングの楽しさを知ってもらうためには、プログラミング言語にもっと「わかりやすさ」が必要です。そのために、オブジェクト指向の考え方や世界・構造をそのまま表現できるような構文を考えました。

一つは、全ての予約語を「名は体を表す」単語にすることです。クラスは「class」、メソッドは「method」のように、オブジェクト指向の用語をそのまま使えるようにしました。また、Uva言語の全ての構文は「ブロック形式」と「文形式」の2つの形式で構成されています。これらにより、ソースコード全体に統一感が生まれ、読みやすくてわかりやすいものになるのです。

Uvaの言語仕様は、オブジェクト指向の世界を素直に表現できるように考えられています。わかりやすいプログラムが書けるということは、プログラムの説明もしやすいということです。深刻な技術者不足の今、人材育成が重要な課題です。わかりやすい、即ち初心者に敷居の低いオブジェクト指向プログラミング言語が、その一つの解とはならないでしょうか。「クラスを使う」だけなら初心者でもそれなりにできますが、きちんとした方針の元に「クラスを作る」ことのできる人は、実はほとんどいません。

Uva言語は、これまでプログラミングを学ぼうとして挫折してしまったような人、これからオブジェクト指向プログラミングにチャレンジしてみようという人に、楽しく学んでいってもらえるものだと思います。

また、仕事としてオブジェクト指向プログラミングを何となくやっている方にも、プログラミングの楽しさを知ってもらえることを願っています。プログラミングを単なる仕事と思うより、楽しみながらこなす方が幸せなのですから。

Uvaの特徴

Uvaについて知ってもらったところで、主な特徴を紹介しましょう。

現在は32bitのWindowsプラットフォームをサポートしており、Windows用アプリケーションの作成が可能です。

単一の実行ファイルを生成できるため、配布が簡単です。Javaのように実行するマシン上に特別な実行環境が必要ありません。ちょっとしたお役立ちプログラムを作ったら気軽に仲間に使ってもらうことができます。この特徴は、趣味のプログラミングにピッタリですね。

またネイティブインターフェースをはじめ、本格的なプログラミング言語の要素をしっかり持っているので、プロフェッショナルなシステム開発にも耐えうる記述能力があると言えます。

Uvaプログラミングの実際

では、早速Uvaプログラミングを見てもらいましょう。
作成したものは、「Webページをダウンロードする」プログラムです。ウインドウベースのプログラムで、入力されたURLのWebページをローカルファイルに保存するというものです。

画面イメージ(PNG)

プログラムの完全なソースは、sample.uvaを開いて見てください(リンクを開くと別窓で表示します)。これからソースの中身を解説します。

applicationで始まる行は、アプリケーション宣言です。このユニットが「アプリケーション」であることを宣言し、アプリケーションの起動時に使われるクラスを`HtmlDownloader'と指定しています。そして、ずらっと並ぶimport行では、このアプリケーションで使用するユニットを取り込むように指示しています。

このアプリケーションは、3つのクラスから構成されています。

まず、URLクラスとURLParseFailure失敗を定義しています。URLクラスは、文字列表現のURLをホスト部とパス部に分解する機能を持っています。URLParseFailure失敗は、URL解析の失敗を表す例外シンボルです。Uvaの例外はクラスではなくただの識別子です。しかし、クラスと同様に継承という概念を持っています。
URLクラスには、非公開クラスの意味を持つ`private'が指定されています。非公開クラスは、外部のユニットからアクセスできません。partsメソッドに注目してください。ホストとパスを同時に返しています。

HttpGetterクラスは、HTTP(プロトコル)でWeb上のファイルをダウンロードする機能を持つクラスです。クラスフィーチャーのみで構成される、ルーチンクラスです。「フィーチャー」とは、メソッドとフィールドの総称です。

HttpGetterクラスのdownloadフィーチャーが、このアプリケーションのエンジン部です。NetworkSystemユニットのSocketクラスを用いて、ホストのHTTPポート(80)を叩いています。ソケットから行単位でデータを取得し、ヘッダをシステムディスプレイに、本体をダイアログで指定されたファイルに保存しています。

最後にHtmlDownloaderクラスを定義しています。これは、アプリケーション起動クラスなので、インスタンスメソッドmainを定義しています。C言語のvoid main(void)や、Javaのstatic void main(String[] args)と同等のものです。注意すべきは、Javaと違いクラスメソッドではなくインスタンスメソッドだということです。起動クラスのインスタンスは自動で生成されます。

アプリケーション起動後、make_formフィーチャーでフォームとウィジェットを作成しています。「ウィジェット」はボタンなどのGUI部品のことです。「フォーム」はウィジェットを載せることのできるウインドウです。重要な点は、フォームやウィジェットをnewするときに渡す`this'です。これは、何かイベントが発生した場合に、イベントを受け取る「リスナ」オブジェクトを指定します。イベントは、リスナオブジェクトに事前に定義されたメッセージを送ることで伝えられます。オブジェクトを渡しているのですから、リスナクラスを別途作り、そのインスタンスを渡すこともできます。今回は最も簡単なRADツール感覚のイベント処理方式にしてみました。

プッシュボタン(go_button)を押されたことを知るには、ボタンの「アクション」(Uvaにおけるイベントの一種)を受け取るのが簡単です。アクションとは、プログラム上で発生する何らかの動作を表すもので、リスナとなるオブジェクトへのメッセージ送信という形で伝えられます。ここで使われるメッセージに、任意の文字列を使えるというのがアクションという機能のミソです。アクションを表現する文字列は、Buttonクラスのset_actionフィーチャーで自由に設定できます。

ここでは、"download"を指定しているので、go_buttonが押されると、リスナオブジェクトに対してメッセージ download(source as Object) が送られます。downloadメソッドでは、ファイルダイアログを表示して保存するファイル名を選択させ、HttpGetter.downloadを呼び出してダウンロードしています。

HttpGetter.downloadの引数は3つのはずですが、ここでは2つの式しかありません。しかし、間違いではありません。一つ目の式url.partsは、2つのオブジェクトを返すフィーチャーでしたね。つまり、url.partsの2つの戻り値がここに展開されるため、計3つのオブジェクトがHttpGetter.downloadの引数となるわけです。

駆け足で説明してきましたが、プログラムは以上で終わりです。ウインドウとネットワークを用いたプログラムが、200行とちょっとで実現できてしまいました。それでは、実行させてみましょう。Uvaアプリケーションをソースから実行させるためには、お使いのWindowsマシンにUva環境のインストールが必要です。

$ uvac sample.uva
$ uvavm sample

最初の行でsample.uvaをコンパイルし、sample.teaを生成します。sample.teaはユニットファイルといい、sample.uvaで定義されたクラスと例外シンボルが収められています。次の行で、Uva仮想機械上でsample.teaを実行させます。

実際にやってもらうとわかりますが、コンパイルはほぼ一瞬で終わります。なので、コンパイルと実行を一括して行うコマンドを用意しています。

$ uva sample

uvaコマンドを使うと、ソースを直接実行しているような感覚がします。

実行ファイルの生成

アプリケーションが完成しました。自分が満足できるものができたならば、人に使ってもらいたくなるものです。でも、みんながUva環境をインストールしているとも限らないし・・・バージョンが違ってたら・・・などと心配する必要はありません。Uvaは、アプリケーションが依存しているユニットを全て取り込み、単一の実行ファイルを生成することができます。

$ uvac sample.uva
$ uval sample

最初の行でプログラムをコンパイルし、次の行でリンクしています。これだけで、sample.exeが生成されるのです。Uva環境の入っていないWindowsマシンでも、問題なく実行できるようになりました。

プログラムドキュメントの作成

Javaには、クラスのリファレンスを作成する`javadoc'というコマンドがあります。Javaソース中のコメントから説明文等を引っ張りだし、クラス単位でHTML形式のドキュメントを生成するというものです。Uvaにも同様のコマンド`uvadoc'があります。ユニット単位でHTML形式のドキュメントを生成するという点で似ていますが、こちらは説明文等を専用のファイルから読み出す形となります。各国の言語ごとに説明ファイルを用意すれば、ドキュメントの多言語化が簡単に行えるという仕組みです。

uvadocは1ユニットに1ファイルを生成します。
まずは、説明ファイルの雛型を生成させます。カレントディレクトリにsample.teaがなくてはなりません。

$ uvadoc -m sample

sample.dstが生成されるので、日本語で書き込みます。そして、テンプレートuvadoc.defを用意し、下記のようにコマンドを実行します。

$ uvadoc sample

すると、カレントディレクトリにsampleディレクトリが作成され、その中にHtmlDownloader.htmlHttpGetter.htmlが生成されます。非公開クラスであるURLは出力されません。

※uvadocは、標準ライブラリ用のドキュメントツールとして開発されました。現在のバージョンでは、各アプリケーション用のドキュメント生成ツールとしてはまだまだ機能不足です。

余談ですが、uvadoc自体もuvaで書かれています。

最後に

このプログラムは、仕様を決めてから30分程でダウンロード機能まで実装できました。見た目の調整、例外状況の対応、プログラムドキュメントを書くまでを含めても、2時間は掛かっていません。 趣味のプログラムを想定したサンプルということもあり、プログラムの改良(最近の言葉では『リファクタリング』)はここで止めました。プロキシ対応などさらに機能を追加するときに、HttpGetクラスの改良などを行っていけば良いと思います。

このサンプルプログラム一式は、Uva for Win32 β16でコンパイルできます。将来のバージョンで、言語仕様・ライブラリ仕様が変更になる可能性があり、そのままではコンパイルできなくなるかも知れないことに注意してください。

さあ、Uvaプログラミングはいかがでしたでしょうか?現在のUvaは、よりよい言語仕様・ライブラリを求めて開発中です。 バージョン1は年内にリリースする予定ですが、個人プロジェクトなのでどうなるかはわかりません。Uva自体も趣味のプログラムなのです。

この記事を読んでUvaに興味を持たれましたら、是非Uvaページまでおいでください。 Uva環境の最新版や、さらなる情報があります。メーリングリストも開催中ですので、お気軽に参加してください。

それでは、みなさまのプログラミングライフが楽しくなることを心より願っています。


© 2001 OGIS-RI Co., Ltd.
HOME HOME TOP オブジェクトの広場 TOP