Perlの哲学 - Perlに対する誤解を解く

C言語/C++とPerlの関係性について語る

C言語/C++とPerlの関係性について語ります。

PerlはC言語で書かれている

PerlはC言語で書かれています。Perlプログラミング言語は、C言語で書かれ、gccなどのCコンパイラでコンパイルされることが想定されています。

この点で、PerlはC言語に依存しているといえます。

また、Perl以後に作成された、Python、PHP、Rubyも、同じくC言語で書かれています。動的プログラミング言語をC言語で書くということは、広く行われていますが、Perlの例が早い時期にありました。

C言語とプログラミング言語

C言語は、実用的なプログミング言語を作成することに、向いているプログラミング言語です。C言語は、多くのOS環境でコンパイルでき、コンパイル後は機械語になり、メモリの確保やメモリのアドレス位置によるアクセスなど、メモリ操作を自由にできます。

Perlはメモリ安全なプログラミング言語ですが、メモリ安全なプログラミング言語を書く場合には、メモリ安全ではないC言語で、メモリ安全になるプログラミングロジックを書きます。

C言語は、例外的な場合を除いて、原則としてライブラリの中で、メモリを確保しないという方針があるように見えます。文字列置換、動的配列、連想配列など、メモリ確保のロジックが必要な関数がありません。

これは、C言語の劣っている点ではなく、メモリ確保は、原則ユーザーの責任において行うというC言語の哲学のように見えます。

文字列置換、動的配列、連想配列などが必要な場合は、プログラミング言語作者が自前で実装する必要があります。

PerlからC言語を呼び出す

Perlには、C言語の関数を呼び出すためのXSという仕組みがあります。XSはC言語で書かれ、共有ライブラリ(.so、.dll)にコンパイルされ、Perlから呼び出すことができます。

つまり、C言語で書かれたライブラリは、ヘッダとソースファイルがあれば、XSからそれを呼び出すことによってバインディングできるということです。

また共有ライブラリになっていれば、それを呼び出すことができます。

Perlから、C言語を呼び出す仕組みには、XS、FFI、Inline::C、SPVMなどがありますが、XSはその一つです。

PerlからC++を呼び出す

Perlには、C言語の関数を呼び出すためのXSという仕組みがありますが、C++の機械語は実質的にはC言語から生成された機械語と同じです。C++とC言語の違いは、関数の呼び出し名だけです。そのため、C++の関数の呼び出し名を、C言語の呼び出し名に変更することで、C++の関数を呼び出すことができます。

これは「extern "C"」構文を使って行うことができます。

extern "C" {
  // C++の関数
}

C++で書かれたライブラリは、ヘッダとソースファイルがあれば、XSからそれを呼び出すことによってバインディングできます。

また共有ライブラリになっていれば、それを呼び出すことができます。共有ライブラリになっているということは、C言語関数呼び出し形式にすでになっているということです。

Perlから、C++を呼び出す仕組みには、C言語と同じように、XS、FFI、Inline::C、SPVMなどがあります。