Transpilator

kompilator, który przetwarza kod źródłowy na kod źródłowy w innym języku programowania, ale na tym samym poziomie abstrakcji

Transpilator (także transkompilator)[1][2][3] – rodzaj kompilatora, który przetwarza kod źródłowy programu napisanego w języku programowania na równoważny kod w innym języku programowania (lub w tym samym języku, ale w innym wariancie). Transpilator różni się tym od typowego kompilatora, że zarówno wejściowy jak i wynikowy kod operuje w przybliżeniu na tym samym poziomie abstrakcji, podczas gdy tradycyjny kompilator tłumaczy z języka programowania wyższego poziomu na język programowania niższego poziomu. Inaczej niż w typowych kompilatorach, po transpilacji wynikowy kod może być nadal czytelny dla człowieka (o ile nie został dodatkowo poddany minifikacji).

Rodzaje transpilacji

edytuj

Przykładem transpilacji może być przetworzenie programu napisanego w Pythonie na JavaScript, podczas gdy tradycyjny kompilator tłumaczy z języka takiego jak C na asembler lub Java na bytecode[4]. Przetwarzanie z jednego języka na drugi może być używane np. w wypadku przenoszenia bibliotek na inny język lub tworzenia kodu w lepiej znanym środowisku. Istnieją również języki jak TypeScript, dla których transpilacja jest naturalnym procesem, ponieważ TS został zaprojektowany tak, żeby był przetwarzany i uruchamiany jako JavaScript.

Innym celem transpilacji jest tłumaczenie kodu napisanego dla starszej wersji języka na nowszy (na przykład tłumaczenie kodu pisanego w Python 2 na Python 3). Narzędzie przeprowadzi automatyczną refaktoryzację kodu, co ma ułatwić i przyśpieszyć proces przejścia na nową wersję. Wynikowy kod nie musi być jednak gotowy do bezpośredniego użycia (może wymagać ręcznych zmian).

Często spotykany jest również odwrotny proces – przetwarzanie kodu z nowszej wersji języka na język zgodny ze starszą wersją. Jest to szczególnie popularne w sytuacji gdy osoba tworząca kod nie ma wpływu na środowisko uruchomieniowe. Tak jest w przypadku tworzenia kodu dla przeglądarek internetowych, stąd popularność kompilatorów takich jak Babel przetwarzających ECMAScript 6 na wersję 5.

Mapowanie źródeł

edytuj

Transkompilatory mogą albo utrzymywać strukturę kodu przetłumaczonego jak najbliżej kodu źródłowego, aby ułatwić testowanie i debugowanie oryginalnego kodu źródłowego, lub mogą zmieniać strukturę oryginalnego kodu tak bardzo, że przetłumaczony kod nie wygląda jak kod źródłowy[5].

Istnieją jednak standardy i narzędzia, które mapują transpilowany kod źródłowy z powrotem na kod oryginalny. Przykładem może być standard JavaScript Source Map[6], który specyfikuje jak mapować kod JavaScript tak, żeby narzędzia w przeglądarce internetowej mogły pokazać oryginalny kod przy debugowaniu[7].

Lista transpilatorów

edytuj

Poniżej znajduje się lista transpilatorów, które transformują jeden język w drugi. Część z nich stanowi jedynie asystę przy migracji (np. Swiftify). Inne stawiając sobie za cel przetworzenie każdego kodu na ekwiwalent w innym języku (np. CoffeeScript). W wypadku tych drugich kod można tworzyć w jednym języku i za każdym razem budować aplikację do uruchomienia w innym języku.

Lista transpilatorów języków[4][8]
Nazwa Język źródłowy Język docelowy Komentarz
Cfront C++ C
HipHop dla PHP (HPHPc) PHP C++
CoffeeScript CoffeeScript JavaScript Jeden z pierwszych sztucznych języków, które zawsze są przetwarzane. Udostępniał on bardziej typowy system klas niż ówczesny JS, ale także kompletnie nowe konstrukcje. Wszystko z założenia miało być przetwarzane na JS i uruchamiane jako JS.
TypeScript TypeScript JavaScript TS również w pełni kompiluje się do JS. Cechą charakterystyczną jest to, że TS jest nadzbiorem JS i wygląda podobnie do składni JS z wersji ES6.
ClojureScript Clojure JavaScript
JSweet Java TypeScript
Swiftify Objective-C Swift Swiftify to internetowe narzędzie do konwersji z Objective-C na Swift. Pomaga programistom, którzy migrują całość lub część swojej bazy kodów iOS do Swift. Konwersja ma na celu przede wszystkim konwersję składni między Objective-C i Swift.
J2ObjC Java Objective-C
Emscripten C/C++ JavaScript (Wasm) Ma umożliwiać uruchamianie kodu pisanego w C / C ++ w przeglądarce. Twórcy twierdzą, że dowolny przenośny kod może zostać skompilowany do JS[9].
c2go[10] C Go Przed wydaniem 1.5 kompilator Go został napisany w C. Opracowano automatyczny translator do automatycznej konwersji bazy kodu kompilatora z C na Go[11][12]. Od Go 1.5 „kompilator i środowisko wykonawcze są teraz zaimplementowane w wersji Go i asemblerze, bez C”.
Google Web Toolkit Java JavaScript GWT ma tworzyć kod, który można uruchomić w przeglądarce, ale możliwe do użycia konstrukcje z Javy są tutaj ograniczone w porównaniu do normalnego kodu Java.
Js_of_ocaml[13] OCaml JavaScript
Lista transpilatorów wersji
Narzędzie Język źródłowy Język docelowy Komentarze
Babel ES6+ (JS) ES5 Babel ma na celu zmianę kodu z nowszej wersji na starszą do uruchomienia w starszych przeglądarkach. Zmienia głównie składnię, ale również dodaje implementacje nowych funkcji (tzw. polyfill).
Skrypt 2to3 Python 2 Python 3 2to3 robi wszystko, co w jego mocy w zakresie automatyzacji procesu tłumaczenia, często konieczne są dalsze ręczne korekty.

Zobacz też

edytuj

Przypisy

edytuj
  1. Gastón Silva, ES6 bez tajemnic. Korzystanie z ES6 z pomocą narzędzi Babel i Broccoli, Joanna Liana, Shebang.pl, 15 grudnia 2015 [dostęp 2020-01-01] (pol.).
  2. Transpilacja kodu ECMAScript 6 za pomocą Babel JS i Browserify [online], ProPHP, 15 listopada 2015 [dostęp 2020-01-01].
  3. Yakov Fain, Anton Moiseev, Angular 2. Programowanie z użyciem języka TypeScript, Lech Lachowski, Helion.
  4. a b Transpiler [online], Devopedia, 17 marca 2017 [dostęp 2020-01-01] (ang.).
  5. Martin Fowler, TransparentCompilation [online], 12 lutego 2013 [dostęp 2020-01-01].
  6. Source Map Revision 3 Proposal [online], Google Docs [dostęp 2020-01-01] (pol.).
  7. Ryan Seddon, Introduction to JavaScript Source Maps [online], HTML5 Rocks, 21 marca 2012 [dostęp 2020-01-01] (ang.).
  8. Jeremy Ashkenas, List of languages that compile to JS [online], CoffeeScript Wiki - Github [dostęp 2020-01-01].
  9. About Emscripten [online], emscripten.org [dostęp 2020-01-01].
  10. Russ Cox, C to Go translation tool supporting Go toolchain migration: rsc/c2go [online] [dostęp 2020-01-01].
  11. Go 1.5 Release Notes - The Go Programming Language [online], golang.org [dostęp 2020-01-01].
  12. Go 1.3+ Compiler Overhaul [online], Google Docs [dostęp 2020-01-01] (pol.).
  13. Js_of_ocaml [online], ocsigen.org [dostęp 2020-01-01].