質問: よくスクリプト型pythonなどは一行一行翻訳しているといい、そしてコンパイル不要 コンパイラ型は事前にコンパイルされるといいます。 ここで質問です。 cpuは機械語じゃないと実行できないからソースコードをコンパイルします。 1スクリプト型はコンパイル不要といいます。 まずこれはcpuを使っていないということですか? しかしソースコードのままではどちらにしろむりだと思います。 2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません 一行一行コンパイルしていると思っていました。 おしえてください。
回答: > > 1スクリプト型はコンパイル不要といいます。 > > まずこれはcpuを使っていないということですか? > > しかしソースコードのままではどちらにしろむりだと思います。 > > > CPUは何をするにしても絶対に使います。 > > 2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません > > 一行一行コンパイルしていると思っていました。 > > > 一行一行というのは語弊があります。たとえば制御構文や関数定義など、ブロック構文が入ってくると抜けてから処理しないとどうにもならないでしょう。 一つの考え方は、コンパイラにコマンドライン引数でファイルを取ってコンパイルしてファイルに書き出さずにそのまま自動で実行するような機能をつければインタプリタだというもので、それはそれでありな発想かもしれません。 では、オレ言語の仕様を決めて、それで作ってみてください。......とやろうとすると、コンパイラを作るのがしんどい、という壁にぶち当たります。普通に考えればわかると思いますが、高級言語のコードを機械語まで変換するのはかなり難しい技術です。まあ、どのみち言語処理系を作るのなんて大変なのですが、コンパイラまで作ろうとすると確実にアセンブリ言語の(というか機械語の)知識が要ります。 しかもCPUの命令セットが違えば一から作り直しですし、CPUはたくさん種類があります。x64とARMくらい、という訳にはいきません。同じアーキテクチャでも石によって対応してる命令が違うとか。更に言うと、プログラミング言語の機能にはOSに依存する処理も多いので、OSごとに変えないといけない部分もあったりして...... これでは誰もプログラミング言語なんて作れないような気がしますが、コンパイラはともかくインタプリタならけっこう作る人はいます。 実際のところ、インタプリタを作る人は別にアセンブリ言語のこととか命令セットのことまで考える必要はありません(考えた方が結果的に良いものが作れる可能性はありますが)。幸運なことに、大抵の環境にはCコンパイラがあるのです(別にCでなくても適当に低レイヤが触れて適当に書きやすくて適当に移植性が高いネイティブコードを出力してくれるコンパイラ型言語ならなんでもいいのですが、あんまりないですね。今だとできればC++にしたいかなくらい)。 なので、文字列を読み込んでプログラミング言語として適切に処理するCのプログラムを書けば、それで解決です。作るのも簡単だし(コンパイラを書く手間に比べれば、ということであって実際は簡単ではない)、移植性とかもそんなに問題になりません(複数環境カバーするコンパイラを作る手間に比べれば、ということであって実際はプラットフォーム依存の部分はたくさんある)。 乱暴に言ってしまえば、これがインタプリタの基本的なコンセプトです。確かにCPUは最終的に機械語を実行するのですが、その機械語はオレ言語のインタプリタが吐き出している訳ではなく、オレ言語のインタプリタをコンパイルしてくれたC言語のコンパイラの吐き出した命令列です。