Spis treści

Java 9 - co to jest JShell i dlaczego warto używać REPL-a w Javie

Ilustracja - monitor z jshell

dupa

Wprowadzenie

Java 9 przyniosła ze sobą jeszcze jedno narzędzie, które doskonale znają programiści innych języków (szczególnie języków z dynamicznym typowaniem; czym się różni typowanie statyczne od dynamicznego) - jest to REPL o nazwie JShell.

Co to jets REPL

REPL to skrót od angielskiego Read-Eval-Print-Loop, czyli w wolnym tłumaczeniu: Pętla Czytania-Wykonywania-Wypisywania. Jest to zwykle dość prosty program uruchamiany z wiersza poleceń, którego zadaniem jest wczytywanie poleceń/kodu od użytkownika, wykonywanie go, wypisywanie wyniku, i znów: wczytywanie, wykonywanie, wypisywanie, i tak w kółko, czyli w pętli. Środowiska działające w ten sposób nazywa się często “powłokami” (shell), a pojęcie REPL dotyczy zwykle środowisk związanych z wykonywaniem kodu w jakimś języku programowania. Najczęściej REPL-e towarzyszą językom skryptowym (zwykle dynamicznie typizowanym), choć np. ghci jest interpreterem statycznie typizowanego Haskella.

Gdzie jest jakiś REPL?

REPL-e są wszędzie wokół :) REPL-em jest przecież:

  • Twoja powłoka (shell) w *nixie albo okienko “cmd” w Windowsie
  • środowiska online takie jak repl.it, jsfiddle.net czy jsbin.com
  • interpretery języków programowania: Python, JavaScript (konsola w przeglądarce), Ruby, Clojure, Lisp itd.
  • notebooki Jupitera
  • ipython

Dlaczego używamy REPL-a?

Przede wszystkim ze względu na to, że - w przeciwieństwie do kodu zapisanego w pliku, a następnie kompilowanego, pakowanego, dystrybuowanego i deployowanego - w REPL-u otrzymujemy szybką informację zwrotną. Nasz mózg nie musi czekać na zakończenie całego długiego cyklu od zapisania idei w kodzie do weryfikacji poprawności jego działania w rzeczywiskości (podczas którego czekający mózg może się wyłączyć, odpłynąć czy zająć czymś innym, a nawet zapomnieć, co przed chwilą robił). Od razu otrzymuje “nagrodę” w postaci odpowiedzi (wyniku uruchomienia polecenia). Natychmiastowa gratyfikacja mile łechce nasze ośrodki przyjemności, daje poczucie “przepływu”, a więc jesteśmy w stanie “flow” i nie jest nas łatwo wytrącić ze stanu skupienia, bo na nic nie czekamy, jesteśmy w pełni skupieni na zadaniu. Skracamy czas od momentu pojawienia się pomysłu do jego uchwycenia w ramy działającego kodu. W przypadku klasycznego, długiego cyklu takie “uchwycenie” może się nie udać, a sam pomysł szybko się gdzieś ulotni.

Kolejny powód jest również psychologiczny w swojej naturze: lubimy pozytywne rezultaty naszych działań, a te tworzą w mózgu silne wzmocnienia: chcemy używać narzędzi, z których umiemy korzystać. Wzmocnienie w przypadku REPL-a jest dużo mocniejsze niż w przypadku klasycznego IDE, ponieważ częściej dzieją się rzeczy pozytywne: co chwilę przecież udaje nam się rozwiązać jakis mikro-problem.

W skrócie, używamy REPL-a, ponieważ:

  • daje szybką odpowiedź zwrotną, więc nie rozpraszamy się czekając
  • pozwala skupić się na zadaniu i rozwiązywać go małymi kroczkami
  • umożliwia eksplorację różnych wariantów rozwiązania

Najczęstsze konteksty uzycia

Myślę, że istnieje kilka sytuacji, w których korzystanie z REPL-a jest bardzo korzystne. Należą do nich:

  • nauka nowego języka programowania
  • szybkie prototypowanie rozwiązania
  • wypróbowywanie API bibliotek
  • projektowanie pojedynczych funkcji i podejmowanie decyzji dotyczących nowego API
  • sprawdzanie, czy napisana w kodzie “produkcyjnym” fukcja/klasa działa zgodnie z zamierzeniem/specyfikacją

Ostatni punk powyżej sugeruje, że REPL może zniechęcić do pisania testów jednostkowych. Rzeczywiście, początkowo tak się może wydawać. Można przecież łatwo dojść do wniosku, że skoro w REPL-u kod działa, to po co jeszcze utrwalać go w postaci testu. Ano dlatego, że taki test będzie stanowił przykład użycia i dokumentację intencji, a fakt, że mogę szybko taki test napisać i uruchomić, stanowi dodatkowy argument za tym, żeby takich testów pisać więcej.

Co to jets JShell

JEP-222

JShell jest nowym narzędziem wiersza poleceń wprowadzonym w Javie 9 (szczegóły: JEP-222).

Podręcznik uzytkownika

Miejsce, od którego należy zacząć, to podręcznik użytkownika.

Do najbardziej interesujących jego fragmentów należą:

  • edycyjno-nawigacyjne skróty klawiszowe - jeśli ktoś używał wiersza poleceń pod linuksem albo Emacsa, będzie się czuł w domu:
  • Ctrl-R, Ctrl-S - szukanie w historii wstecz/do przodu
  • Ctrl-X (, Ctrl-X ) , Ctrl-X e - rozpoczęcie, zakończenie i uruchomienie makra
  • Ctrl-A, Ctrl-E - przejście na początek/koniec linii />
  • Alt-B, Alt-F - przejście jedno słowo do tyłu/do przodu
  • Ctrl-K - usuwa od kursora do końca wiersza
  • Alt-D - usuwa od kursora do końca słowa
  • Ctrl-W - usuwa od kursora do poprzedniej spacji
  • Ctrl-Y - wstawia ostatnio usunięty tekst
  • możliwość ustawienia własnego prompta, na przykład… pingwinka 🐧:
1
2
3
4
5
/>
jshell> /set mode mm -command
jshell> /set prompt mm "\n🐧 " " ...>"
jshell> /set feedback mm
🐧
1
2
3
4
5
6
7
🐧 /save -history ~/dev/session.jsh
🐧 /exit
# inne sprawy
$ jshell
jshell> /open ~/dev/session/jsh
🐧
/>
  • możliwość edytowania poszczególnych snipetów (np. funkcji) w edytorze zewnętrznym
  • możliwość włączania ścieżek zewnętrznych klas oraz ścieżek modułów do sesji
  • możliwość wygenerowania z bieżącego wyrażenia zmiennej (Shift-Tab-v), metody (Shift-Tab-m) albo automatyczne dodanie importu (Shift-Tab-i)

Dlaczego warto używać REPL-a w Javie

  • szczególne przypadki użycia, inne niż IDE: testy, badanie możliwości
  • brak konieczności deklarowania klasy, kompilowania; szybka pętla
  • domyśle importy pod skrótem
  • szybki, szczególnie przy inferencji typów (od jdk 10)
  • możliwość dodawania modułów bądź bibliotek do classpat
  • szybsze narzędzie niż IDE, mniejsza zajętość pamięci
  • możliwość pisania skryptów w prawie-javie (wersja Java 11 pozwala na uruchamianie jednoplikowych programów bez etapu jawnej kompilacji)

Na pewno warto się chwilę pobawić i bliżej JShella poznać - będzie jedno narządko więcej w pudełku inżyniera.

Podobne artykuły

Mogą Cię również zainteresować:

Inne źródła: