web-dev-qa-db-ja.com

コンパイルとトランスパイル

違いを探していると、これらの定義に出会いました。

コンパイルは、ある言語で記述されたソースコードを別の言語に変換するための一般的な用語です。

Transpilingは、ある言語で記述されたソースコードを取得し、同様のレベルの抽象化を持つ別の言語に変換するための特定の用語です。

私は抽象化とは何かを理解しています。

しかし、上記の定義で「類似レベルの抽象化」とはどういう意味ですか?そして、言語の抽象化レベルをどのようにして見つけるのでしょうか?

30
Nishi Mahto

あなたが上で引用した定義は、初心者には完全に理解するには一般的すぎるので、実際に見られるものに単純化させてください。

コンパイラ:は、ある言語で記述されたソースコードを取得し、他の言語で(または多数の)出力ファイルを生成するプログラムを説明する包括的な用語です。実際には、主にこの用語を使用して、入力としてCコードを取り込み、出力としてバイナリ実行可能ファイル(マシンコード)を生成するgccなどのコンパイラを説明します。

Transpilersは、ソースからソースへのコンパイラとしても知られています。したがって、本質的には、ソースコードファイルを取り込み、それを他の言語または異なるバージョンの別のソースコードファイルに変換するコンパイラのサブセットです。同じ言語の。出力は一般に人間に理解されます。この出力は、マシンで実行できるようにするために、コンパイラーまたはインタープリターを経由する必要があります。

トランスパイラーの例:

  1. Emscripten :C/C++をJavaScriptに変換します
  2. Babel :ES6 +コードをES5にトランスパイルします(ES6とES5はJavaScript言語の異なるバージョンまたは世代です)

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

言語を下位、中間、および上位レベルに分類するという概念は、機械/アーキテクチャの実際の動作から提供される抽象化のレベルに基づいています。

Assemblyなどの低レベル言語は、プロセッサアーキテクチャに非常に近い、つまり、プロセッサごとに異なる命令を持っています。 C/C++/Java/JavaScriptでは、これらすべてを抽象化することにより、抽象化が強化されます。

したがって、トランスパイラーは、この抽象化の用語で開始した言語に近い言語(または、低中高レベルの言語ラダーでその言語のレベルに近い言語)にコンパイルします。

お役に立てれば!

49
tapananand

答えを説明する一種の方法を次に示します

この例として抽象化のレイヤーを考える場合:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)Assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

コンパイラは、より低いレベル(より低い数)になります。トランスパイラーは、1つの言語(または言語のバージョン)から同じ番号の別の言語に切り替えます。

14
Araymer

例:TypeScript(タイプセーフチェックを備えたMicrosoftのJavaScriptのスーパーセット)は、さまざまなタイプのブラウザーで実行できるJavaScriptコードに変換します。

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScriptは、Microsoftが開発および保守しているオープンソースのプログラミング言語です。 JavaScriptの厳密な構文上のスーパーセット。オプションの静的型付けを言語に追加します。

TypeScriptは、大規模アプリケーションの開発およびJavaScriptへのトランスコンパイル用に設計されています。[5] TypeScriptはJavaScriptのスーパーセットであるため、既存のJavaScriptプログラムも有効なTypeScriptプログラムです。 TypeScriptは、クライアント側とサーバー側(Node.js)の両方の実行のためのJavaScriptアプリケーションの開発に使用できます。」

0
Burak

私はタパナンドの答えに大部分は同意しますが、...


定義

言葉は「作られる」ので、目的を果たします。また、これは時間とともに変化します。

現在、トランスパイラーを使用して、ソースコードに「より類似した」他のコードに変換するコンパイラーを指定する傾向があります。そして、両方が同じコンテキストで言及されている場合、主に両方を区別するために使用されます(ここでも、主に、トランスパイル言語が少なくとももう一度コンパイルされる必要があることを意味します)


すべてが主観的ですveryこの執筆の時点で:

  • Javaの世界から来ると、CoffeeScript/TypeScriptトランスパイラーを呼び出して、結果のコードが元のコードよりも効率的ではないことを示すことができます。
  • CoffeScript documentation はコンパイラーであり、babelはトランスパイラーであると言います。 CoffeeScriptは非常によく似ていますが、Javascriptではないと言いたいです。少なくともそれのバージョンではありません。それはbabelが生成するものです。
  • Babel は、自身をコンパイラと呼びます。

ファジット

したがって、transpileは現時点ではほとんど使用されておらず、2つのコンパイラを区別するためだけに使用されています。

コンパイルはそれよりもはるかに複雑(同じ/より高い/より低い言語、バージョンなど)であり、Wordはもはや有用ではないようです(「トランスパイラー」はどこにでもあるため)

0
estani