Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

TypeScript czyli typowana wersja JavaScript

JavaScript powoli staje się najpopularniejszym językiem programowania. Nie posiada on składni, która górowałaby nad innymi językami. Maszyny wirtualne JavaScriptu są mniej wydajne niż JVM, a tym bardziej kod natywny. A jednak zastosowanie JavaScript z roku na rok zwiększa się. Już nie tylko stanowi jedyny język działający w przeglądarkach, ale również możemy używać go wszędzie tam gdzie nie potrzebna jest super wydajność. Frameworki takie jak NodeJS umożliwiają jego wykorzystanie po stronie serwera. Coraz częściej aplikacje wyglądające podobnie do natywnych są w rzeczywistości napisane w JavaScript. Przykładowo aplikacje Qt5 możemy oprogramować używając wyłącznie JS, podczas gdy wygląd opisujemy w formacie JSON. Microsoft również bardzo dobrze wspiera pisanie aplikacji w tym języku. Dość szybko zaczyna się spełniać interpretacja programistycznej zasady najmniejszej energii (Rule of least power ) Jeffa Atwooda, mówiąca, że wszystko co da się napisać w JavaScript zostanie w nim napisane.

Dart od Google

Mimo to trudno znaleźć wielu programistów, którzy zachwycaliby się składnią JavaScript. Język ten jest bardzo ekspresyjny, jednak jego składnia, a w szczególności paradygmat obiektowy, odbiega od tego do czego jesteśmy przyzwyczajeni w najbardziej popularnych językach. Innym problemem jest brak typowania, które pozwala na wykrywanie wielu błędów już na poziomie kompilacji, bez konieczności pisania olbrzymiej ilości testów jednostkowych. Te i inne problemy są widoczne dla większości osób i firm zaangażowanych w rozwój standardów webowych. Dlatego też prace nad nowym standardem ECMAScript 6 stanowiących podstawę implementacji JavaScript w silnikach przeglądarek były bardzo długie (ostateczne zakończenie ich planuje się na czerwiec br.). Debatujący nie mogli zgodzić się co do kierunku w jakim powinny pójść zmiany. Google chciało bardzo poważnych zmian, jednak wiele innych firm wolało nie robić rewolucji, tak aby dawna wersja JavaScript była kompatybilna wstecznie z nową. Wynikiem niezadowolenia Google było opracowanie języka Dart będącego wizją tego czym powinien być JavaScript. Dart miał pojawić się w Chrome jako drugi język skryptowy. Obecnie wiemy, że plany te zostały zmienione i wycofano zupełnie się z tego pomysłu. Język ma niby być rozwijany dalej, ale już wiadomo, że Google ma zupełnie inny pomysł na JavaScript i można się obawiać o dalszy rozwój Darta.

Microsoft ma dobre pomysły?!

Swoją wizję co do przyszłości JavaScriptu przedstawił też Microsoft. Nie chciał on zbyt dużych rewolucji w samym języku, ale równocześnie widział jego mankamenty. Inżynierowie tej firmy, wpadli na bardzo ciekawy pomysł. Założyli, że napiszą kompilator do języka, który będzie kompilowany do JavaScript. Język ten nazwali TypeScriptem i jak sama nazwa wskazuje miał dostarczyć opcjonalne typowanie. Dart posiada tę samą możliwość jednak jako dodatek i cecha przejściowa, ponieważ docelowo miał być interpretowany bezpośrednio w przeglądarce. Microsoft nic takiego nie planował. Najważniejsze jednak w tym wszystkim (sam pomysł kompilacji to nic nowego, bo tak działa chociażby lubiany przez wielu CoffeeScript), że ma on działać w ten sposób, że każdy kod TypeScripta może zawierać kod czystego JavaScript. Możemy więc nie tylko dopisywać do kodu tego pierwszego kod tego drugiego, ale możemy też z założenia korzystać ze wszystkich bibliotek JavaScript. W drugą stronę bez problemu możemy korzystać z wszystkich plików napisanych w TypeScript, ale oczywiście po skompilowaniu. Konieczność kompilacji wydaje się dużym utrudnieniem, ale mając odpowiednie narzędzia nie stanowi, żadnego problemu. Najlepszym rozwiązaniem w tym przypadku jest kompilacja do JS przy każdym zapisie pliku.

r   e   k   l   a   m   a

Pomysł tego projektu od razu wydawał się świetny, ale jego realizacja mogła być trudna. Microsoft od razu zaplanował otwartość tego projektu. Kod jest dostępny na licencji Apache 2, posiadającej klauzulę mówiącą o tym, że piszący zrzeka się wszelkich własnych licencji w stosunku kodu, który napisał, a które ten kod mógłby naruszać. Nie ma więc mowy, że miałby to być tzw. prezent na gumce. Również realizacja pomysłu okazała się bardzo dobra. Wystarczy porównać kod kompilowany przez TypeScript Compiler (tsc) do tego z Darta, aby przekonać się, że efekt jest niesamowicie dobry. Kod po skompilowaniu bez problemu można czytać i nie zawiera, żadnych nadmiarowych elementów. Kod jaki wypluwa Dart jest zaś ciężkim do zrozumienia blobem. Nie wynika to tylko z jakości pracy inżynierów, ale przede wszystkim z przyjętych założeń projektowych. Efekt jest taki, że do pomysłu przekonało się Google. Zamierza ono bardzo intensywnie korzystać z TypeScripta. Zapowiedziano przepisanie niektórych bibliotek na ten język, w tym super popularnego ostatnio frameworka AngularJS. Wiele pomysłów Microsoftu skończyło się tragicznie (zapewne nie więcej niż w innych korporacjach - wystarczy porównać do Google), często zdarzało się, że forsował on własne standardy próbując zdominować inne firmy. Jednak w tym przypadku firma pokazała na prawdę wysoką klasę, dając społeczności świetne narzędzie, a równocześnie nie zamykając go dla swojej konkurencji. Co za czasy nastały!

Składnia TypeScript

Język ten dostarcza programiście typowanie zmiennych, argumentów i funkcji, klasyczny sposób tworzenia obiektów wraz z dziedziczeniem i interfejsami, moduły i typ wyliczeniowy oraz szereg innych udoskonaleń.
Przykładowy kod:


class Zespolona {
  im : number;
  re : number;
  constructor ( im: number, re: number) {
    this.im = im;
    this.re = re;
  }
  getMod() : number {
    return Math.sqrt(this.im*this.im + this.re*this.re );
  }
  add(zes : Zespolona): Zespolona {
    this.im += zes.im;
    this.re += zes.re;
    return this;
 }
  sub =  (zes : Zespolona) : Zespolona => {
    this.im -= zes.im;
    this.re -= zes.re;
    return this;
  }

  toString() {
    return "Zespolona: rzeczywista " + this.re + " urojona " + this.im;
  }
}

var z1 = new Zespolona(23.34, 34.43);
var z2 = new Zespolona(12.34, -34.43);
console.log("zespolona moduł z sumy: " + z1.add(z2).getMod());
console.log("Różnica " + z1.sub(z2));

Typowanie jak widać odbywa się podobnie do Pascala i Scali po dwukropku i jest opcjonalne. Możemy przeładowywać metody i nadpisywać je. Metoda sub jest przykładem cukru syntaktycznego umożliwiającego uproszczenie zapisu funkcji, a w zasadzie jest zapisem funkcji anonimowej.

Edycja, kompilacja kodu i uruchomienie.

Obecnie chyba najlepszym narzędziem do pisania w TypeScript jest Visual Studio. Jednak inne firmy jak np. JetBrains również podjęły się zapewnieniu wsparcia dla tego języka. Sam do pisania w TypeScript użyłem Atom IDE, który potrafi całkiem nieźle podpowiadać składnie. W Ubuntu wystarczy dodać repozytorium webupd8 i zainstalować go za pomocą apt-get. Warto upewnić się czy mamy zainstalowane nodejs, nodejs-legacy i npm. Następnie za pomocą apm (menadżer instalacji wtyczek Atoma) doinstalowujemy pakiet typescript:

apm install atom-typescript

Jeśli nie chcemy również kompilować w konsoli ściągamy kompilator poprzez npm:

npm install typescript

jest to również konieczne, aby utworzyć plik konfiguracyjny tsconfig.js.
Jeśli uruchomimy z sudo i flagą -g damy dostęp również innym użytkownikom, a my nie będziemy musieli podawać ścieżki do kompilatora.
Kompilacja odbywa się poprzez użycie programu tsc:

tsc plik.ts

(gdy nie zainstalowaliśmy globalnie, podajemy ścieżkę do tsc - w katalogu node_modules) i uruchamiamy za pomocą nodejs:

node plik.js

Wtyczka atom-typescript automatycznie kompiluje pliki ts jeśli do plku konfiguracyjnego dodamy linię:

"disableCompileOnSave": false,

Niestety często zdarza się, że nie chce kompilować świeżo dodanego pliku, aż do restartu.

Podsumowanie

O powstaniu projektu TypeScript wiedziałem już niedługo po jego powstaniu. Od razu wydawał mi się dużo sensowniejszym podejściem do problemu niż to co prezentowało Google. Nie od razu jednak wyglądało na to, że język i jego narzędzia spopularyzują się gdzieś indziej niż tylko jako dodatek do Visual Studio. Teraz jednak wydaje się, że przed tym językiem rysuje się wielka kariera. Dla programistów to dobre rozwiązanie eliminujące szereg słabości JavaScriptu, a przy tym niewymuszające na nikim jego stosowanie. Koszmar programistów nie kochających JavaScript coraz bardziej się spełnia, ale za to JavaScript może mieć, jak się okazuje bardziej ludzką twarz ;)

PS. Wygląd kodu z przykładu po kompilacji:

var Zespolona = (function () {
    function Zespolona(im, re) {
        var _this = this;
        this.sub = function (zes) {
            _this.im -= zes.im;
            _this.re -= zes.re;
            return _this;
        };
        this.im = im;
        this.re = re;
    }
    Zespolona.prototype.getMod = function () {
        return Math.sqrt(this.im * this.im + this.re * this.re);
    };
    Zespolona.prototype.add = function (zes) {
        this.im += zes.im;
        this.re += zes.re;
        return this;
    };
    Zespolona.prototype.toString = function () {
        return "Zespolona: rzeczywista " + this.re + " urojona " + this.im;
    };
    return Zespolona;
})();
var z1 = new Zespolona(23.34, 34.43);
var z2 = new Zespolona(12.34, -34.43);
console.log("zespolona moduł z sumy: " + z1.add(z2).getMod());
console.log("Różnica " + z1.sub(z2));

 

internet programowanie

Komentarze