Pierwsze spojrzenie na składnię

Kotlin posiada słowo kluczowe fun do definiowania funkcji, Scala używa słowa def, a Java… W Javie nie ma słowa kluczowego. Ponadto – w Javie tworząc zmienną, jej typ jest po lewej stronie np:

int a = 20;

Ale już Scala i Kotlin mają konwencję odwrotną i najpierw mamy słowo kluczowe, potem nazwę zmiennej, a dopiero na samym końcu typ:

 val a: Int = 20 // dla Kotlina
var a: Int = 20 // dla Scali

Między nimi jednak też są istotne różnice. 

Ponadto te trzy języki programowania prezentują różne paradygmaty programowania. Java jest mocno obiektowa pomimo ogromnej liczby zabiegów ze strony twórców próbujących wkładać z nią elementy funkcyjne. Inaczej ma się sprawa z Kotlinem i Scalą – tutaj mamy już elementy nie tylko obiektowe, ale też funkcyjne, a nawet imperatywne! 

W takim razie….

Gdzie jest element łączący te języki?

Spoiwem tych trzech technologii jest sposób uruchamiania kodu – każdy z tych trzech języków do uruchamiania programu wykorzystuję coś co nazywamy kodem pośrednim (ang. bytecode). Na pewno widzieliście tajemnicze pliki *.class? To właśnie o nich teraz mówimy. I to właśnie one pojawiają się w każdym w tych języków.

Kod pośredni to taki język programowania, który już jest znacznie mniej czytelny dla programisty niż wspomniane wcześniej języki. Wprowadzenie go pozwala na szereg optymalizacji, ale przede wszystkim jest on jeden i ten sam dla każdego systemu operacyjnego, co sprawia że programy pisane w tych językach są przenośne pomiędzy różnymi systemami. 

Popatrzmy na chwilę na język C++ – tutaj sytuacja z uruchomieniem wygląda tak, że musimy kod skompilować, tzn. cały zamienić na jego reprezentację binarną i wtedy możemy ją uruchomić. Niestety jeśli chcemy uruchomić skompilowany kod na innym systemie – to niestety się to nie uda – trzeba kompilować od początku, a uwierzcie – ten proces spokojnie może trwać kilka godzin. 

W językach opartych na kodzie pośrednim następuje kompilacja naszych programów do owego kodu pośredniego i tak skompilowany program jest nadal przenośmy. Jesteśmy w stanie spokojnie go uruchomić a to dzięki programowi który nazywa się….

Wirtualna maszyna Javy (JVM)

Program ten to ekosystem pozwalający na uruchomienie kodu pośredniego niezależnie od architektury procesora czy systemu operacyjnego. Poza oczywistą funkcją uruchamiania kodu dokonuje on szereg optymalizacji, które zdejmują z programisty konieczność pewnych rzeczy, np.

  • jeśli JVM (a dokładniej jego komponent – JIT) nie znajdzie jawnego przypisania nulla do obiektu – po prostu wytnie takiego ifa, który dokładnie ten warunek sprawdza, ponieważ kod w nim nie ma prawa się wykonać. Oszczędza to ilość skoków do podprogramów.  
  • podstawi w miejsce wielokrotnego odczytu tej samej zmiennej po prostu jej wartość, co wyeliminuje konieczność sięgania do rejestrów procesora 
  • rozwinie pętle – to znów pozwoli na mniejszą ilość skoków
  • jeśli funkcja jest krótka to w miejsce jej wywołania JIT podstawi jej ciało – to znów powoduje że procesor nie musi skakać do podprogramu 

i naprawdę – wiele, wiele innych ciekawych rzeczy.
Więcej ciekawostek na ten temat możecie usłyszeć, np. na YouTube.

Jak wygląda taki kod pośredni 

Kod pośredni wygląda np. tak:

i dodaje on do siebie dwie liczby – 15 i 20. A wynik wyświetla na ekranie. 

Konkluzje

Jak widać, z pozoru odległe od siebie języki programowania mogą być w rzeczywistości dokładnie tym samym. Technika którą przedstawiłem nie jest nowa i nie jest dedykowana tylko dla języków “Javowych” – możemy ją spotkać chociażby w .Necie gdzie nosi nazwę CIL (Common Intermediate Language). Mimo innej nazwy – pomysł i efekty są takie same.

Mateusz Mazurek

„Programista z ponad 7letnim doświadczeniem budowanym na językach takich jak Java, Python, PHP, JavaScript, SQL czy nawet Elixir. Entuzjasta rozumienia tego jak działają mechanizmy z których na co dzień korzystamy i tego jak możemy tę wiedzę przekuć w solidnie działające oprogramowanie. Od 10 lat, z różną intensywnością, prowadzę bloga https://mmazurek.dev. Jeśli nie zajmuję się niczym związanym z programowaniem, to najczęściej czytam książki, jeżdżę na rowerze czy po prostu siedzę ze znajomymi.”