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


95

違いを探しているときに、私はこれらの定義に出くわしました:

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

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

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

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


可能性のある重複した抽象化とは何ですか?
GrumpyCrouton 2017

回答:


147

上で引用した定義は、初心者が完全に理解するには一般的すぎるため、実際に見られるものに単純化してみましょう。

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

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

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

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

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

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

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

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

お役に立てれば!


12
「トランスパイラーのいくつかの例:」--- babelはそれ自体をコンパイラーと呼んでいます。トランスパイラーとコンパイラーの分離は本当に人為的なものです。
zerkms 2017

15
@zerkms私が言ったように、トランスパイラーはコンパイラーのサブセットです。
tapananand 2018

1
ここでもう1つ付け加えておきたいのは、自然言語についてです。したがって、あいまいな定義が予想されます。トランスパイラーの出力の「読みやすさ」は以前と同じであると思いますが、コンパイラーは物事を読みにくくします。したがって、Webpack / npmはコンパイラーであり、その出力を読みたくありません。(少なくとも、あなたは、例えば.vueファイルのための「ローダー」を追加したとき。
サミュエル・アスルンド

2
意見:定義は次のようにすべきだと思います:コンパイル:言語->低水準言語。トランスパイル:言語->同じレベルの言語。
デジ

3
@Deji必ずしも同じレベルの言語ではありませんが、同じレベルの抽象化の言語です。
tapananand

35

これが答える一種の説明的な方法です

この例のように抽象化レイヤーを考えると:

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

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


1
不思議なことに、その「抽象化レベル」のリストはどこから来たのですか?
zerkms 2017

単なるランダムな実例です。最初の2つはちょっとどろどろしたtbhですが、もっと長いリストが必要でした:P
Araymer 2017

2
私はそれが好きで、それがそのような「公式の」分類であるならば、それは本当にクールでしょう。それがないと、ツール(トランスレータ)を1つまたは別のカテゴリに分類するのは困難です。例:javacコンパイラかどうか。
zerkms 2017

2

私はタパナナンドの答えにほとんど同意しますが...


定義

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

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


したがって、すべてが非常に主観的です。この記事の執筆時点では:

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

ファジット

そのため、現時点では、トランスパイルはほとんど使用されておらず、2つのコンパイラを区別するためにのみ使用されています。

コンパイルはそれよりもはるかに複雑であり(同じ/より高い/より低い言語、バージョンなど)、その単語はもはや役に立たないように思われるため、おそらく概念として消えてしまうでしょう(「トランスパイラー」は今や至る所にあります)


2

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

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

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


「typescriptコンパイラ」(またはtsc)ツールがあり、その名前はTypeScriptがトランスパイルされずにコンパイルされることを意味します...それでもツールはTypeScriptをJavascriptに変換します。これは、基盤となるハードウェアと同じレベルの抽象化です。TypeScriptはコンパイルされていますか、それともトランスパイルされていますか?
AlexMcMillan20年

@AlexMcMillan TypeScriptは、javascriptのスーパーセットであるため、COMPILEDであり、javascriptにコンパイルされます。
Araymer

@Araymerコンパイルとトランスパイルの違いを理解していますか?TSがコンパイルされていないため。JSもそうではありません。
AlexMcMillan20年

はい、そうです。また、TSはJSのスーパーセットであるため、より高いレベルの抽象化と見なされ、「コンパイル済み」と呼ばれます。コンパイルされたJSは、通常どおりに解釈されます。したがって、TSを調べる場合、最も議論されているトピックはその「コンパイル」だけです。しかし、トランスパイルとコンパイルの間の線には、公式の定量的な定義がありません。それはかなりどろどろになるので、コンパイルされたものについてのあなたの意見(それ自体は作成者とは異なります)はあなたの意見です。
Araymer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.