Kompilasi vs Transpiling

92

Saat mencari tentang perbedaannya, saya menemukan definisi ini:

Kompilasi adalah istilah umum untuk mengambil kode sumber yang ditulis dalam satu bahasa dan mengubahnya ke bahasa lain.

Transpiling adalah istilah khusus untuk mengambil kode sumber yang ditulis dalam satu bahasa dan mengubahnya ke bahasa lain yang memiliki tingkat abstraksi yang serupa.

Saya mengerti apa itu Abstraksi.

Tetapi apa arti "tingkat abstraksi yang serupa" dalam definisi di atas? Dan bagaimana kita menemukan tingkat abstraksi dalam suatu bahasa?

Nishi Mahto
sumber
Kemungkinan duplikat dari Apa itu abstraksi?
GrumpyCrouton

Jawaban:

143

Definisi yang Anda kutip di atas terlalu umum untuk dipahami sepenuhnya oleh pemula, jadi izinkan saya menyederhanakannya menjadi sesuatu yang kita lihat secara praktis.

Compiler: adalah istilah umum untuk mendeskripsikan program yang mengambil kode sumber yang ditulis dalam satu bahasa dan menghasilkan (atau banyak) file output dalam beberapa bahasa lain. Dalam prakteknya kita kebanyakan menggunakan istilah ini untuk mendeskripsikan kompiler seperti gcc yang mengambil kode C sebagai masukan dan menghasilkan biner yang dapat dieksekusi (kode mesin) sebagai keluaran.

Transpiler juga dikenal sebagai kompiler sumber-ke-sumber. Jadi pada dasarnya mereka adalah bagian dari kompiler yang mengambil file kode sumber dan mengubahnya menjadi file kode sumber lain dalam beberapa bahasa lain atau versi berbeda dari bahasa yang sama. Ouput umumnya dapat dimengerti oleh manusia. Output ini masih harus melalui compiler atau interpreter agar dapat dijalankan di mesin.

Beberapa contoh transpiler:

  1. Menerapkan : Transpiles C / C ++ ke JavaScript
  2. Babel : Transpiles kode ES6 + ke ES5 (ES6 dan ES5 adalah versi atau generasi bahasa JavaScript yang berbeda)

Sekarang, apa yang mereka maksud dengan "tingkat abstraksi yang serupa": Seperti yang saya katakan itu mengkompilasi / transpiles ke file sumber, orang dapat berpendapat bahwa bahasa assembly juga merupakan file sumber dan dengan demikian gcc juga merupakan transpiler. Jadi, argumen inilah yang serupa dengan tingkat abstraksi yang kosong.

Gagasan untuk mengkategorikan bahasa ke tingkat bawah, menengah, dan atas didasarkan pada tingkat abstraksi yang mereka sediakan dari kerja aktual mesin / arsitektur.

Bahasa tingkat bawah seperti assembly sangat mirip dengan arsitektur prosesor, misalnya memiliki instruksi berbeda untuk prosesor yang berbeda. Sementara C / C ++ / Java / JavaScript, abstrak semua ini menyediakan lebih banyak abstraksi.

Jadi, transpiler mengkompilasi ke bahasa yang lebih dekat dengan bahasa yang Anda gunakan dalam abstraksi ini (atau lebih dekat ke level bahasa tersebut di tangga bahasa level bawah-menengah-atas).

Semoga ini membantu!

tapananand
sumber
10
"Beberapa contoh transpiler:" --- babel menyebut dirinya kompilator. Pemisahan antara transpiler dan compiler benar-benar artifisial.
zerkms
14
@zerkms Seperti yang saya katakan, transpiler adalah bagian dari kompiler.
tapananand
1
Saya ingin menambahkan satu hal, kita berbicara tentang bahasa alami di sini. Dengan demikian definisi fuzzy diharapkan. Saya berharap "kemudahan membaca" keluaran transpiler akan serupa dengan sebelumnya, sementara kompilator mempersulit pembacaan. Jadi Webpack / npm adalah kompiler, Anda tidak ingin membaca outputnya. (Setidaknya saat Anda menambahkan "Loader" untuk misalnya file .vue.
Samuel Åslund
1
Opini: Saya mengandaikan bahwa definisi harus: Kompilasi: bahasa -> bahasa tingkat rendah. Transpilasi: bahasa -> bahasa tingkat yang sama.
Deji
3
@Deji Belum tentu bahasa tingkat yang sama, tetapi bahasa pada tingkat abstraksi yang sama.
tapananand
33

Berikut ini semacam cara deskriptif untuk menjawab

Jika Anda menganggap lapisan abstraksi sebagai contoh ini:

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

Kompiler pergi ke tingkat yang lebih rendah (angka lebih rendah). Transpiler beralih dari satu bahasa (atau versi bahasa) ke bahasa lain pada nomor yang sama.

Araymer
sumber
1
Penasaran, dari mana asal daftar "tingkat abstraksi" itu?
zerkms
Hanya contoh ilustratif acak, saya tahu dua yang pertama agak lembek tbh, tapi saya ingin daftar yang lebih panjang: P
Araymer
2
Saya menyukainya dan akan sangat keren jika itu adalah klasifikasi "resmi" seperti itu. Karena tanpanya sulit untuk menempatkan alat (penerjemah) ke dalam satu atau kategori lain. Misalnya: adalah javackompiler atau tidak.
zerkms
2

Saya sangat setuju dengan tapananand jawaban, tapi ...


definisi

Kata-kata "dibuat", sehingga memiliki tujuan. Dan ini juga berubah seiring waktu.

Kita sekarang cenderung menggunakan transpiler untuk menentukan kompilator yang menerjemahkan kode ke kode lain yang "lebih mirip" dengan kode sumber, yang mungkin dilakukan oleh kompilator. Dan digunakan untuk membedakan keduanya sebagian besar ketika keduanya disebutkan dalam konteks yang sama (sekali lagi sebagian besar menyiratkan bahwa bahasa transpile harus dikompilasi setidaknya sekali lagi)


contoh

Jadi semuanya sangat subjektif. Pada saat penulisan ini:

  • Berasal dari dunia Java saya dapat memanggil transpiler CoffeeScript / TypeScript untuk menggambarkan bahwa kode yang dihasilkan tidak lebih efisien daripada yang asli.
  • Dokumentasi CoffeScript mengatakan ini adalah kompiler, dan babel adalah transpiler. Yang ingin mengatakan bahwa CoffeeScript, meskipun sangat mirip, bukan Javascript. Setidaknya bukan sebuah versi, karena itulah yang diproduksi oleh babel.
  • Babel menyebut dirinya kompiler.

fazit

Jadi transpile saat ini sangat jarang digunakan lagi, dan hanya untuk membedakan dua kompiler.

Ini mungkin akan menghilang sebagai konsep, karena kompilasi jauh lebih rumit dari itu (bahasa yang sama / lebih tinggi / lebih rendah, versi, dll), dan kata tersebut sepertinya tidak berguna lagi ("transpiler" sekarang ada dimana-mana)

estani
sumber
2

Contoh: TypeScript (superset Microsoft dari JavaScript dengan tipe pemeriksaan aman) mentransformasikan ke kode JavaScript yang dapat dijalankan di berbagai jenis browser.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript adalah bahasa pemrograman sumber terbuka yang dikembangkan dan dikelola oleh Microsoft. Ini adalah superset sintaksis ketat dari JavaScript, dan menambahkan pengetikan statis opsional ke bahasa tersebut.

TypeScript dirancang untuk pengembangan aplikasi besar dan ditranskompilasi ke JavaScript. [5] Karena TypeScript adalah superset dari JavaScript, program JavaScript yang ada juga merupakan program TypeScript yang valid. TypeScript dapat digunakan untuk mengembangkan aplikasi JavaScript untuk eksekusi sisi klien dan sisi server (Node.js). "

Burak
sumber
Ada alat "compiler skrip" (atau tsc), penamaannya menyiratkan bahwa TypeScript dikompilasi tidak ditranspilasi ... namun alat tersebut mengubah TypeScript ke Javascript, yang merupakan tingkat abstraksi yang sama dengan perangkat keras yang mendasarinya. Apakah TypeScript dikompilasi, atau ditranspilasi?
Alex McMillan
@AlexMcMillan TypeScript DILENGKAPI, karena ini adalah superset dari javascript, dan dengan demikian dikompilasi menjadi javascript.
Araymer
@Araymer Apakah Anda memahami perbedaan antara kompilasi dan transpilasi? Karena TS tidak dikompilasi; juga bukan JS.
Alex McMillan
Ya saya lakukan. Dan karena TS adalah superset dari JS, itu dianggap sebagai tingkat abstraksi yang lebih tinggi, dan oleh karena itu disebut sebagai "terkompilasi". JS yang dikompilasi kemudian diinterpretasikan seperti biasa. Oleh karena itu mengapa jika Anda mencari TS, satu-satunya topik yang paling banyak didiskusikan adalah "kompilasi" -nya. Namun, garis antara transpilasi dan kompilasi tidak memiliki definisi kuantitatif resmi. Ini menjadi sangat lembek, jadi pendapat Anda tentang apa yang dikompilasi (berbeda dari pembuatnya, apa adanya) hanyalah pendapat Anda.
Araymer