1. ホーム
  2. compiler-construction

[解決済み] コンパイルとトランスパイルの比較

2022-03-06 15:32:13

質問

この違いについて調べていたら、以下のような定義にたどり着きました。

コンパイル とは、ある言語で書かれたソースコードを、別の言語に変換することの総称である。

トランスパイル とは、ある言語で書かれたソースコードを、同じような抽象度を持つ別の言語に変換することを指す言葉です。

抽象化とは何か、理解できた。

しかし、上記の定義において、「類似の抽象度」とは何を意味するのでしょうか?また、ある言語の抽象度をどのように見つけるのでしょうか?

どのように解決するのか?

上に引用した定義は、初心者が完全に理解するには一般的すぎるため、私たちが実際に目にするものに簡略化して説明します。

コンパイラです。 は、ある言語で書かれたソースコードを受け取り、他の言語で書かれた1つ(または複数)の出力ファイルを生成するプログラムを表す包括的な用語です。 実際には、C言語のコードを入力として受け取り、バイナリ実行ファイル(マシンコード)を出力するgccのようなコンパイラを説明するために、この用語を使用することがほとんどです。

トランスパイラー は、ソースからソースへのコンパイラとも呼ばれます。要するに、ソースコード・ファイルを受け取って、それを別のファイルに変換するコンパイラのサブセットです。 ソースコード・ファイル 他の言語や同じ言語の別のバージョンで書かれています。出力は通常、人間が理解できるものです。この出力は、マシン上で実行できるようにするために、コンパイラやインタープリタを経由する必要があります。

トランスパイラのいくつかの例。

  1. エムズスクリプト : C/C++ から JavaScript への変換
  2. バベル : ES6+のコードをES5に変換します(ES6とES5はJavaScript言語の異なるバージョンまたは世代です)。

さて、「類似の抽象化レベル」とはどういう意味でしょうか。 ソースファイルにコンパイル/トランスパイルすると言いましたが、アセンブリ言語もソースファイルであり、したがってgccもトランスパイラであると主張することができます。つまり、この議論は、この類似の抽象化レベルを無効にするものなのです。

言語を低級、中級、高級に分類する考え方は、マシン/アーキテクチャの実際の動作からどの程度抽象化されているかということに基づいています。

アセンブリのような低レベルの言語は、プロセッサのアーキテクチャに非常に近く、プロセッサごとに異なる命令を持っています。一方、C/C++/Java/JavaScriptは、このすべてを抽象化し、より高い抽象度を提供しています。

つまり、トランスパイラとは、この抽象化という意味で、最初に使った言語に近い(あるいは、低・中・高級言語のはしごでその言語のレベルに近い)言語にコンパイルするものなのです。