Perlテックブログ

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

ネイティブのディレクトリ構成を変えてみる - SPVM開発日記

SPVM言語自体は、仕様が完成に近づいてきた。まだまだ、仕様に未定の部分があるのが、C言語につなげるナイティブな部分。

もう少しディレクトリ構成を簡単にできそう。

デフォルトのincludeとlibのディレクトリ構成についても、もう少し考えないといけなさそう。

C言語は安全性ではなく完全にパフォーマンスをとる - SPVM開発日記

C言語の設計は、安全なことではなくって、完全にパフォーマンス。

「もし、プログラマが、間違った引数を渡したら、セグフォールトしますよ。チェックなんてしません。パフォーマンスが落ちるので」

という感じ。

メモリセーフな言語は、セグフォールトを許さないので、間違った引数に対して、必ずチェックをいれないといけない。

この部分があるので、メモリセーフな言語は、C言語にパフォーマンスでは、同等になれない。

C言語におけるポインタの引数をどう表現するか

SPVMには、ポインタというものはない。

C言語のポインタ引数は、アドレスそのものなので、8bit整数でも、32bit整数でもよいし、配列の先頭を指しても、配列の中間を指してもよいし、なんでもできる。

いくつかのアプローチがあるけれど、記述性やパフォーマンスが、C言語よりも落ちてしまうのは仕方なさそうだ。

一つのアプローチは型ごとにサブルーチンを作るということ。

32bit整数の配列用、64bit整数の配列用、floatの配列用、doubleの配列用みたいな。

C言語では、メモリ破壊の危険性を受け入れることで、記述をシンプルにできるが、メモリセーフな言語の場合は、このアプローチはとりにくい。だから、めんどうだけど、ライブラリを作成する側が、めんどうなことを負担する。

もう一つは、配列の途中というのをどのように表現するかだ。

たとえば、C言語だと、配列の先頭から3つさきという表現を

int32_t* nums_ptr = nums + 3;

みたいにできる。これを、引数として渡せる。

でも、SPVMは、配列の中間を表現することはできないので、サブルーチンの引数として「(配列, オフセット, 長さ)」というようにする。長さが必要ない時は「(配列, オフセット)」とする。

この方法も、また面倒だけど、誰にでもわかるというメリットはある。

たとえば、sort関数は、汎用的に、次のように表現しないといけない。

# int型配列の並べ替え
sorti($nums, $offset, $length, $option);

だれでもわかり、汎用的だけれど、ちょっとめんどう。

インターフェース型は、サブルーチン型に名称変更したい

インターフェースという名前は、複数の意味がある。

一般的は、同じ関数名、引数、戻り値を持つものをインターフェースと呼ぶが、インターフェースという名前が、言語の機能そのものである場合もある。

現在策定中のSPVMでは、インターフェース型は、サブルーチンひとつだけを定義できる型となっているので、むしろサブルーチン型としたほうが良い気がしてきた。

package Foo : sub_t {
  sub bar : int($self : self, $object : object);
}

これは、ちょうどC言語の関数ポインタを実現する機能になる。