Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

SPVMでインターフェースの実装が完了し、クロージャーの実装へ移る

SPVM -cpanでインターフェースの実装が完了して、次はクロージャーの実装に移ろうとしているところです。ドキュメントにはまだない。(そして、すべてのサンプルは、ドキュメントが間違っているので、動かないことを今発見。)

SPVMのインターフェースとは

SPVMのインターフェースはフィールドやサブルーチンの実装を持つことができません。インターフェースでは、サブルーチンの戻り値と引数の型を指定できます。

package Stringify : interface {
  sub to_string : String ($self : self);
}

コロンの後ろにあるのが型名です。SPVMでは、コロンの後ろに型を指定できます。

インターフェースで定義されるサブルーチンは、必ずインスタンスメソッドである必要があります。

インターフェースを使うと、オブジェクトが実際にどのクラスに応じているかによって、呼び出すメソッドを変えることができます。

SPVMには継承というものはなく、動的なメソッド呼び出しは、インターフェースを通じて行います。

たとえば、Pointクラスがto_stringを持つとすると

package Point {
  has x : int;
  has y : int;
  sub to_string : String ($self : self) {
    return "Point";
  }
}

これをStringifyインターフェースに代入して、呼び出すことができます。

use Point;
use Stringify;

my $point = new Point;

my $stringify = (Stringify)$point;

my $string = $stringify->to_string;

継承関係を定義する必要はなく、インターフェースで定義されたメソッド定義と同じ定義をクラスが持てば、代入を行うことができます。

SPVMの今後の展望

無名クラスと無名サブルーチン、クロージャーの実装

SPVMの直近の目標は、Perl数値計算を速くすることですが、実装をしているうちに、バイナリを出力できるということがわかってきました。

バイナリを出力できるようになると、Perlインタプリタなしで、WindowsandroidiphoneでSPVMが動くようになるはず。

SPVMは、Perlと同じく、スループットよりも、レイテンシを小さくすることを心がけているので、リアルタイムシステムと相性がよいように思います。

Linux上にのっけて、リアルタイムOSで十分な要件を満たせるプログラミング言語としての可能性も見えてきました。

そうなってくると、HTTPクライアントとして、うまく動いてくれるとIoTの分野でも、活躍できる余地があります。

SPVMはシングルスレッドです。シングルスレッドで、多重化するためには、非同期I/Oしか手法がありません。

非同期I/Oを手間なく書くためには、クロージャーが不可欠です。

クロージャーは、内部的には、無名クラスを使って作成されます。

そのために、最初に無名クラスの作成、無名サブルーチンの作成、クロージャーの作成と進んでいきます。