質問: プログラムのexe化 デフォルトのwin10でプログラム言語(主にインプリンタ言語phpやpythonなど)は、exe化してもファイルが壊れているという警告を受けました。 インプリンタ言語はインスト―ルしないと動かないのでしょうか? または、osがサポートしている言語以外はインストールが必要なのでしょうか?
回答: ☓ インプリンタ言語はインスト―ルしないと動かない ○ 要仮想マシンの言語はインストールしないと動かない ハッキリ言っておきますが、コンパイラ言語、インタプリタ言語、と言う区分けは間違いです。 間違い、って言うのが言い過ぎなら、少なくとも現状には合わない。 例えば、javaは一般にコンパイラ型言語だと思われていますが、かと言ってjava仮想マシン(jvm)が無いといくらexeファイルがあっても動かないのは良く知られたトコです。 pythonも場合によっては内部的にはファイルはコンパイルされます。ただし、本体、つまり、python仮想マシンがインストールされないと動かない、と言うのはjavaと同じです。 この様に、実は現状では「コンパイラ言語」「インタプリタ言語」と言う区分けは全くの無意味なのです。 好意的に解釈すれば 「仮想マシンの動作原理そのものがインタプリタである」 と言う言い方は出来ますが、それ以上の意味はないですね。 あるいは、 「コンパイルされたファイルがネイティブコードだ、と言う前提がないと動かない」 と言ってもいいでしょう(javaやpython等の仮想マシン向けのコンパイル済みファイルは通称「バイトコード」等と呼ばれたりします)。 > osがサポートしている言語以外はインストールが必要 osがサポートしている、のではなくって、コンパイラがネイティブコード(例えばpc向けだとintel cpu用のマシン語等)を吐かなければ、適する「仮想マシン」のインストールが必要だ、と言う事です。 ただ、僕も#1氏と同じく、phpはピュアなインタプリタだったと思います。だからexeファイル作る手段って無かったんじゃないかな・・・・・?分からんけど。 元々phpはホンマに特定の用途・・・つまり、webサイト絡みで使用されるのを前提としてるので、そもそも単独で実行されるのを念頭に置いて開発されてこなかった、ってのが一つの理由。だからwindowsでexeファイルに出来なくても用途的には誰も困らなかった、んですよね。 もう一つの理由は、そもそもサーバーサイドで走らせる目的の言語だった、って事ですよね。javascriptのようにクライアントサイドで走らせる、って前提で設計されていない。で、想定されてるサーバーが元々unix系だ、って事も前提で、やっぱりwindowsでexeファイルとして実行させる意図がそもそも無かった、って事ですよね。 (例えばwikipediaで使われてるmediawikiはphpで書かれてますが、wikipediaを見る/読む側のパソコンにphpがインストールされてないのに見たり読んだり書いたり出来るのは、phpはunixサーバー側で動いてる、からであって、そういうカンジでそもそも「クライアントpc側で動かすのを前提にしてない」のです。) ※: 処理系依存の話であるが、例えば一般にインタプリタだと思われてるansi common lisp等は処理系によってはソースコードをコンパイルして「単独実行可能」のコンパイル済みファイルを生成したりする。こういう単独実行可能のコンパイル済みファイルを「スタンドアローン」等と呼称したりする。 が、python等にこれを要求するのはかなり難しい。 特定のansi common lisp処理系の場合、プログラマが書いたソースコードをコンパイルする他、common lispインタプリタで「そのプログラムに必要だと思われるライブラリ」を別途コンパイルしてリンク、また、インタプリタの部分の「最小限の部分」、コア等と呼んだりするが、こいつも分離してコンパイルしてリンクする、と言うなかなかメンド臭い事をやったりしてる。 つまり、ユーザー側から見るとそのansi common lisp処理系をインストールしなくても、exeファイルをダブルクリックすればフツーのc++で書かれたプログラムみたいに起動するように見えるが、中身は小型インタプリタと特定の抜粋されたライブラリとの混合体だったりする。 このように、いわゆるインタプリタ型言語から「スタンドアロンの」ファイル実行形式を得るのは難しい。 ただし、いわゆるコンパイル型言語でも真の意味での「スタンドアロンの」実行ファイルを作るのも難しくなっている。たまに見かけるエラーメッセージ「dllがありません」と言うのは依存するライブラリがある、って事で、上記のansi common lispの例を考えるとその背後に隠された「メンド臭さ」は想像が付きやすいだろう。 また、windowsの場合、c#って言語が上記のjavaのようなモノで、「osがサポートしてる」と言うより「windowsでc#用の仮想マシンがデフォルトで提供されている」と言った方が良く、従ってユーザーはc#用の仮想マシンを別途インストールする必要はないが、結果、実はこれで作成されてるソフトウェアが真の意味で「スタンドアロン」なのか?と言うと大幅に違う。実はやってる事はansi common lispと同じで、結果c#用の仮想マシンから真の意味での「実行形式」が切り離せないのは技術的にはpython等と全く同じである。