Perlゼミ はてな出張所

Perlゼミのはてな出張所。Perlイベントなどの紹介

リファレンス渡しの実装 - SPVM開発日記

あとループ展開の部分を実装したら、終わりかなぁと考えていて、C言語バインディングの実際はどんな感じになるんだろうと思ってGSLの実装を見ていたら、意外と数値型のポインタ渡しがかなり多い。

// double型のポインタを受け取る
int gsl_poly_solve_quadratic (double a, double b, double c, double * x0, double * x1)

// gsl_complex型のポインタを受け取る
int gsl_poly_complex_solve_quadratic (double a, double b, double c, gsl_complex * z0, gsl_complex * z1)

これを自然にバインディングするには、どんな方法があるだろうか。

  1. オブジェクトを生成して渡す
  2. リファレンス型を実装する

オブジェクト生成は、ヒープにメモリ確保しないといけないので、パフォーマンスのコストがある。パフォーマンスにとって理想的なのは、リファレンス渡しだ。

Perlには幸いなことにリファレンスがある。 数値型のリファレンスがソースコード上で表現できる。

その記号を使って、次のようにリファレンス渡しをしようかなと今考えている。

my $num1 = 100;
my $num2 = 50;

foo(\$num1, \$num2);

機能的にはC++の参照と同じになると思われる。

プログラミング言語の中には、リファレンスというものを、プログラマーから完全に隠してしまう言語がある。意識せずに、常にリファレンスだけを使うように設計された言語だ。

一方、Perlは、リファレンスというものをプログラマーからは、隠さない言語だ。

外の世界は複雑だ。複雑なものを内包するには、ある程度の複雑さをPerlも備えていなければならない。それがPerlの哲学。

そういうわけで、余分に思えるリファレンスという表現は、C言語のポインタやC++の参照を表現するのに、利用することができる。