Skip to main content

「PHP」と「C/C++/C#」の違い

インタープリタ言語とコンパイル言語

コンパイル言語

C、C++、C#は「コンパイル言語」と呼ばれる。まずテキストファイル(.c/.cpp/.cs)を作る。そのファイルを、実行できるファイル(Windowsなら.exe)に変換する。

image.png

このテキストファイルを実行ファイルに変換する作業を「ビルド」または「コンパイル」と呼ぶ。この過程で、文字で書かれた命令が、コンピュータが理解できる2進数(バイナリ)のコードに変換される。さらに、もっと速く動くように、コードが「最適化」されることも多い。

例えば、とても短いforループでも、コードの中を何度も戻らないように、同じ命令を繰り返す形に「展開」されることがある(下の表を参照)。

オリジナル 展開
for (int i = 0; i < 4; i++)
{
    printf("Hello world!\n");
}
printf("Hello world!\n");
printf("Hello world!\n");
printf("Hello world!\n");
printf("Hello world!\n");

最適化されたコードでは、比較(i < 4)が要らなくなり、使われない変数iも消え、forループの終わりで前に戻る動作もなくなる。だからコードが速く動く。

このような理由で、コンパイル言語は次に紹介する言語と比べて動作が速い。

インタープリタ言語

インタープリタ言語には、Lua、Python、JavaScriptなどがある。これらの言語はバイナリにコンパイルされず、「インタープリタ」というものを使う。インタープリタとは、コードを1行ずつ、実行するその瞬間にバイナリへ変換する、特別なソフトのことである。

image.png

インタープリタ言語の大きな利点は、コンパイルが要らないことである。実行ファイルを作り直さなくても、コードを少し変えるだけで反映できる。ただし欠点もある。1行ずつしか実行しないので、最適化ができない(インタープリタは、この先にどんなコードが来るか分からないので、最適化のしようがない)。

インタープリタ言語のもう一つの利点は、その環境用のインタープリタさえあれば、Windowsでも、Linuxでも、MacOSでも、そのままほぼどこでも動くことである。

PHP

HPはインタープリタ言語である。つまり、コンパイルは不要である。PHPのインタープリタは、たいていWebサーバーのプラグインとして動く。今回の授業では、XAMPP に Apache(Webサーバー)とPHPが最初から入っているので、そのまま使うことができる。

拡張子が .php のページを開くと、Apache が PHP インタープリタを動かし、その結果をHTMLに変換して、普通のWebページとして表示してくれる。

image.png

image.png

PHPは1回だけ動く(状態は保存されない)

PHPは、動的なWebページを作るために生まれた言語である。動的なWebページとは、内容が変わっていくページのことである。例えば、X(旧Twitter)を更新するたびに、みんなが新しい投稿をするので、新しい投稿一覧が表示される。同じページを読み込んでいるのに、中身は動的に変わっているわけである。

PHPはそのような仕組みで作られているので、1ページにつき1回しか動かない。Web接続は「状態を持たない(ステートレス)」ことを思い出してほしい(接続する→内容を受け取る→切断する、という流れである)。だから、ページをユーザーに返した後もPHPのプログラムを動かし続ける意味がないのである。

これは、普通のプログラムとの大きな違いである。私たちは、プログラムが動いている間ずっと変数が生き続けるのに慣れている。しかしPHPは、ページを返した時点で終了してしまうので、ページを再読み込みするたびにデータは何も残らない。ページを読み込むたびに、まったく新しいプログラムが、新しい変数と内部状態を持って始まるのである。

image.png

呼び出しの間でデータを保持したい場合は、いくつかの仕組み(クッキーやセッションなど)を使うことができる。ただし、これらの仕組みは今回の授業の範囲外である。興味のある人は、教科書の113~119ページを見てください。

とはいえ、呼び出しの間で変数を渡す方法は必要になる。UnityとPHPを使ったゲームを作るときに、GETデータとPOSTデータを使って、PHPスクリプトの実行と実行の間でサーバーにデータを覚えさせる方法を学んでいく。