Io (プログラミング言語)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/06/27 14:35 UTC 版)
|   | 
       この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2019年9月)
       | 
| パラダイム | オブジェクト指向、プロトタイプベース | 
|---|---|
| 登場時期 | 2002年 | 
| 設計者 | Steve Dekorte | 
| 開発者 | Steve Dekorte 他 | 
| 最新リリース | 2017.09.06/ 2017年8月12日 | 
| 型付け | 強い動的型付け | 
| 主な処理系 | Io | 
| 影響を受けた言語 | Smalltalk、NewtonScript、Self、Lua、LISP、Act1 | 
| ウェブサイト | io language | 
Io(イオあるいはアイオー[1])は純粋なオブジェクト指向プログラミング言語であり、Smalltalk、Self、Lua、LISP、Act1、NewtonScriptの影響を受けている。Self や NewtonScript のようなプロトタイプベースのオブジェクトモデルであり、オブジェクトとクラスを区別しない。Smalltalk のようにあらゆるものをオブジェクトとして扱い、動的型付けを行う。LISPのように文の概念がなく、制御フローは関数を使って実現される。Io はアクターによる並行性を実現しており、最近[いつ?]のプログラミング言語には珍しい特徴となっている。
Io の特筆すべき特徴は、その効率のよさ、処理系の小ささ、外部リソースを自由に使えるオープン性である。Io は小型で移植性の高い仮想機械で実行される。
歴史
この言語は、2002年3月7日ごろ Steve Dekorte が友人の協力を得て作った。彼はプログラミング言語の仕組みをよく知らなかったため、勉強のために小型の言語を実際に作ってみることにした。そして完成したのが Io である。
方針
Io の目的は概念的な統一 (conceptual unification) と動的言語の研究にあるので、トレードオフとして性能向上よりも単純さと柔軟性を好む傾向がある。
機能/特徴
- プロトタイプベースの純粋なオブジェクト指向プログラミング
- 例外処理
- Perl風の正規表現
- 弱い参照をサポートするインクリメンタルガベージコレクション
- 高移植性
- DLL/共有ライブラリの動的ローディング
- イントロスペクション、リフレクション、メタプログラミング
- アクターモデルに基づく並行性
- コルーチン
- 小規模な仮想機械
- 高階関数
文法
最も単純な形式では、次のような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 のソースファイル向けの強調設定がある
外部リンク
- io language - Io 公式サイト
- IoLanguage/io: Io programming language. Inspired by Self, Smalltalk and LISP. - GitHubリポジトリ
- Io Notes[リンク切れ]
- Open Directory: Programming: Languages: Io[リンク切れ]
「Io (プログラミング言語)」の例文・使い方・用例・文例
- Io_(プログラミング言語)のページへのリンク

 
                             
                    



 
 





