Io (プログラミング言語)

提供: miniwiki
移動先:案内検索
Io
パラダイム オブジェクト指向プロトタイプベース
登場時期 2002年
設計者 Steve Dekorte
開発者 Steve Dekorte 他
最新リリース 2015.11.11/ 2015年11月11日(8年前) (2015-11-11
型付け 強い動的型付け
主な処理系 Io
影響を受けた言語 SmalltalkNewtonScriptSelfLuaLISP、Act1
テンプレートを表示

Io は純粋なオブジェクト指向プログラミング言語であり、SmalltalkSelfLuaLISP、Act1、NewtonScriptの影響を受けている。Self や NewtonScript のようなプロトタイプベースのオブジェクトモデルであり、オブジェクトクラスを区別しない。Smalltalk のようにあらゆるものをオブジェクトとして扱い、動的型付けを行う。LISPのように文の概念がなく、制御フローは関数を使って実現される。Io はアクターによる並行性を実現しており、最近のプログラミング言語には珍しい特徴となっている。

Io の特筆すべき特徴は、その効率のよさ、処理系の小ささ、外部リソースを自由に使えるオープン性である。Io は小型で移植性の高い仮想機械で実行される。

歴史

この言語は、2002年3月7日ごろ Steve Dekorte が友人の協力を得て作った。彼はプログラミング言語の仕組みをよく知らなかったため、勉強のために小型の言語を実際に作ってみることにした。そして完成したのが Io である。

方針

Io の目的は概念的なユニフィケーションと動的言語の研究にあるので、トレードオフとして性能向上よりも単純さと柔軟性を好む傾向がある。

機能/特徴

文法

最も単純な形式では、次のような1つの識別子でも Io のプログラムと言える。

 doStuff

この doStuff はメソッドであり、引数がないので後ろに括弧をつける必要がない。

doStuff に引数がある場合、次のように記される。

 doStuff(42)

Io はメッセージパッシング言語であり、Io ではコメント以外はメッセージの集積でプログラムが構成される。上掲の例でもそれが現れているがこれが全てではない。メッセージパッシング言語であることを明確に示すため、次の例を示す。

 System version

これは、 "version" というメッセージが "System" オブジェクトに送られていることを示している。

演算子は特別であり、これまでの例ほど単純ではない。Ioの構文解析器はインタプリタが定義する演算子をインターセプトし、それをメソッドコールに翻訳する。例えば、次のような記述があったとする。

 1 + 5 * 8 + 1

これは次のように翻訳される。

1 +(5 *(8)) +(1)

見ての通り、演算子の優先順位が一応存在しており、C言語での優先順位と同じである。

また、演算子がメソッドコールになっていることにも注意されたい。Io の演算子は全てメソッドである(ただし、例外として代入演算子 ":=" と "=" は構文解析器が全く異なるメッセージに翻訳する)。このため、演算順序を制御するための括弧が不要という特徴がある。

メソッドとブロック

Io には匿名の関数を作る2つの方法がある。メソッドとブロックである。この2つの違いはスコープである。ブロックは静的スコープであり、メソッドは動的スコープである。

メソッドもブロックも高階関数である。

Hello world は次のようになる。

 "Hello, world!" println

新たなオブジェクトはクローニングで生成される。Io では新たな空のオブジェクトが作られたとき、その親との違いだけが新しいオブジェクトに格納される。このような方式を差分継承と呼ぶ。以下に例を示す。

 A := Object clone         // 新しい空のオブジェクト "A" を作る

再帰を使わない階乗プログラムを以下に示す。

 factorial := method(n,
   if(n == 0, return 1)
   res := 1
   n to(1) foreach(i, res = res * i)
   res
 )

この例では range を使っているが、for ループの方が高速である。もう1つの例を以下に示す。

 //C++ 風のコメントが書ける
 #シェル風のコメントでもよい
 /* C言語風でもよい */
 
 for(i, 1, 10, i print) //1 から 10 までの数を表示
 
 x := Object clone //新たなスロットを作るときは ':=' を使う
 x = Map clone //上書きするときは '=' を使う
 x prettyprint := method( //引数のないメソッドを作る
     foreach(key, value, write(key, ": ", value, "\n")) //マップ上でループする
 )
 x atPut("hi", 1) //キーと値のペアをマップに置く
 x atPut("hello", 2)
 x prettyprint
 /* 出力は次のようになる:
      hi: 1
      hello: 2
 */

関連項目

  • jEdit Io のソースファイル向けの強調設定がある

外部リンク