質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

スクリプト型 コンパイル

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 283

assa

score 26

よくスクリプト型pythonなどは一行一行翻訳しているといい、そしてコンパイル不要
コンパイラ型は事前にコンパイルされるといいます。
ここで質問です。
cpuは機械語じゃないと実行できないからソースコードをコンパイルします。

1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?
しかしソースコードのままではどちらにしろむりだと思います。
2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません
一行一行コンパイルしていると思っていました。

おしえてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

全部違います。
このあたりは、「大体こうだけど、例外も結構ある」というケースばかりで、例外まで説明していると意味不明になるので、少数派を切り捨てて説明します。

よくスクリプト型pythonなどは一行一行翻訳しているといい、

違います。実行の最初にプログラム全体をコンパイルして、その結果を実行します。
コンパイル結果は多くの場合は機械語ではなく、仮想マシン言語、中間言語、などというものにコンパイルします。
仮想マシン言語、中間言語などは、機械語じゃ無いので、それらを実行するプログラム(インタプリター)が必要で、そのインタプリタは普通は機械語になっています。

コンパイラ型は事前にコンパイルされるといいます。

スクリプト言語とコンパイル言語の違いは、現在では、コンパイルをあらかじめしてコンパイル結果のファイルを作りそれを実行するか、実行の度にコンパイルしてすぐ実行するのでコンパイル結果はメモリ上にしか無いかだけの違いです。

cpuは機械語じゃないと実行できないからソースコードをコンパイルします。
1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?

上述のように、コンパイル結果を実行するインタプリターが機械語です。

コンパイル言語が作るコンパイル結果も、機械語のこともあるし(ほとんどのC)、仮想マシン言語のこともあります(Java)。
Javaのコンパイル結果は機械語じゃないので、仮想マシン言語を実行するJavaVMが必要です。JavaVMは機械語です(多分)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/25 23:03

    回答ありがとうございました
    もっと全体的に知識がいるようで勉強なりました

    キャンセル

+2

1スクリプト型はコンパイル不要といいます。
まずこれはcpuを使っていないということですか?
しかしソースコードのままではどちらにしろむりだと思います。

CPUは何をするにしても絶対に使います。

2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません
一行一行コンパイルしていると思っていました。

一行一行というのは語弊があります。たとえば制御構文や関数定義など、ブロック構文が入ってくると抜けてから処理しないとどうにもならないでしょう。


一つの考え方は、コンパイラにコマンドライン引数でファイルを取ってコンパイルしてファイルに書き出さずにそのまま自動で実行するような機能をつければインタプリタだというもので、それはそれでありな発想かもしれません。

では、オレ言語の仕様を決めて、それで作ってみてください。……とやろうとすると、コンパイラを作るのがしんどい、という壁にぶち当たります。普通に考えればわかると思いますが、高級言語のコードを機械語まで変換するのはかなり難しい技術です。まあ、どのみち言語処理系を作るのなんて大変なのですが、コンパイラまで作ろうとすると確実にアセンブリ言語の(というか機械語の)知識が要ります。

しかもCPUの命令セットが違えば一から作り直しですし、CPUはたくさん種類があります。x64とARMくらい、という訳にはいきません。同じアーキテクチャでも石によって対応してる命令が違うとか。更に言うと、プログラミング言語の機能にはOSに依存する処理も多いので、OSごとに変えないといけない部分もあったりして……

これでは誰もプログラミング言語なんて作れないような気がしますが、コンパイラはともかくインタプリタならけっこう作る人はいます。

実際のところ、インタプリタを作る人は別にアセンブリ言語のこととか命令セットのことまで考える必要はありません(考えた方が結果的に良いものが作れる可能性はありますが)。幸運なことに、大抵の環境にはCコンパイラがあるのです(別にCでなくても適当に低レイヤが触れて適当に書きやすくて適当に移植性が高いネイティブコードを出力してくれるコンパイラ型言語ならなんでもいいのですが、あんまりないですね。今だとできればC++にしたいかなくらい)。

なので、文字列を読み込んでプログラミング言語として適切に処理するCのプログラムを書けば、それで解決です。作るのも簡単だし(コンパイラを書く手間に比べれば、ということであって実際は簡単ではない)、移植性とかもそんなに問題になりません(複数環境カバーするコンパイラを作る手間に比べれば、ということであって実際はプラットフォーム依存の部分はたくさんある)。

乱暴に言ってしまえば、これがインタプリタの基本的なコンセプトです。確かにCPUは最終的に機械語を実行するのですが、その機械語はオレ言語のインタプリタが吐き出している訳ではなく、オレ言語のインタプリタをコンパイルしてくれたC言語のコンパイラの吐き出した命令列です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/25 23:04

    回答ありがとうございました
    ほかの知識もないと理解するのは難しそうです。
    勉強なりました

    キャンセル

+1

1スクリプト型はコンパイル不要といいます。
>まずこれはcpuを使っていないということですか?

いいえ。違います。

2一行一行翻訳しているのとコンパイルすることは同じように思えて違いがわかりません
一行一行コンパイルしていると思っていました。

スクリプトを解釈して実際の処理を行うのはインタプリタといいます。
インタプリタがスクリプトを一行ずつ解釈して処理を行います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/25 23:01

    回答ありがとうございました

    キャンセル

+1

インタプリタというのは、機械語を実行するのではなく、スクリプトの文字列をその都度解釈しながら、その通りに動いているように(見えるように)実行させます。

たとえば、1+1というコードを書けば、C言語であれば1+1と実行させるような機械語を生成してその実行ファイルを作成しますが、
インタプリタ言語なら、文字列の1と1を読み、+を見て加算させる、という動作を、インタプリタが行います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/25 19:01

    回答ありがとうございます
    python専用のインタプリタがありpythonはそこで行われている
    そしてc言語はcpuで行われているということであっていますか

    キャンセル

  • 2020/04/25 19:03

    まあ、そういうことですね
    python自身が、pythonのコードを実行させてますね

    キャンセル

+1

ちなみに、PythonインタプリタがPythonスクリプトを読み込んでPython仮想マシン語にコンパイルしたバイトコードを逆アセンブルすることもできますよ。

>>> def add(a, b):
...     print(a, b)
...     return a + b
...
>>> add.__code__.co_code.hex()  # コンパイルされたadd関数のバイトコードを16進数表示
'74007c007c01830201007c007c0117005300'
>>> import dis
>>> dis.dis(add)  # add関数のバイトコードを逆アセンブル
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_FAST                0 (a)
              4 LOAD_FAST                1 (b)
              6 CALL_FUNCTION            2
              8 POP_TOP

  3          10 LOAD_FAST                0 (a)
             12 LOAD_FAST                1 (b)
             14 BINARY_ADD
             16 RETURN_VALUE

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/25 23:05

    回答ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る