Programiranje

Kaj REPL pomeni za Javo

Morda ste razvijalec omare Clojure ali Scala ali ste v preteklosti že sodelovali z LISP. Če je tako, obstaja velika verjetnost, da ste REPL uporabili kot del svoje vsakodnevne rutine. REPL, ali read-eval-print-loop, je lupinski vmesnik, ki prebere vsako vrstico vnosa, oceni to vrstico in nato natisne rezultat. Takojšnje povratne informacije, lepo!

Ko uporabljate REPL, kodo pišete interaktivno in jo takoj izvedete. Izdanje Java 9 v letu 2016 bo prineslo popolnoma funkcionalno okolje REPL z imenom JShell (s kodnim imenom Kulla). Ta članek vsebuje pregled Java REPL in nekaj možnosti, kako ga lahko uporabite pri programiranju Java - ja, vi!

Počakajte, Java že nima REPL-a?

Zagotovo mora uveljavljeni jezik, kot je Java, imeti REPL! No, pravzaprav jih nimajo vsi jeziki in Java je ena tistih, ki jo je pogrešala. Verjetno je Java z več slovesnostmi in vzorci kot večina jezikov eden izmed jezikov, ki so si ga razvijalci najbolj zaslužili. Java je že nekaj časa imela nekaj podobnega REPL-u v obliki Java BeanShell, vendar ta projekt nikoli ni bil popolnoma predstavljen REPL, enak kot pri drugih jezikih. Bila je le podmnožica celotne sintakse jezika Java.

REPL zmanjšuje preobrat

Čim bolj skrajšati čas obračanja in povratne zanke je izjemno pomembno za razvitost razvijalca. REPL je odlično orodje za razvijalce, ki želijo doseči ravno to. Razvijalci so najbolj produktivni, ko lahko takoj vidijo rezultate svojega dela. Z Java REPL lahko razvijalci napišejo kodo, jo izvršijo in nato še naprej razvijajo svojo kodo sproti, ne da bi morali zapreti izvedbo gradnje in tako naprej. Medtem ko mnogi sistemi, ki uporabljajo Javo, presegajo kompleksnost tistega, s čimer bi se lahko ukvarjal interaktivni REPL, že sama prisotnost REPL v JDK pomeni, da bo nekdo zanj v kratkem času našel neverjeten primer uporabe. Dejstvo, da JShell izpostavlja API, v bistvu zagotavlja, da bodo razvijalci IDE vključili ta REPL v orodja, ki jih uporabljamo za pisanje kode. Samo počakajte, da je Java REPL del vsakega IDE!

Začnite z JShell

Pomembno se je zavedati, da uporaba projekta REPL, ki je v razvoju, Project Kulla, ni za tiste s srcem. Kulla, aka JShell v času pisanja ni del predogleda svežnja JDK 9, zato boste morali klonirati projekt Mercurial, sestaviti JDK in sami sestaviti JShell. Za ta postopek si vzemite eno uro, še posebej, če običajno ne mečite po izvorni kodi JDK. Opozorila boste morali onemogočiti kot napake in če gradite na OSX, se prepričajte, da ste za knjižnico freetype namestili XCode skupaj z XQuartz. Sledite spodnjim navodilom za namestitev in zagon Project Kulla v vašem razvojnem okolju Java.

1. Namestite Java 9

Če želite zagnati JShell, boste morali prenesti in namestiti najnovejšo različico predogleda za zgodnji dostop za Javo 9. Ko prenesete Javo 9, nastavite JAVA_HOME spremenljivka okolja in zaženi java –verzija za preverjanje namestitve. To je lahko težava, zlasti pri OSX, zato je vredno dvakrat preveriti!

2. Namestite Mercurial in Project Kulla

Project Kulla je projekt OpenJDK, zato boste morali klonirati odlagališče Mercurial, da ga boste sestavili.

Nato boste klonirali repozitorij Kulla:

 klon hg //hg.openjdk.java.net/kulla/dev kulla 

Nato boste konfigurirali gradnjo:

 cd kulla bash ./configure --disable-warnings-as-napake naredijo slike 

3. Sestavite in zaženite REPL

Tu je koda za sestavljanje REPL:

 cd langtools / repl; bash ./scripts/compile.sh 

In tukaj je koda za zagon:

 bash ./scripts/run.sh 

Kot sem že omenil, funkcija REPL Java še ni pripravljena za splošno uporabo, vendar jo lahko vseeno vzamemo za zgodnjo testno vožnjo!

Ti računaš

Za začetni primer tega, kar lahko naredi JShell, ocenimo nekaj preprostih izrazov z uporabo java.lang.Math:

Seznam 1. Ocenjevanje matematičnih izrazov z REPL

 $ bash ./scripts/run.sh | Dobrodošli v JShell - različica 0.710 | Vnesite / pomoč za pomoč -> Math.sqrt (144.0f); | Vrednost izraza je: 12,0 | dodeljena začasni spremenljivki $ 1 tipa double -> $ 1 + 100; | Vrednost izraza je: 112,0 | dodeljena začasni spremenljivki $ 2 tipa double -> / vars | dvojni $ 1 = 12,0 | dvojni $ 2 = 112,0 -> dvojni val = Math.sqrt (9000); | Dodana spremenljivka val tipa double z začetno vrednostjo 94,86832980505137 

Tu ocenjujemo izraze, poiščemo kvadratni koren števila in nato skupaj seštejemo dve številki. To ni najbolj zapletena koda, vendar upoštevajte, da / vars ukaz nam daje možnost naštevanja spremenljivk, ustvarjenih v seji JShell. Na vrednosti nedodeljenih izrazov se lahko sklicujemo z zapisom dolarskega znaka ($). Na koncu lahko ustvarimo novo spremenljivko in ji dodelimo vrednost.

Določite metodo

Zdaj postaja bolj zanimivo. V tem primeru definiramo metodo za izračun Fibonaccijevega zaporedja. Ko je metoda definirana, preverimo, katere metode so definirane z / metode ukaz. Na koncu izvedemo delček kode, ki se vrti skozi matriko in izpišemo prvih nekaj števil v zaporedju.

Seznam 2. Izračunajte Fibonaccijevo zaporedje

 $ bash ./scripts/run.sh | Dobrodošli v JShell - različica 0.710 | Vnesite / pomoč za pomoč -> dolgi fibonači (dolga številka) >> if ((število == 0) | Dodana metoda fibonacci (dolga) -> / metode | fibonacci (dolga) dolga -> fibonači (12) | Vrednost izraza je : 144 | dodeljeno začasni spremenljivki $ 1 tipa long -> int [] matrika = {1,2,3,4,5,6,7,8}; | Dodano spremenljivo polje tipa int [] z začetno vrednostjo [I @ 4f4a7090 -> for (long i: array) {System.out.println (fibonacci (i));} 1 1 2 3 5 8 13 21 

V isti seji JShell lahko na novo definiram definicijo metode Fibonacci in izvedem isto kodo. Na ta način lahko REPL uporabite za hitro izvajanje, spreminjanje in preizkušanje novih algoritmov.

Seznam 3. REPL za ponovno uporabo

 -> dolgi fibonači (dolga številka) {>> return 1; >>} | Spremenjena metoda fibonacci (long) -> for (long i: array) {System.out.println (fibonacci (i)); } 1 1 1 1 1 1 1 

Določite razred

Naslednji primer prikazuje, kako v JShell definirati celoten razred in se nato sklicevati na ta razred v izrazu - vse ne da bi zapustili REPL. Zmožnost dinamičnega ustvarjanja in preizkušanja kode vam omogoča hitro eksperimentiranje in ponavljanje z novo kodo.

Seznam 4. Dinamična definicija razreda

 MacOSX: repl tobrien $ bash ./scripts/run.sh | Dobrodošli v JShell - različica 0.710 | Tip / pomoč za pomoč -> razred Oseba {>> javno ime niza; >> javni int starost; >> javni opis niza; >> >> javna oseba (ime niza, starost, opis niza) {>> this.name = ime; >> this.age = starost; >> this.description = opis; >>} >> >> javni String toString () {>> return this.name; >>} >>} | Dodan razred Oseba -> Oseba p1 = nova oseba ("Tom", 4, "Likes Spiderman"); | Dodana spremenljivka p1 tipa Oseba z začetno vrednostjo Tom -> / vars | Oseba p1 = Tom 

Čeprav je zmožnost dinamičnega definiranja razredov zmogljiva, razvijalci ne zahtevajo pisanja velikih, večvrstičnih definicij v interaktivno lupino. Tu je koncept zgodovino in začetek nalaganja in shranjevanja stanja REPL postaja pomemben. Z / zgodovina ukaz lahko navedete vse trditve in izraze, ocenjene v REPL.

Seznam 5. Spoznajte svojo / zgodovino

 -> / razred zgodovine Oseba {ime javnega niza; starost javnosti; javni opis niza; javna oseba (ime niza, starost, opis niza) {this.name = ime; this.age = starost; this.description = opis; } javni String toString () {return this.name; }} Oseba p1 = nova oseba ("Tom", 4, "Všeč Spiderman"); Oseba p2 = nova oseba ("Zach", 10, "Dober v matematiki"); / vars p1 p2 / zgodovina 

Nato lahko svojo zgodovino REPL shranite v datoteko in jo poimenujete, tako da jo lahko pozneje znova naložite. Tu je primer:

 -> / shrani output.repl -> / reset | Ponastavitev stanja. -> / vars -> / open output.repl -> / vars | Oseba p1 = Tom | Oseba p2 = Zach 

The / shrani ukaz shrani zgodovino REPL v datoteko, /ponastaviti ukaz ponastavi stanje REPL in /odprto ukaz bere v datoteki in izvaja stanja proti REPL. Funkcije shranjevanja in odpiranja omogočajo nastavitev zelo zapletenih skriptov REPL, s katerimi lahko konfigurirate različne scenarije REPL.

Urejanje definicije predavanja sproti

JShell omogoča tudi nastavitev datoteke zagonske definicije in samodejno nalaganje definicij. Lahko pregledujete zgodovino REPL in urejate poimenovane izvorne vnose. Na primer, če bi rad spremenil definicijo Oseba iz tega primera bi lahko uporabil / seznam in /Uredi ukazi.

Seznam 6. Spreminjanje osebe

 -> / l 1: razred Oseba {ime javnega niza; starost javnosti; javni opis niza; javna oseba (ime niza, starost, opis niza) {this.name = ime; this.age = starost; this.description = opis; } javni String toString () {return this.name; }} 2: Oseba p1 = nova oseba ("Tom", 4, "Likes Spiderman"); 3: Oseba p2 = nova oseba ("Zach", 10, "Dober v matematiki"); 4: p1 5: p2 -> / uredi 1 

Zagon tega /Uredi ukaz naloži preprost urejevalnik, v katerem lahko spremenim definicijo razreda in razred takoj posodobim.

V čem je velika stvar?

Pogovorite se s programerjem Clojure ali LISP o tem, kako se razvijajo vsak dan, in videli boste, da kodirajo v REPL. Ne pišejo skriptov in jih nato izvršijo, kolikor večino svojega razvojnega časa porabijo za interaktivno spreminjanje kode. Če imate na voljo nekaj ur, vprašajte razvijalca Scale ali Clojure o njihovi REPL. Tako deluje.

Java se razlikuje od jezika Scala ali Clojure. Razvijalci Java ne porabljajo dni, osredotočenih na posamezne vrstice LISP, ki bi v nekaj izjavah lahko vsebovale celotne programske strukture. Večina programov Java zahteva pravilno namestitev, medtem ko so nedavne spremembe jezika zmanjšale število vrstic sistemov, napisanih v Javi, še vedno merimo kompleksnost naših sistemov v tisočih vrsticah kode. Preprosto Oseba Zgoraj navedeni primer ni uporabna koda in najbolj uporabna koda v Javi nosi s seboj zapletenost, ki jo bo težko umestiti v programsko okolje, ki temelji na REPL.

Razvijalci Scala in Clojure vadita nekaj takega Programiranje Clojure avtor Chas Emerick imenuje "iterativni razvoj", ki ni odvisen od poteka datotek. Razvijalci Java so odvisni od deset knjižnic, zapletenih hierarhij odvisnosti in vsebnikov, kot sta Tomcat ali TomEE. Iz tega razloga ne predvidevam, da bo programiranje, usmerjeno v REPL, prehitevalo tradicionalni razvoj Jave v IDE. Namesto tega vidim, da Java REPL ponuja nekaj različnih prednosti in priložnosti.

1. Učenje Java: Ker programi Java zahtevajo toliko nastavitev, lahko razvijalci, ki se učijo jezik, predstavljajo izziv za hitro razumevanje skladnje. REPL Java 9 bo postal glavni način, kako se novi razvijalci spoprijeti z osnovno sintakso.

2. Eksperimentiranje z novimi knjižnicami: Java ima na stotine uporabnih odprtokodnih knjižnic za vse, od manipulacije z datumi in časi do matematičnih knjižnic. Brez REPL-a, kadar koli razvijalec želi razumeti novo knjižnico, neizogibno ustvari nekaj odvrženih razredov z običajnim "javna statična void glavna"slovesnost. Z REPL-om ga lahko preprosto zaženete in igrate brez tega.

3. Hitro izdelava prototipov: To je bližje načinu, kako večina razvijalcev Clojure in Scala deluje iterativno, toda če delate z osredotočenim problemom, REPL olajša hitro ponovitev sprememb razredov in algoritmov. Z REPL vam ne bo treba čakati, da se gradnja konča; definicijo razreda lahko hitro prilagodite, ponastavite REPL in poskusite znova.

4. Integracija z gradnimi sistemi: Gradle ponuja interaktivni način "lupine", skupnost Maven pa je v preteklosti pošiljala podobna orodja. Razvijalci, ki želijo zmanjšati kompleksnost gradnje, bi lahko raziskovali z uporabo REPL kot orodja za orkestriranje drugih sistemov.

Moja zadnja 2c

Javo REPL vidim kot nekaj, kar bo v naslednjih letih začelo vplivati ​​na vsakodnevni razvoj tistih, ki nadgrajujejo na Javo 9. Prav tako mislim, da bo Java skupnosti potrebovala čas, da se popolnoma prilagodi nov razvojni slog in razumeti izzive in priložnosti, ki jih ponuja REPL. Ne pričakujem, da bo večina razvijalcev Java prešla na razvoj, usmerjen v REPL, kot ga imajo njihovi bratranci Clojure, vendar mislim, da bomo videli, kako REPL vpliva na način, kako se novi razvijalci učijo Jave. Ker se novi razvijalci Java prvič srečajo z Javo v okviru REPL, ni dvoma, da bo začela vplivati ​​na to, kako gradimo in prototipiramo sisteme, ki temeljijo na Javi.

To zgodbo "Kaj REPL pomeni za Javo" je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found