リファレンス渡しの実装 - 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)
これを自然にバインディングするには、どんな方法があるだろうか。
- オブジェクトを生成して渡す
- リファレンス型を実装する
オブジェクト生成は、ヒープにメモリ確保しないといけないので、パフォーマンスのコストがある。パフォーマンスにとって理想的なのは、リファレンス渡しだ。
Perlには幸いなことにリファレンスがある。 数値型のリファレンスがソースコード上で表現できる。
その記号を使って、次のようにリファレンス渡しをしようかなと今考えている。
my $num1 = 100; my $num2 = 50; foo(\$num1, \$num2);
機能的にはC++の参照と同じになると思われる。
プログラミング言語の中には、リファレンスというものを、プログラマーから完全に隠してしまう言語がある。意識せずに、常にリファレンスだけを使うように設計された言語だ。
一方、Perlは、リファレンスというものをプログラマーからは、隠さない言語だ。
外の世界は複雑だ。複雑なものを内包するには、ある程度の複雑さをPerlも備えていなければならない。それがPerlの哲学。
そういうわけで、余分に思えるリファレンスという表現は、C言語のポインタやC++の参照を表現するのに、利用することができる。