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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械語

機械語とは、プロセッサが直接解釈・実行できる状態の言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

757閲覧

スクリプト型 コンパイル

assa

総合スコア35

機械語

機械語とは、プロセッサが直接解釈・実行できる状態の言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/25 09:46

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

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

おしえてください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

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

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

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

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

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

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

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

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

投稿2020/04/25 10:12

otn

総合スコア84507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assa

2020/04/25 14:03

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

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
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assa

2020/04/25 14:04

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

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
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assa

2020/04/25 14:05

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

0

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

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

投稿2020/04/25 09:56

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assa

2020/04/25 10:01

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

2020/04/25 10:03

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

0

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

いいえ。違います。

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

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

投稿2020/04/25 09:51

編集2020/04/25 09:52
take88

総合スコア1359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assa

2020/04/25 14:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問