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?



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!


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.


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)


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). "


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.