IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Open source  >

Blue プログラミング言語

単純さ、そして最小限主義

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 初級

M. Tim Jones, Independent Author, Consultant

2009年 8月 11日

言語は、私達の要求をコンピューター・システムに対して伝えるための手段です。そして、少なくとも私にとっては、言語が多すぎて困るということはありません。そうした言語の 1 つとして、Blue というユニークなオープンソースの言語があります。Blue はオブジェクト指向の言語であり、さまざまな用途に使える上に、使い方は直感的です。Blue を使用する上でのヒントを提供するこの記事では、Blue の基礎を紹介し、簡単なネットワーキング・アプリケーションの作成方法を説明します。

私はソフトウェア・エンジニアとして、常にプログラミング言語に魅了されてきました。典型的な命令型言語 (C など) であれ、関数型言語 (Scheme など) であれ、あるいはオブジェクト指向言語 (Ruby など) であれ、言語の文法、設計、実装には、何かしら魅力的なものがあります。プログラミング言語は自然言語と同じように、私達の意図を明示してマシンとやり取りするための手段です。しかし 1 つとして同じ言語はなく、それぞれの言語は、他の言語とは異なる興味深い方法で問題を解決します。

その中でもユニークな方法で問題を解決する言語が Blue です。Blue は動的型付けのオブジェクト指向言語であり、マルチパラダイムでもあります。マルチパラダイムというのは、複数の言語スタイルのパラダイムをサポートするという意味です (例えばオブジェクト指向の側面と関数型言語の側面を混在させる、など)。問題を解決するという観点から見ると、これは便利です。スタイルを混在させ、最も効果的な方法で個々の問題を解決することができるからです。

マルチパラダイム言語

マルチパラダイム言語は必ずしも新しいものではありませんが、マルチパラダイム言語によって最近のプログラミング言語に表現力を追加できることは確かです。一般的なマルチパラダイム言語には、C++、Ruby、Ada、Python、Java プログラミング言語などがあり、他にもたくさんあります。2 つまたは 3 つのパラダイムのスタイルを使用するものもあれば、8 つものパラダイムのスタイルを使用するものもあります (Mozart プログラミング・システムの Oz 言語など)。

Blue の技術的な紹介に入る前に触れておきますが、Blue を使用する上でのヒントを提供するこの記事では Erik Lechak が開発した Blue プログラミング言語に焦点を絞り、Monash University で開発された Blue プログラミング言語は扱いません。

Blue の開発の動機

Blue はユニークな機能を持つ動的なプログラミング言語です。Blue はクロスプラットフォームのマルチパラダイム言語として設計されており、構文は単純で一貫性があります。Blue はインタープリター型ですが、バイトコードにコンパイルしてパフォーマンスを高めることができます。しかし Blue の最も驚くべき点は、最小限主義に徹していることです。Blue はリッチで表現力豊かな言語を最小限の機能で実現します。例えば、多くの言語では、いくつかの方法で繰り返しを実装することができます。しかし Blue には、再帰やマップ (関数型のイテレーター) はなく、ループ構造を実装する方法は 1 通りしかありません。




上に戻る


言語の機能

この記事で Blue を完全に紹介することはできませんが、注目に値する機能をいくつか見て行くことで、この言語を適確に理解することができます。このセクションでは、型、条件分岐、繰り返し、エラー・トラップ、クラスについて調べます。その後で、これらの要素を組み合わせて少し大きくした Blue アプリケーションを 2、3 取り上げます。

Blue には、数値型 (整数型と浮動小数点型があります)、ストリング型、配列型、関数型など、いくつもの型が用意されています。Blue が動的型付けの言語であることを思い出してください。つまり Blue では変数と値を簡単に関連付けることができます (変数を定義する必要がありません)。リスト 1 は、さまざまな型 (整数型、浮動小数点型、ストリング型、配列型、関数型) の変数を作成する例を示しています。


リスト 1. さまざまな型の変数を作成する
x = 9;
y = 3.14159;
s = "this is a string";
a = [1, 2, 3, 5, 8];
f = func{ arg name; sys.print( "Hello ", name, "\n" ); };

sys.print( f("Marc") );

sys.attribs( &s ).print();

最後の行によって、指定されたストリング型に対する属性が出力されます。これらの属性は、その型のネイティブ型の属性 (またはメンバー) です。attribs 関数が、(typeof 演算子 (&) を使って取得される) 変数の型に対して実行されると、結果は次のようになります。

[replace,repeat,num,ltrim,length,import,endsWith,compile,find,eval,load,print,
substr,rtrim,save,startsWith,split,trim]

これらのメソッドは典型的なストリング・オブジェクト・メソッドとして、おなじみのはずです。また attribs メソッドを、型に対して使うのではなく (属性を提供する) オブジェクト自体に対して使うこともできます。

条件分岐

Blue では、条件分岐には文ではなく式を使います。そのため、条件分岐を値の代わりに使うことができ、それによってコードが単純で簡潔なものになります。Blue における条件分岐は以下のような形式で記述します。

condition ? true-expression ;
condition ? true-expression : false-expression ;

つまり、最初に条件式を記述し、続けて (条件が真の場合や、偽の場合の) 実行内容を指定します。リスト 2 は 2 つの例を示しています。この 2 つの簡単な例では式が使われていますが、式の代わりに (中括弧を使った) コード・ブロックで記述してもよく、そのコード・ブロックには複数の文を含めることができます。


リスト 2. 条件分岐の例
foo = 2;

(foo == 2) ? sys.print("foo is 2\n");

(foo == 1) ? sys.print("foo is 1\n") : sys.print("foo is not 1\n");

繰り返し

Blue にはループ用のメカニズムが 1 つあり、このループ・メカニズムは「コード・ブロック」内に含まれます。コード・ブロックとは単に値を返すコードのブロックであり、返す値がない場合には NULL オブジェクトを返します。コード・ブロックは以下のように定義されます。


リスト 3. コード・ブロックの定義方法

z = {
  x = 1;
  y = x+3;
  return y;
};

sys.print( z );

このパターンから繰り返しを作成することができます。リスト 4 はその例であり、10 から 1 までの数値を累算します。


リスト 4. 繰り返しの例

sum = 0;
value = 10;

ret = loop {
  sum = sum + value;
  value = value - 1;
  (value == 0) ? return sum;
};

sys.print( ret );

この例では、条件分岐によってループから抜けるまでコード・ブロックが繰り返し実行されます。このようにループ構成体は単純ですが、このループ構成体を使って、どんなに複雑なループでも構成することができます。

エラー・トラップ

Blue に実装された例外システムは、Java プログラミング言語の例外システムと似ている面もありますが、少し単純化されています。Blue では、(Java の場合のように例外を「スロー」するのではなく) 例外を「発生」させます。また Blue では、エラー・トラップ演算子 (|) を使って例外を「キャッチ」してエラーを処理します。このセクションでは、いくつかの例を用いてエラー・トラップの動作を説明します。

例外処理の最も一般的な使い方は、関数を中断し、呼び出し元に対して例外を発生する使い方です (その対象となる呼び出し元は、その関数の呼び出し元そのものの場合もあれば、スタック上位にある呼び出し元の場合もあります)。リスト 5 はわざとらしい例ですが、渡された引数を検証し、その引数が無効な場合は例外を発生させています。Blue で 1 つ異なる点は、任意のオブジェクトを例外として発生することができる点です。呼び出し元では、エラー・トラップ演算子を使って例外をキャッチしています。ここではエラー・メッセージを出力し、戻り値を 0 で置き換えています (すべてのインライン・コード・ブロックがオブジェクトを返すことを思い出してください)。


リスト 5. 例外処理の例

z = func {
  arg my_arg;

  (my_arg == 0) ? raise -1;

  return 10 / my_arg;
};

x = z( 0 ) | { sys.print("error\n"); return 0; };

もう 1 つ、この方法の興味深い簡単な使い方として、引数のデフォルト値を提供する使い方があります。リスト 6 のコード行を使うと、引数が存在しない場合のデフォルト値を指定することができます。この場合には、ユーザーが引数を付けずに関数 z を呼び出すと、デフォルト値として 1 が使われます。


リスト 6. 引数が存在しない場合のデフォルト値を指定する

z = func {
  arg my_arg | 1;

  ...

};

最後に、コードのブロックに対して従来の使い方での例外処理を実装することができます (リスト 7)。これは例外処理のブロック全体をカバーする典型的な使い方です。


リスト 7. コードのブロックに対する例外処理

{
  first_func();
  second_func();
  ...
} | {

  # Manage errors for the block

}

クラス

Blue はオブジェクト指向プログラミング言語に対しても、明らかに最小限主義を採用しています。Blue では、新しいクラスを作成したり、クラスから継承したり、あるいはクラスを拡張したりすることができます。新しいクラスを作成するためには、sys.class() 関数から始めます。この関数によって新しい空のクラスが返され、そのクラスに属性を追加することができます。リスト 8 は、単純なロールプレイング・ゲームで使用するキャラクター (Character) クラスの作成方法を示しています。この新しい空のクラスに対して、(キャラクターの要素を表現する) ストリング型や数値型などの属性を追加することができ、またこのクラスに共通の関数も追加することができます。ここでは 3 つの関数を提供していることに注目してください。つまりコンストラクターとデストラクター、そしてオブジェクトのインスタンスで表現されるキャラクターについての情報を出力するステータス (status) 関数です。


リスト 8. Character クラス

#
# Character Class
#
Character = sys.class();

Character.name = "";
Character.weapon = "";
Character.hp = 0;

# Constructor
Character._ = func {
    arg name | { name = "anonymous"; };
    arg weapon | { weapon = "stick"; };
    arg hp | { hp = 10; };

    this.name = name;
    this.weapon = weapon;
    this.hp = hp;
};

# Destructor
Character.__ = func {
    sys.print( this.name, " is dead.\n" );
};

# Class method
Character.status = func {
    sys.print( this.name, " (HP ", this.hp, ") wields a ", this.weapon, ".\n" );
};

Character クラスが完成すると、Character オブジェクトを作成することができます (リスト 9)。最初のケースでは、char1 というオブジェクトを作成し、すべての引数を渡しています。2 番目のケースでは何も引数を渡していないため、デフォルト値が使われています。最後に、それぞれのオブジェクトに対して status 関数を呼び出しています。


リスト 9. Character オブジェクト

char1 = Character( "Ralph", "whip", 5 );
char2 = Character();

char1.status();
char2.status();

しかし Blue は極めて動的であるため、オブジェクトを作成した後でオブジェクトを修正することができます。リスト 10 の例では、char1 オブジェクトに greet 関数を追加しています。この関数は char1 専用であり、Character クラスの他のどのインスタンスにも現れません。


リスト 10. char1 オブジェクトに greet 関数を追加する

char1.greet = func { 
    sys.print( this.name, " says hi.\n" ); 
};

char1.greet();

del char1.greet();

これまでの 3 つのリスト (リスト 8 から 10) を含めた、このアプリケーションの出力を以下に示します。


リスト 11. リスト 8 から 10 を含むアプリケーションの出力

$ blue char.bl
Ralph (HP 5) wields a whip.
anonymous (HP 10) wields a stick.
Ralph says hi.

これらの例の中にはありませんが、Blue では継承することが可能です。さらに Blue では、クラスを動的に拡張することも縮小する (つまり、拡張されたクラスからクラス属性を削除する) こともできます。




上に戻る


ネットワーキングの例

このセクションでは、ネットワーキング・アプリケーションを Blue で作成した例を説明します。大部分のオブジェクト指向スクリプト言語の興味深い側面の 1 つとして、オブジェクト指向スクリプト言語を使うことでネットワーキング・アプリケーションのプロトタイプを素早く容易に作成できることです。Blue も例外ではありません。Blue は、ソケット、スレッド、(さまざまな種類の) ストリーム、さらには簡単な XML パーサーに至るまでの、有用な動作をするためのモジュールを実装しています。

この最後の例では、シンプルな動的 Web サーバーの例を説明します。動的という意味は、ファイルシステムから内容を読み取ってページが作成されるのではなく、実行時にページが作成されるという意味です。このシンプルな Blue Web サーバーを以下に示します。


リスト 12. シンプルな動的 Web サーバー

#
# Dynamic Web Server Class
#
WebServerClass = sys.class();

WebServerClass.name = "";
WebServerClass.port = 0;

# Constructor
WebServerClass._ = func {

  arg name | { name = "SimpleWebServer"; };
  arg port | { port = 80; };

  this.name = name;
  this.port = port;

  global Stream = sys.library("streams.dll");

};


# Server
WebServerClass.server = func {

  server = Stream.listen(this.port);

  loop {

    client = server.accept();

    request = client.read().substr("/", " ");

    sys.print("Request: ", request, "\n");

    {

      client.write("<html><head><title>");
      client.write( this.name );
      client.write( "</title></head><body>" );

      ( request.find("status") != 0 ) ? {

          client.write("<h1>Server is up.</h1>" );

      };

    } | {

      # Exception Handler

      client.write("<h1>Page not found.</h1>" );

    };

    client.write("</body></html>");

    client = ();

  };

};


myWebServer = WebServerClass( "MyWebServer", 80 );
myWebServer.server();

この例ではまず、WebServerClass という新しいクラスを作成しています。このクラスには、クラス変数として、名前を表すストリングとポート番号を追加し、さらに 2 つの関数 (コンストラクター関数とサーバー関数) を追加しています。コンストラクター関数では、引数の初期化や、必要なすべてのセットアップを行っています (ストリーム・ライブラリーのロードなど)。そしてサーバー関数によって、Web サーバーのループが実装されます。サーバー関数では、指定されたポートにリッスン用のソケットを作成し、受付 (accept) 関数を通じてクライアントがサーバーに接続されるのを待ちます。

クライアントが接続されると、HTTP サーバーは HTTP リクエストを読み取り、クライアント・ソケットを通じてレスポンスを返します、このリクエストは要求されたファイルを示しており、このファイルは find 関数を使ってテストされます。status ファイルが要求されている場合には、簡単なメッセージが出力されます。それ以外の場合には、find に対してエラー・トラップが発生し、例外ハンドラーが標準的な file not found エラーを出力します。出力が完了すると、クライアント・ストリームに NULL オブジェクトを書き込んでストリームをフラッシュし、ループは次のクライアントからの接続を待ちます。このリスト 12 の最後には WebServerClass オブジェクトを作成して開始する方法を示しています。




上に戻る


言語の現状

Blue の開発はアクティブに行われており、最新リリース (V1.75) が 2009年4月に登場しました。Blue は Linux® と Microsoft® Windows® で使用することができ、OS X もまもなくサポートされる予定です。Blue の Web サイトには、言語に関する議論のためのフォーラム、インストール用の最新の tarball と過去の tarball、そして言語の機能に関するチュートリアルがあります (「参考文献」を参照)。

今後の方向

Blue は魅力的な概念をいくつも備えた興味深い言語です。多くのオブジェクト指向スクリプト言語(Ruby や Python など) と同様、Blue は容易に学ぶことができ、また楽しく使うことができます。こうした種類の言語は、新しいアイデアのプロトタイピングやテストを素早く行うには最適です。Blue はまだ開発が進められており、変更される可能性がありますが、時間をかけて検討してみる価値は十分にあります。



参考文献

学ぶために
  • Blue の Web サイトを訪れ、Blue について学び、またソース・コードをダウンロードしてください。このサイトには、Blue 言語に関するいくつかの優れたチュートリアル、この言語の最新バージョンと過去のバージョン、そして質問や機能要求のためのフォーラムがあります。また Blue の背後で働くチームや、Blue に貢献する方法なども知ることができます。

  • ウィキペディアで、マルチパラダイム・プログラミング言語オブジェクト指向プログラミング動的プログラミング言語の項目を調べてください。

  • Blue は関数型言語の側面もいくつか採り入れています。最も重要な関数型言語の 1 つである Scheme について学ぶために、「Guile によるスクリプティング」を読んでください。

  • Blue は興味深い言語ですが、プログラミング言語としては相変わらず初期段階にあります。他の有用なオブジェクト指向スクリプト言語として、RubyPythonLua を調べてみてください。

  • developerWorks podcasts ではソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。

  • developerWorks の Technical events and webcasts で最新情報を入手してください。

  • developerWorks を Twitter でフォローしてください。

  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。

  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。

  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。


製品や技術を入手するために
  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。

  • IBM 製品の試用版をダウンロードするか、あるいはオンラインで IBM SOA Sandbox を試し、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。


議論するために


著者について

M. TIm Jones

M. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。また、コロラド州ロングモン所在のEmulex Corp. のシニア・アーキテクトでもあります。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ