- 締切済み
コンパイラとインタプリタとアセンブラの違いって何?
言語プロセッサの説明で「コンパイラ、インタプリタ、アセンブラ」などがあると書かれていたのですが、 コンパイラもインタプリタもアセンブラもどれも説明が「機械語に翻訳する」と書かれていました。 何が違うのでしょうか? 違いをわかりやすく教えてください。 いろいろなプログラミング言語があるというところまでは理解できましたが、プログラミングはわかりません。(涙) これから勉強します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- princehoge
- ベストアンサー率0% (0/0)
補足です。 皆さん概ね正しいですが、とてもよくあるインタプリタに関する勘違いをされています。 インタプリタが逐次機械語に翻訳するというのは、動的コンパイルの説明で、それはインタプリタの一形態に過ぎません。 「逐次機械語に翻訳して実行する」というよりは、「逐次インタプリタ言語を解釈して、それに対応するインタプリタのサブルーチンを呼び出して実行する」が正しいです。 こちらを参考にされてください。 http://lise.me.sophia.ac.jp/kktm/Essay/virtual_machine.htm http://www.sophia-it.com/content/インタープリタ型言語
コンピュータが理解出来るのは「機械語」だけなので、どのプログラミング言語で書いても最終的には「機械語」になります。 機械語の実体は、"000A4B13"のような人間には普通は理解出来ない数字の羅列なので、これでプログラムしろというのは無理な話です。「アセンブラ」は、この数字の羅列を少し分かりやすくしたものです。足し算なら"ADD"のように。 しかし、足し算をするのに"ADD 2,DATA"等と書くために、これでも人間には読みにくいですね。もっと人間に読みやすいプログラムを書けるように考えられたのが「コンパイラ」です。足し算なら"data + 2"という書き方が出来るわけです。 アセンブラもコンパイラも、テキストで書かれたプログラムを一気に機械語に変換します。1000行あるプログラムのある1行だけ直したくても、1000行全部を一度機械語に変換しないと実際に動作させる事ができません。 それでは大変なので、1行入力したらその場で機械語に変換してしまうのが「インタプリタ」です。単純な書き間違いはその場でエラーになりますし、プログラムが書き終わったら、すぐに実行する事が出来ます。 こう書くと、インタプリタが一番優れているように見えますが、他の方が書かれているように、それぞれ特徴があり、場合に応じて使い分けされています。 とまあ、かなり大雑把に概念的な事を書いてみました。これでイメージが掴めたら、少し実際のプログラムをやってみてから、もっと深く勉強されたら良いかと思います。
- techbrain
- ベストアンサー率76% (70/92)
コンパイラ、インタプリタ、アセンブラの違いを理解するには、高級言語と低級言語(?)の違い、コンピュータプログラムの動くソフトウェア的な仕組みを理解する必要があります。 そもそもコンピュータに搭載されるCPU自体は単なる計算機です。 集積度が高いので、高速に多くの計算が出来るだけです。 その際には電流の「オンとオフ」を基にした「1と0」による2進数計算しか厳密に言えば出来ません。 機械語というのは、この2進数による計算処理を直接的に行える様にしてあるもので、16進数で圧縮記載されることもありますが、要は限りなくコンピュータ自体の処理方法に近い書き方で表されるので他の方が言う様に実行速度が速いのです。いわゆる低級言語に当たります。 アセンブリ言語とは、人間にはいきなり2進数や16進数で計算処理を全て書き表す様なプログラムを記述するのは(簡単なものを除けば)現実的ではないので、これを四則演算のようなごく単純な命令を言語として定めておいて、それを使って計算処理を書くようにしたものです。 これもコンピュータ処理自体に近い表記であり、低級言語に近いものです。 コレに対して、BASICのようなインタプリタ言語やコンパイルを要するC言語は高級言語と呼ばれ、人間の思考に近い形で計算処理を表記できるようにしてあるのです。要は、機械語・アセンブリ言語で行う計算処理を組み合わせて「命令セット」として組み合わせて、それを単語と結びつけて擬似的に言語体系化したものです。 コンパイラは、その計算処理の命令セットを実行する際に、機械語表記のような計算機が実行できる形に翻訳するのに「一括変換」が必要な言語体系でかかれたプログラムを「一括変換するための翻訳プログラム」です。コンパイルする、とはその翻訳プログラムを使って一括変換を行うことを指します。 インタプリタ言語は、(他の方が書かれている様に)プログラムを1つの命令処理単位で「逐次実行」するための翻訳プログラムです。 物凄く単純化して言うと、10行で書かれたプログラムに各1行に1つの命令処理があるとして、そのプログラムを実行すると、1行ずつ命令処理を実行していき、10個の命令処理が終わるとプログラムが完結する、というのがインタプリタ言語の翻訳の仕方です。 高級言語で書かれた“文章”を前から読み込んで計算処理をしようとするので、記述に誤りがあった場合、その時点で処理がエラーを起こして止まるのが特徴で、誤り(バグ)を直し易い[=デバッグしやすい]というのが使うメリットです。 計算処理は遅くなるので、昔のPCなどではプログラムの組み方次第では“遅すぎて固まっている”様な状態になることがありましたが、今はCPUの機能やメモリの容量も大きくなっているので、こういう言語体系の方が迅速な開発が出来るということで好まれていることがあります。最近、Webシステムの開発で使われるPerlやPHPなどのスクリプト言語もインタプリタ言語の1つです。 ただ、どんなコンピュータも最終的には機械語・アセンブリ言語レベルでの計算処理が行われているのは同じなので、処理ロジックを計算しやすいように単純化することは、処理を高速化する際のポイントになります。 上手い説明とは思いませんが、他の方の説明とあわせてご理解頂ければと思います。不明な点があれば補足を追加して下さい。
分かりやすく外国語の翻訳に例えて言います。 一番早いのがアセンブラで、通訳とか翻訳家のレベルです。一旦機械語に変換されると最速レベルで実行されます。また変換後のプログラムのサイズもコンパクトです。 次に速いのがコンパイラです。翻訳に例えると機械通訳、翻訳機です。一気に機械語に変換されますが、共通な作業をするランタイム・ルーチンなどが付加されます。そのためプログラムのサイズはアセンブラより大きくなります。 インタプリタはその都度辞書引きですw。一行一行機械語に翻訳しながらプログラムを実行するので、処理のスピードはアセンブラに比べて1000倍位遅くなります。ただし、プログラミングのミスがあった場合でも容易に中断し、手直しできるメリットがあります。 アセンブラやコンパイラの場合、アセンブルやコンパイルの途中でエラーが発見されれば手直しができますが、できあがった機械語にバグがあった場合、多くは暴走してしまい、リセットをかけるしか手が無くなります。また、そのバグを見つけるのもインタプリタより遙かに手がかかります。
- sapporo30
- ベストアンサー率33% (905/2715)
コンパイラは、機械語に翻訳した後、実行形式のオブジェクトを 作成します。 インタープリタは、機械語に翻訳しながら実行していきます。 同時通訳のイメージです。 アセンブラは、機械語に近いアセンブラ言語を機械語に変換する のです。 http://www13.plala.or.jp/dragon-vein/data%20base/computer.htm