Transpilator
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
edytujPrzykł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ł
edytujTranskompilatory 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
edytujPoniż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.
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 |
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ż
edytujPrzypisy
edytuj- ↑ 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.).
- ↑ Transpilacja kodu ECMAScript 6 za pomocą Babel JS i Browserify [online], ProPHP, 15 listopada 2015 [dostęp 2020-01-01] .
- ↑ Yakov Fain , Anton Moiseev , Angular 2. Programowanie z użyciem języka TypeScript, Lech Lachowski, Helion .
- ↑ a b Transpiler [online], Devopedia, 17 marca 2017 [dostęp 2020-01-01] (ang.).
- ↑ Martin Fowler , TransparentCompilation [online], 12 lutego 2013 [dostęp 2020-01-01] .
- ↑ Source Map Revision 3 Proposal [online], Google Docs [dostęp 2020-01-01] (pol.).
- ↑ Ryan Seddon , Introduction to JavaScript Source Maps [online], HTML5 Rocks, 21 marca 2012 [dostęp 2020-01-01] (ang.).
- ↑ Jeremy Ashkenas , List of languages that compile to JS [online], CoffeeScript Wiki - Github [dostęp 2020-01-01] .
- ↑ About Emscripten [online], emscripten.org [dostęp 2020-01-01] .
- ↑ Russ Cox , C to Go translation tool supporting Go toolchain migration: rsc/c2go [online] [dostęp 2020-01-01] .
- ↑ Go 1.5 Release Notes - The Go Programming Language [online], golang.org [dostęp 2020-01-01] .
- ↑ Go 1.3+ Compiler Overhaul [online], Google Docs [dostęp 2020-01-01] (pol.).
- ↑ Js_of_ocaml [online], ocsigen.org [dostęp 2020-01-01] .