質問: 自分は初級プログラマなのですが、最近コンパイラの勉強(オートマトンや形式言語なども)を始めました。そこで思ったのですが、ビルトイン関数というのは結局のところコンパイラの中で実装されている、という認識でよいのでしょうか? 例えばPHPのsession_start()など、セッションに関する関数は、 で書かれているとおり、C言語で書かれているようです。 なので、 1)PHPでsession_start()などの関数を呼び出したとき、内部で何が行われているかについてはこのURLのソースコードを読めば理解できるようになるのですか? 2)C言語は高速な言語だからCで実装するのですか?PHPでビルトイン関数を書くということは普通しないのですか? 3)よく教科書なんかには、アセンブラを作るために機械語を使い、C言語を作るためにアセンブリを使うと書かれていますが、PHPの場合は構文とビルトイン関数をCで作る、ということなのですか? かなり初歩的で奇妙な質問に思えるかもしれません。ですが自分の中で実際のところ何がどう結びついているのか、かなりモヤモヤした状態でいるので質問した次第です。よろしくお願いします。
回答: 実際のところどこまでが「ビルトイン関数」で、どこからがそれ以外になるのか、と言った明確な定義はありませんし、PHPのようなインタープリタ言語とCのようなコンパイラ言語とでは若干考え方を変えた方がいいと思いますが、概ね「ビルトイン関数というのは結局のところコンパイラ(インタープリタを含む広義の)の中で実装されている」と言った考えで良いだろうと思います。 ***1)PHPでsession_start()などの関数を呼び出したとき、内部で何が行われているかについてはこのURLのソースコードを読めば理解できるようになるのですか?*** 「理解できる」かどうかは個人の問題なのでなんとも言えませんが、リンク先のソースコードには関数内部で行われている処理が全て書いてあります。ただし、「理解できる」ようになるためには、その中で使われているマクロや関数についても全部理解しておく必要があります。 ***2)C言語は高速な言語だからCで実装するのですか?PHPでビルトイン関数を書くということは普通しないのですか?*** 「高速」と言うのは特定の機能をビルトイン関数にしたりPHP機能拡張(これも大抵C言語で書かれている)にしたりする動機ではあるでしょうが、**だから**C言語で実装すると言うのは間違いです。PHPのインタープリタ自体はC言語で書かれています。したがって、PHPのビルトイン関数とするためには、C言語で書かれたPHPのインタープリタ本体に組み込めるものでないといけません。 今のところPHPで書かれた関数をC言語で書かれたプログラムに「組み込む」ことは出来ません。したがって、「PHPでビルトイン関数を書く」ことは出来ません。将来PHPのコンパイラができて、PHPで書かれた関数をC言語で書かれたプログラムに組み込むことができるようになれば、「PHPでビルトイン関数を書く」ことも出てくるかもしれません。 ***3)よく教科書なんかには、アセンブラを作るために機械語を使い、C言語を作るためにアセンブリを使うと書かれていますが、PHPの場合は構文とビルトイン関数をCで作る、ということなのですか?*** C言語はかなり初期のものからC言語で書かれていましたのでその「教科書なんか」はかなり単純化した記述になっているようです。また「構文をCで作る」と言う言い方は、あまり聞きません。 ただ、(今のところ)PHPのインタープリタ本体とビルトイン関数はC言語で書かれています。「構文」と言う意味では、Lexやyaccなんかも使われているので「Cで」とだけ言うと微妙に違う気もしますが、その辺りのことを置いて大雑把に理解するなら、「PHPの場合は構文(インタープリタ本体、の意味で)とビルトイン関数をCで作る」と言う理解で、問題は無いだろうと思います。 C言語の知識があって、形式言語理論を含むコンパイラについても勉強されておられるなら、いきなりPHPのような大規模な言語のソースを覗くのではなく、「自分専用のミニ言語を作る」と言った趣旨の書籍を探し出して、小規模な独自言語のインタープリタ(コンパイラでも良いですが、インタープリタよりちょっとレベルが上がります)を自作して見られてはいかがでしょうか。