[ English | Japanese | Project page on SF.JP ]

Typing Ruby - Ruby言語型検査プログラム


Typing Rubyとは?

Typing Rubyは,オブジェクト指向スクリプト言語Rubyで記述されたプログラムの型検査を行うためのプログラムです.Rubyプログラムのソースコードを静的に解析し,型エラーが存在しないか検査します.完全な型検査は行えませんが,ある程度でもできればデバッグ・テストの省力化に貢献できるはずです.

Typing Rubyで採用している検証アルゴリズムは,Duck Typingに基づく,Rubyの型システムと互換性が高いものです.また,純粋な(変な拡張のない)Rubyを対象としており,既存のRubyプログラムをそのまま解析できます.

現在のところ,Typing Rubyはアルファ版段階以前です. 非常に自明なプログラムしか検査できないため,実用はできません.

プログラム検証の例

#プログラムtrubyの出力実行結果説明
01
123.hoge()
ERROR NO_METHOD_ERROR Fixnum#hogeというメソッドは定義されていません.
02
x = 123
x.foo()
ERROR NO_METHOD_ERROR 変数への代入がサポートされています.
03
def foo(x)
  x.hoge()
end

foo(123)
ERROR NO_METHOD_ERROR ユーザー定義メソッドも処理できます.
04
def foo(x)
  x.to_s()
end

foo(123).bar()
ERROR NO_METHOD_ERROR fooはStringのオブジェクトを返します.String#barは定義されていないため,エラーになります.

現段階では,IfやWhileなどのRubyの構文はサポートされていません.また,インスタンス変数やグローバル変数などもサポートされていません.他のクラスを継承するクラス定義が含まれたプログラムも検証できません.

メソッド定義,クラス定義,メソッド呼び出しなどのみが,サポートされています.

ダウンロード

Typing Rubyは無保証のフリーソフトウェアであり,GNU GPL2でライセンスされます.

2005年1月7日現在,まだダウンロードできるファイルはありません. 近いうちにリリースしますので,しばらくおまちください.

Subversionリポジトリ

開発に利用しているSubversionリポジトリを公開しています. 匿名で最新版のソースコードをチェックアウトすることができます. 開発途中のソースコードですので,コンパイルすらできないことがあると思いますが,ご了承ください.

インストール

必要なソフトウェア

上記したソフトウェアは,開発環境で用いているものであり,他のバージョンでも正常に動作する可能性があります.

truby版NodeDumpのインストール

NodeDumpは,Rubyの構文木を出力する,拡張ライブラリです. Typing Rubyでは,Rubyのソースコードを直接解析するパーサを開発することは諦め,NodeDumpの出力をパースしています. NodeDumpの出力は,そのままではocamlyaccでパースしにくいため,松本のハックが加わっています.

以下のコマンドを実行してください.

$ tar xfz nodedump-truby-xyz.tgz
$ cd nodedump-truby-xyz
$ ruby ./extconf.rb
$ make
$ su
# make install

Typing Rubyのコンパイル

以下のコマンドを実行して,Typing Rubyをコンパイルしてください.

$ tar xfz truby-xyz.tgz
$ cd truby-xyz
$ make release

システムにインストールすることはできません.コンパイルしたディレクトリで実行してください.

利用方法

trubyコマンドを利用して,実行します.ファイル名を指定しない場合は,標準入力からrubyプログラムを読み込みます.

$ ./truby foo.rb
$ ./truby

trubyのプロセスは,内部でrubyを「-r NodeDumpT」オプションとともに起動し,構文解析を行います.もし,内部で起動されるrubyに追加でオプションを指定したい場合は,-rオプションか--ruby-optionオプションを利用してください.

$ ./truby -r"追加のオプション" bar.rb
$ ./truby --ruby-option="追加のオプション" baz.rb

Rubyのオプションを-rオプションを利用して指定する際には,オプションの先頭にホワイトスペースを追加するようにしてください.たとえば$ ./truby -r -a foo.rbというコマンドラインを指定した場合は,Getoptコマンドラインオプションパーサがrubyのオプションを識別できずにエラーが発生します.このような場合には,$ ./truby -r " -a" foo.rbとするか,$ ./truby -r"-a" foo.rbとするか,-rオプションの代わりに--ruby-nameオプションを利用してください.

TODO

  1. 標準ライブラリのより充実したサポート
  2. ifやwhileなどのRubyの構文のサポート
  3. クラス継承やモジュールMixinのサポート
  4. グローバル変数やインスタンス変数のサポート
  5. 配列やイテレータブロックのサポート
  6. 例外の処理

松本宗太郎 < soutaro@score.cs.tsukuba.ac.jp >
$Date: 2005-02-22 03:52:41 +0900 (Tue, 22 Feb 2005) $

SourceForge.jp