よくスクリプト型pythonなどは一行一行翻訳しているといい、そしてコンパイル不要
コンパイラ型は事前にコンパイルされるといいます。
ここで質問です。
cpuは機械語じゃないと実行できないからソースコードをコンパイルします。
1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?
しかしソースコードのままではどちらにしろむりだと思います。
2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません
一行一行コンパイルしていると思っていました。
おしえてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
全部違います。
このあたりは、「大体こうだけど、例外も結構ある」というケースばかりで、例外まで説明していると意味不明になるので、少数派を切り捨てて説明します。
よくスクリプト型pythonなどは一行一行翻訳しているといい、
違います。実行の最初にプログラム全体をコンパイルして、その結果を実行します。
コンパイル結果は多くの場合は機械語ではなく、仮想マシン言語、中間言語、などというものにコンパイルします。
仮想マシン言語、中間言語などは、機械語じゃ無いので、それらを実行するプログラム(インタプリター)が必要で、そのインタプリタは普通は機械語になっています。
コンパイラ型は事前にコンパイルされるといいます。
スクリプト言語とコンパイル言語の違いは、現在では、コンパイルをあらかじめしてコンパイル結果のファイルを作りそれを実行するか、実行の度にコンパイルしてすぐ実行するのでコンパイル結果はメモリ上にしか無いかだけの違いです。
cpuは機械語じゃないと実行できないからソースコードをコンパイルします。
1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?
上述のように、コンパイル結果を実行するインタプリターが機械語です。
コンパイル言語が作るコンパイル結果も、機械語のこともあるし(ほとんどのC)、仮想マシン言語のこともあります(Java)。
Javaのコンパイル結果は機械語じゃないので、仮想マシン言語を実行するJavaVMが必要です。JavaVMは機械語です(多分)。
投稿2020/04/25 10:12
総合スコア85949
0
1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?
しかしソースコードのままではどちらにしろむりだと思います。
CPUは何をするにしても絶対に使います。
2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません
一行一行コンパイルしていると思っていました。
一行一行というのは語弊があります。たとえば制御構文や関数定義など、ブロック構文が入ってくると抜けてから処理しないとどうにもならないでしょう。
一つの考え方は、コンパイラにコマンドライン引数でファイルを取ってコンパイルしてファイルに書き出さずにそのまま自動で実行するような機能をつければインタプリタだというもので、それはそれでありな発想かもしれません。
では、オレ言語の仕様を決めて、それで作ってみてください。……とやろうとすると、コンパイラを作るのがしんどい、という壁にぶち当たります。普通に考えればわかると思いますが、高級言語のコードを機械語まで変換するのはかなり難しい技術です。まあ、どのみち言語処理系を作るのなんて大変なのですが、コンパイラまで作ろうとすると確実にアセンブリ言語の(というか機械語の)知識が要ります。
しかもCPUの命令セットが違えば一から作り直しですし、CPUはたくさん種類があります。x64とARMくらい、という訳にはいきません。同じアーキテクチャでも石によって対応してる命令が違うとか。更に言うと、プログラミング言語の機能にはOSに依存する処理も多いので、OSごとに変えないといけない部分もあったりして……
これでは誰もプログラミング言語なんて作れないような気がしますが、コンパイラはともかくインタプリタならけっこう作る人はいます。
実際のところ、インタプリタを作る人は別にアセンブリ言語のこととか命令セットのことまで考える必要はありません(考えた方が結果的に良いものが作れる可能性はありますが)。幸運なことに、大抵の環境にはCコンパイラがあるのです(別にCでなくても適当に低レイヤが触れて適当に書きやすくて適当に移植性が高いネイティブコードを出力してくれるコンパイラ型言語ならなんでもいいのですが、あんまりないですね。今だとできればC++にしたいかなくらい)。
なので、文字列を読み込んでプログラミング言語として適切に処理するCのプログラムを書けば、それで解決です。作るのも簡単だし(コンパイラを書く手間に比べれば、ということであって実際は簡単ではない)、移植性とかもそんなに問題になりません(複数環境カバーするコンパイラを作る手間に比べれば、ということであって実際はプラットフォーム依存の部分はたくさんある)。
乱暴に言ってしまえば、これがインタプリタの基本的なコンセプトです。確かにCPUは最終的に機械語を実行するのですが、その機械語はオレ言語のインタプリタが吐き出している訳ではなく、オレ言語のインタプリタをコンパイルしてくれたC言語のコンパイラの吐き出した命令列です。
投稿2020/04/25 11:25
編集2020/04/25 11:29総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ちなみに、PythonインタプリタがPythonスクリプトを読み込んでPython仮想マシン語にコンパイルしたバイトコードを逆アセンブルすることもできますよ。
py
1>>> def add(a, b): 2... print(a, b) 3... return a + b 4... 5>>> add.__code__.co_code.hex() # コンパイルされたadd関数のバイトコードを16進数表示 6'74007c007c01830201007c007c0117005300' 7>>> import dis 8>>> dis.dis(add) # add関数のバイトコードを逆アセンブル 9 2 0 LOAD_GLOBAL 0 (print) 10 2 LOAD_FAST 0 (a) 11 4 LOAD_FAST 1 (b) 12 6 CALL_FUNCTION 2 13 8 POP_TOP 14 15 3 10 LOAD_FAST 0 (a) 16 12 LOAD_FAST 1 (b) 17 14 BINARY_ADD 18 16 RETURN_VALUE
投稿2020/04/25 13:06
編集2020/04/25 13:12総合スコア5406
0
インタプリタというのは、機械語を実行するのではなく、スクリプトの文字列をその都度解釈しながら、その通りに動いているように(見えるように)実行させます。
たとえば、1+1というコードを書けば、C言語であれば1+1と実行させるような機械語を生成してその実行ファイルを作成しますが、
インタプリタ言語なら、文字列の1と1を読み、+を見て加算させる、という動作を、インタプリタが行います。
投稿2020/04/25 09:56
総合スコア88051
0
1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?
いいえ。違います。
2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません
一行一行コンパイルしていると思っていました。
スクリプトを解釈して実際の処理を行うのはインタプリタといいます。
インタプリタがスクリプトを一行ずつ解釈して処理を行います。
投稿2020/04/25 09:51
編集2020/04/25 09:52総合スコア1467
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/25 14:03