2013-05-18 3 views
5

私の理解では、この、定義のようなものです。コンパイル対翻訳、Javaをバイトコードに "コンパイル"しますか? - いくつかの他の言語でコードを生成し、いくつかの言語のコードを持つ</p> <p><em>翻訳</em>:

コンパイル - 機械コードへの翻訳。

マシンコード - CPUのための直接指示。 docs.oracle.comから今

、:

のjavac - Javaプログラミング言語

コンパイラコンパイラ...?私はそれがマシンコードではないコードを生成しているので、それはJava 翻訳者だと思う。バイトコードにはインタープリタ(JVM)が必要です。マシンコードではありません。

Wikipediaから:

Javaアプリケーションは、一般的に同様

をバイトコードにをコンパイルしています。定義によると、Javaはがバイトコードにを渡したと言います。インターネットにはもっと多くの例がありますが、それについては混乱していると思います。

これを明確にしてください。 翻訳とコンパイルの違いは何ですか?

+0

あなたの定義は間違っています。 –

答えて

6

それは定義のすべての問題だし、「コンパイル」を意味何のため単一受け入れられた定義はありません。あなたの目では、コンパイルはソースコードをある言語でネイティブに変換しています。マシンコードを生成しない変換プロセスは「コンパイル」と呼ばれるべきではありません。私の目では(と明らかに、文書作成者の目でもあるjavac)、それはすべきです。

翻訳、コンパイル、逆コンパイル、アセンブリ、逆アセンブリなど、実際にはさまざまな用語があります。彼らは、内のコード1つの正式な言語でコードを変換

  • 個人的に、私はすべてのこれらのプロセスは多くの共通点を持っているので、それは、これらの用語はすべて「編集」の下にグループに理にかなっているでしょうね別の正式な言語。

  • 可能な限り入力コードの意味を保持しようとします。
  • これらはすべて、フロントエンド、バックエンド、および中間に可能なオプティマイザ(learn more about compiler structure here)で互いに非常に似たデザインです。私はjavacとネイティブコンパイラの両方の門戸を見てきましたが、それらは比較的似ています。また

、「ネイティブコードを生成」のあなたの定義は問題がある:

  • 外部プログラムにこれを残してアセンブリを生成することができますが、マシンコードにそれを変換する気にしないコンパイラについて何を、 (一般に「アセンブラ」と呼ばれます)?この「コンパイラ」のこの定義は、最後に無視される比較のために否定しますか?
  • "マシンコード"をどのように分類しますか?明日どうすればa processor which can run Java Bytecode natively is created

しかし、これらは私の意見です。

  • コンパイル下位レベル1に、より高いレベルの言語でコードを変換されています。私は、最も受け入れられた定義があることであることを考えます。例:JavaからJavaへのバイトコード、またはCからx86へのマシンコード。
  • 逆コンパイルは、下位レベルの言語のコードを上位レベルのコードに変換します。つまり、コンパイルとは逆です。例:JavaバイトコードからJavaへ
  • 翻訳またはソース・ソース・コンパイルは、ある言語のコードを、同等の「レベル」の別の言語に変換しています。例:ARMからx86へ、またはCからJavaへ。 2つの言語が実際に同じ言語(例えばJavascript 6からJavascript 5)の異なるバージョンである場合、用語transpilerも使用されます。
  • アセンブリは、アセンブリ言語のコードをマシンコードに変換しています。
  • 逆アセンブリは、コンテキストに応じて、逆コンパイルと同義語または逆アセンブリのどちらかです。

これらの定義では、javacは間違いなくコンパイラと見なすことができます。しかし、やはり定義にはすべて含まれています。技術的な観点から、これらのアクションの多くは共通しています。

4

javacの結果はマシンコードです。マシンが仮想で物理的ではないという事実は関係ありません(そうでなければ、x86コードはMacのマシンコードではないので、あなたがMacユーザーであればx86でのコードの翻訳は翻訳であったと主張することができます)。しばしば バイナリ形式を有する他のコンピュータ言語(目的言語へプログラミング言語で書かれた ソースコード(ソース言語) を変換するコンパイラは、コンピュータプログラム(又はプログラムセット)である

+2

2006年以来、Macはx86プラットフォームを使用しています –

+0

* C++からx86に変換し、x86から​​PowerPCマシンコードに*コンパイル*するのはなぜでしょうか?私はバイトコード==マシンコードを置く方が良いと思います。 x86マシンコードがバイトコードと同じクラスになる可能性がある... –

+0

x86のような言語はありません。 C++を機械語に翻訳することはできますが、これはまだマシンコードにコンパイルする必要があります。言語は、人間の開発者に基づいたテキストであり、実際のマシンから抽象化されています。マシンコードは、CPUが実行できるものです。 –

1

」オブジェクトコードとして知られています)。

http://en.wikipedia.org/wiki/Compiler

ありませんので、コンパイルは出力がマシンコードであることを意味するものではありません。 たとえば、初期のC++コンパイルではCプログラムが生成され、そのプログラムを再びマシンコードにコンパイルする必要がありました。もちろん、良いコンパイラはこれらの別々のステップをユーザから隠すでしょうが、まだそこにあります。

私は少なくとも同じ手順を実行するNesCコンパイラを知っています。

JVMバイトコードを実行するマシンを構築できます。実際には、A. TanenbaumのStructured Computer Organizationのいくつかの章で説明しています。

http://www.amazon.com/Structured-Computer-Organization-5th-Edition/dp/0131485210

+0

コンパイル==翻訳?だから、すべての翻訳者を代わりにコンパイラと呼ぶべきですか? –

+1

翻訳はより一般的で、私は英語からスペイン語に翻訳することができました。私はそのコンパイルとは言いませんが、コンピュータ言語の分野では、そうです。 – LtWorf

関連する問題