Java a JavaScript, czy takie różne?

Języki Java i JavaScript często są ze sobą mylone. Nie raz zdarzyła nam się sytuacja, gdzie dostawaliśmy pytania, w których ktoś pytał o kursy na przemian pytając o jedno i drugie nie widząc między nimi różnicy. Również niektórzy rekruterzy mają z tym problem i np.w ogłoszeniach związanych z JavaScriptem dodają logo Javy. Jest nawet taki żart...

Żeby nauczyć się Javy najlepiej najpierw nauczyć się JavaScriptu i później oduczyć się Scriptu

java javascript typescript

Może coś w nim jest? Czy Java i JavaScript aż tak bardzo się od siebie różnią?

Jak to było kiedyś

W przeszłości istniał bardzo prosty podział. Java była technologią z ogromnym ekosystemem i dedykowana była głównie do rozwiązań biznesowych, tworzenia tzw. backendu, czyli części aplikacji działającej po stronie serwera. JavaScript był językiem, który stanowił uzupełnienie strony wizualnej stron internetowych, pozwalał dodać do nich animacje i trochę dynamiki, dzięki czemu strony wydawały się przyjemniejsze, rzadziej się przeładowywały. Z punktu widzenia samego języka Java oparta była wyłącznie na fundamentach programowania obiektowego, czyli pojęciach takich jak klasy, interfejsy i obiekty. JavaScript oparty został na odmiennych założeniach, łączył paradygmat programowania obiektowego oraz funkcyjnego, próżno było jednak szukać w nim klas, czy interfejsów, zamiast tego mieliśmy dziedziczenie oparte jest o prototypy. Największą różnicą jest jednak do dziś statyczne typowanie w Javie vs dynamiczne typowanie w JavaScripcie. W skrócie w Javie musimy powiedzieć, że jeśli przypisujemy coś do x, to ten x jest np. liczbą. W JavaScripcie do x można przypisać dowolną wartość bez mówienia, czym ten x jest. Jedno i drugie podejście ma swoje wady i zalety, zazwyczaj ktoś dla kogo Java jest głównym językiem nie za bardzo lubi dynamiczne typowanie, a dla kogoś, kto używa głównie JS nie potrafi sobie wyobrazić programowania bez tej funkcjonalności.

Jak to jest dziś

Zarówno Java, ale szczególnie JavaScript przebyły daleką drogę i dziś znacznie różnią się od tego jak wyglądały kiedyś, jednocześnie zbliżając się ku sobie. Java doczekała się największych zmian w wersji 8, gdzie przedstawiono wsparcie dla programowania funkcyjnego w oparciu o konstrukcje takie jak interfejsy funkcyjne i wyrażenia lambda. Wiele rzeczy można dzięki temu zapisać dużo krócej, bardziej ekspresywnie, a dzięki temu wiele rzeczy udało się uprościć. JavaScript z kolei poszedł w odwrotnym kierunku, standard EcmaScript, którego JavaScript jest najpopularniejszą implementacją wprowadził w wersji 2015 (zwaną ES6, później ES2015) klasy, czy dziedziczenie oparte o rozszerzanie klas, a nie prototypów. Dodano również nowe kolekcje jak zbiory, czy mapy, które w Javie istnieją od bardzo dawna (wersja 1.5). JavaScript zaczął być również stosowany poza frontendem i dziś można w zasadzie napisać kompletną aplikację (backend + frontend) korzystając tylko z tego języka. Powstają rozbudowane frameworki jak Angular, React, które sprawiają, że JavaScript jest dziś traktowany dużo poważniej niż jakieś 10 lat temu. Powstał także język o nazwie TypeScript, który jest rozszerzeniem standardu ES2015. Oprócz klas znajdziemy tutaj także interfejsy, typy generyczne i wyliczeniowe, ale przede wszystkim statyczne typowanie, które pozwala znacznie uodpornić kod na błędy jeszcze na etapie kompilacji (kod napisany w TypeScript musi być transpilowany do JavaScriptu, aby mógł być uruchomiony). Sprawia to, że JavaScript (a szczególnie TypeScript) wyraźnie podążają w kierunku Javy (i C#), natomiast obserwując Javę można zauważyć pewne ruchy, które co prawda w dużo mniejszym, ale jednak widocznym stopniu przybliżają Javę do JavaScriptu (np. zapowiadane wprowadzenie słowa kluczowego var w Javie 10, które pozwoli na "prawie dynamiczne typowanie"). Poniżej porównanie kilku próbek kodu. Java

TypeScript

class Product {
    private name: string;
    private price: number;

    constructor(name: string, price: number){
        this.name = name;
        this.price = price;
    }
}

TypeScript (krócej)

class Product {
    constructor(private name: string, private price: number){}
}

JavaScript (ES2015)

class Product {
    constructor(name, price) {
        this.name = name;
        this.price = price;
    }
}

JavaScript (ES5)

var Product = (function () {
    function Product(name, price) {
        this.name = name;
        this.price = price;
    }
    return Product;
}());

Jeżeli jako programista Java próbowaliście kiedyś poznać JavaScript i język ten was obrzydził tworzeniem konstrukcji takich jak ostatni fragment kodu powyżej, brakowało wam klas, kolekcji, to warto dać mu drugą szansę. Jeśli nie możecie żyć bez statycznego typowania, to szczególnie TypeScript jest ciekawym językiem, który dla typowego Javowca powinien być bardzo naturalny.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.