Java 9 - co to jest JShell i dlaczego warto używać REPL-a w Javie
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 🐧:
|
|
- możliwość zapisywania sesji do pliku i uruchamiania sryptów />
|
|
- 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ć:
- Co się zmieniło w Javie po wersji 7
- Java 9 - Praktyczy przykład: trzy moduły
- Java 9 - czy mogę stworzyć z mojej aplikacji binarkę?
Inne źródła:
- Robert Field JShell tutorial
- Esteban Herrera’s JShell three part guide
Ten wpis jest częścią serii java.
- 2021-09-12 - Java 18: co nowego? - przegląd JEP-ów
- 2021-21-09 - Java 17 - RandomGenerator i spółka
- 2021-15-09 - Java 17 - co nowego?
- 2021-04-03 - Java 15 - czym są sealed classes?
- 2021-26-02 - Java 13 i 14: Bloki tekstowe i rekordy
- 2021-24-02 - Java 12 - wyrażenie switch (preview feature)
- 2021-23-02 - Java 11 - HTTP Client i uruchamianie jednoplikowych programów
- 2021-18-02 - Java 9 - co to jest JShell i dlaczego warto używać REPL-a w Javie
- 2021-12-02 - Java 10 - var, nowe metody w Optional, kolekcje "unmodifiable"
- 2021-11-02 - Java 9 - nowości w bibliotece
- 2021-10-02 - Java 9: czy mogę stworzyć z mojej aplikacji binarkę?
- 2021-10-02 - Java 9: praktyczny przykład - trzy moduły
- 2021-08-02 - Java 8: praktyczny przykład - przewidywanie kolejnej daty w serii