Kompilacja vs Transpiling

92

Szukając różnicy, natrafiłem na te definicje:

Kompilacja to ogólny termin oznaczający pobieranie kodu źródłowego napisanego w jednym języku i przekształcanie go w inny.

Transpiling to specyficzny termin oznaczający pobieranie kodu źródłowego napisanego w jednym języku i przekształcanie go w inny język o podobnym poziomie abstrakcji.

Rozumiem, czym jest abstrakcja.

Ale co oznacza „podobny poziom abstrakcji” w powyższej definicji? A jak znaleźć poziom abstrakcji w języku?

Nishi Mahto
źródło
Możliwa kopia Co to jest abstrakcja?
GrumpyCrouton
Czy to jest źródło? stevefenton.co.uk/2012/11/compiling-vs-transpiling
wjandrea

Odpowiedzi:

142

Definicja, którą przytoczyłeś powyżej, jest zbyt ogólna, aby początkujący mógł ją całkowicie zrozumieć, więc pozwól mi tylko uprościć ją do czegoś, co widzimy praktycznie.

Kompilator: to ogólny termin opisujący program, który pobiera kod źródłowy napisany w jednym języku i tworzy (lub wiele) plik wyjściowy w innym języku. W praktyce używamy tego terminu głównie do opisania kompilatora, takiego jak gcc, który pobiera kod C jako dane wejściowe i generuje binarny plik wykonywalny (kod maszynowy) jako wyjście.

Transpilery są również znane jako kompilatory od źródła do źródła. W istocie są to podzbiór kompilatorów, które pobierają plik kodu źródłowego i konwertują go na inny plik kodu źródłowego w innym języku lub w innej wersji tego samego języka. Wynik jest ogólnie zrozumiały dla człowieka. To wyjście nadal musi przejść przez kompilator lub interpreter, aby można było uruchomić na komputerze.

Kilka przykładów transpilerów:

  1. Emscripten : Transpiles C / C ++ do JavaScript
  2. Babel : Transpiles ES6 + kod do ES5 (ES6 i ES5 to różne wersje lub generacje języka JavaScript)

A teraz, co mają na myśli przez „podobny poziom abstrakcji”: jak powiedziałem, że kompiluje / transpiluje do pliku źródłowego, można argumentować, że asembler jest również plikiem źródłowym, a zatem gcc jest również transpilerem. Tak więc ten argument jest tym, co ten podobny poziom abstrakcji powoduje.

Pojęcie kategoryzacji języków na niższy, średni i wyższy poziom opiera się na poziomie abstrakcji, jaki zapewniają one w stosunku do rzeczywistego działania maszyny / architektury.

Języki niższego poziomu, takie jak asembler, są bardzo zbliżone do architektury procesora, tj. Mają różne instrukcje dla różnych procesorów. Podczas gdy C / C ++ / Java / JavaScript, odejmij to wszystko, zapewniając więcej abstrakcji.

Tak więc transpiler kompiluje się do języka, który jest bliższy językowi, od którego zacząłeś w zakresie tej abstrakcji (lub jest bliżej poziomu tego języka w drabinie językowej niższy-średni-wyższy poziom).

Mam nadzieję że to pomoże!

tapananand
źródło
9
„Kilka przykładów transpilerów:” --- babel nazywa siebie kompilatorem. Separacja między transpilerami a kompilatorami jest naprawdę sztuczna.
zerkms
13
@zerkms Jak powiedziałem, transpilery to podzbiór kompilatorów.
tapanan i
1
Chciałbym dodać jedną rzecz, mówimy tutaj o języku naturalnym. W związku z tym oczekuje się rozmytych definicji. Spodziewałbym się, że „łatwość czytania” wyjścia transpilera będzie podobna do tego, co było wcześniej, podczas gdy kompilator utrudnia czytanie. Zatem Webpack / npm jest kompilatorem, nie chcesz czytać jego danych wyjściowych. (Przynajmniej jeśli dodasz "programy ładujące" np. Pliki .vue.
Samuel Åslund
1
Opinia: Uważam, że definicje powinny brzmieć: Kompilacja: język -> język niższego poziomu. Transpilacja: język -> język na tym samym poziomie.
Deji
3
@Deji Niekoniecznie ten sam poziom języka, ale język na podobnym poziomie abstrakcji.
tapanan i
33

Oto opisowy sposób odpowiedzi

Jeśli pomyślisz o warstwach abstrakcji jako o tym przykładzie:

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

Kompilator przechodzi na niższy poziom (niższy numer). Transpiler przełącza się z jednego języka (lub wersji języka) na inny pod tym samym numerem.

Araymer
źródło
1
Ciekawe, skąd wzięła się ta lista „poziomów abstrakcji”?
zerkms
Tylko przypadkowe przykłady ilustracyjne, wiem, że pierwsze dwa są trochę bzdurne, ale chciałem mieć dłuższą listę: P
Araymer
2
Podoba mi się i byłoby naprawdę fajnie, gdyby to była jakaś „oficjalna” klasyfikacja. Ponieważ bez tego trudno jest umieścić narzędzie (tłumacz) w takiej czy innej kategorii. Np .: jest javackompilatorem czy nie.
zerkms
2

W większości zgadzam się z tapananem i odpowiedzią, ale ...


definicja

Słowa są „stworzone”, więc służą celowi. I to też się zmienia z czasem.

Obecnie mamy tendencję do używania transpilera do określenia kompilatora, który tłumaczy kod na inny kod „bardziej podobny” do kodu źródłowego, co może zrobić kompilator. I jest używany do rozróżniania obu, głównie wtedy, gdy oba są wymienione w tym samym kontekście (znowu głównie oznacza to, że język transpile będzie musiał zostać skompilowany co najmniej raz jeszcze)


przykłady

Więc wszystko jest bardzo subiektywne. W chwili pisania tego tekstu:

  • Pochodząc ze świata Java, mogłem wywołać transpilery CoffeeScript / TypeScript, aby pokazać, że wynikowy kod nie jest bardziej wydajny niż oryginalny.
  • Dokumentacja CoffeScript mówi, że to kompilator, a babel to transpiler. Chcielibyśmy powiedzieć, że CoffeeScript, choć bardzo podobny, nie jest JavaScriptem. Przynajmniej nie jest to jego wersja, ponieważ to właśnie produkuje Babel.
  • Babel nazywa siebie kompilatorem.

fazit

Tak więc transpile jest obecnie bardzo rzadko używany i tylko w celu odróżnienia dwóch kompilatorów.

Prawdopodobnie zniknie jako koncepcja, ponieważ kompilacja jest znacznie bardziej skomplikowana (ten sam / wyższy / niższy język, wersja itp.), A słowo nie wydaje się już być przydatne („transpilery” są teraz wszechobecne)

estani
źródło
2

Na przykład: TypeScript (nadzbiór języka JavaScript firmy Microsoft z funkcją bezpiecznego sprawdzania typów) transponuje do kodu JavaScript, który może działać w różnych typach przeglądarek.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript to język programowania typu open source opracowany i utrzymywany przez firmę Microsoft. Jest to ścisły nadzbiór składni JavaScript i dodaje opcjonalne statyczne pisanie do języka.

TypeScript jest przeznaczony do tworzenia dużych aplikacji i transkompilacji do JavaScript. [5] Ponieważ TypeScript jest nadzbiorem języka JavaScript, istniejące programy JavaScript są również prawidłowymi programami TypeScript. TypeScript może służyć do tworzenia aplikacji JavaScript do wykonywania zarówno po stronie klienta, jak i po stronie serwera (Node.js). "

Burak
źródło
Istnieje narzędzie „kompilator skryptu” (lub tsc), jego nazewnictwo sugeruje, że TypeScript jest kompilowany, a nie transponowany ... jednak narzędzie konwertuje TypeScript do Javascript, które mają ten sam poziom abstrakcji w stosunku do podstawowego sprzętu. Czy TypeScript jest kompilowany czy transpilowany?
Alex McMillan
@AlexMcMillan TypeScript jest KOMPILOWANY, ponieważ jest nadzbiorem javascript i jako taki jest kompilowany do javascript.
Araymer
@Araymer Czy rozumiesz różnicę między kompilacją a transpilacją? Ponieważ TS nie jest kompilowany; ani JS.
Alex McMillan
Tak. A ponieważ TS jest nadzbiorem JS, jest uważany za wyższy poziom abstrakcji i dlatego jest określany jako „skompilowany”. Skompilowany JS jest następnie interpretowany normalnie. Dlatego, jeśli spojrzysz na TS, najczęściej omawianym tematem jest jego „kompilacja”. Ale granica między transpilacją a kompilacją nie ma oficjalnej definicji ilościowej. Robi się dość bzdurny, więc Twoja opinia na temat tego, co zostało skompilowane (różni się od twórców, jak jest), jest tylko Twoją opinią.
Araymer