Perlのサブルーチンの柔軟性をC言語と比較してみる
Perlのサブルーチンの特徴をまとめておきます。C言語と比較してみました。Perlの言語としての柔軟性が理解できると思います。※1
Perlのサブルーチンの特徴
Perl | C言語 | |
1 | サブルーチンの定義はどこで行っても良い | 一般的に、関数の前方宣言(プロトタイプ宣言)が必要 |
2 | 引数の型を宣言しておく必要がない | 引数の型を宣言しておく必要がある。 |
3 | 戻り値の型を宣言しておく必要がない | 戻り値の型を宣言しておく必要がある。 |
4 | デフォルトで可変個の引数を受け取る | 引数の個数を宣言時に決めておく必要がある |
5 | リストを戻り値として使用可能 | 配列を戻り値にすることはできない |
6 | レキシカル変数へのリファレンスを戻り値にできる | ローカル変数のアドレスを戻り値にできない |
7 | コンテキストという概念がある | コンテキストという概念はない |
8 | サブルーチンが属する名前空間がある | 関数が属する名前空間はない |
1. サブルーチンの定義はどこで行っても良い
# perl ( サブルーチンの定義はどこで行ってもよい ) func() # ここでも使えるし sub func { } func() # ここでも使える
/* C言語 ( 一般的には、前方宣言が必要 ) */ int func(int x); /* 関数プロトタイプ宣言 */ func(3) /* ここで、使うためには、前方宣言( プロトタイプ宣言 ) が必要 */ int func( int x ){ }
Perlでは、実行時にサブルーチンの名前をシンボルテーブルに探しにいきます。だから、どこにでも書くことができます。
C言語では、コンパイル時に、関数の名前が解決されます。関数を使う場所より後ろに関数定義があった場合は、使う場所より前で前方宣言( プロトタイプ宣言 ) がなされていなくてはなりません。
2. 3. 4. 引数の型、引数の個数、戻り値の型を、決めておく必要がない
# Perl (最初に決めておくことは、サブルーチンの名前だけ。) sub func { }
/* C言語 ( 引数の型、引数の個数、戻り値の型を決めておく必要がある。 ) */ int func(int x, int y) { }
Perlでは、引数の型、引数の個数、戻り値の型は、実行時に決定されます。C言語では、引数の型、引数の個数、戻り値の型は、コンパイル時に決定されます。
5. リストを戻り値として使用可能
# Perl (リストを戻り値として使用可能) sub func { return (1, 2, 3); }
/* C言語 ( 配列を返却するには,引数で受け取ったポインタを操作する必要がある ) */ int ary[100]; fucn(ary); /* ポインタを渡す */ void func(int *ary) { /* ここで、ポインタを通じて、 ary に値を代入する必要がある。 */ }
Perlでは、リストを戻り値に、することができます。C言語では、配列を戻り値として返却することができません。呼び出し元へ、配列を返却したい場合は、引数で、ポインタとして渡して、それを操作する必要があります。
6. レキシカル変数へのリファレンスを戻り値にできる
# Perl sub func { my $val = 1; return \$val; }
/* C言語 */ int func(){ int x; return &x; }
Perlでは、レキシカル変数は、どこかから参照されている限りは、メモリ上から破棄されません。C言語では、関数が終了してしまうと、ローカル変数は、破棄されてしまいます。
7. コンテキストという概念がある
Perlには、コンテキストに応じて、スカラーかリストを関数の戻り値として使用することができます。C言語には、このような概念はありません。
8. サブルーチンが属する名前空間がある
# Perl # 本当の名前は、main::func ( mainパッケージに属するfuncサブルーチン ) sub func { } package SomePackage; # 本当の名前は、SomePackage::func # ( SomePackageパッケージに属する funcサブルーチン ) # 上記のfuncとは、まったく別のもの sub func { }
/* C言語 */ /* func は func であり、プログラムのどこから見ても func です。*/ int func() { }
Perlでは、すべてのサブルーチンは、名前空間に属します。Perlでは、名前空間のことをパッケージと呼びます。C言語は、名前空間を持ちません。
注
※1 Cを批判しているわけではないのであしからず。Cは、「実行速度が速い」「ハードウェアよりのプログラミングが可能」「低レベルなデータ操作が得意」という特徴を持ちます。Perlはこれが苦手なのです。