Ohjelmointi

Mitä REPL tarkoittaa Java: lle

Ehkä olet Clojure-kaapin tai Scalan kehittäjä, tai ehkä olet työskennellyt LISP: n kanssa aiemmin. Jos näin on, sinulla on hyvät mahdollisuudet käyttää REPL: ää osana päivittäistä rutiiniasi. VASTAAtai read-eval-print-loop on kuoren käyttöliittymä, joka lukee jokaisen syöttörivin, arvioi kyseisen rivin ja tulostaa sitten tuloksen. Välitön palaute, mukavaa!

Kun käytät REPL-ohjelmaa, kirjoitat koodia vuorovaikutteisesti ja suoritat sen viipymättä. Java 9: ​​n julkaisu vuonna 2016 tuottaa täysin toimivan REPL-ympäristön nimeltä JShell (koodinimeltään Kulla). Tämä artikkeli tarjoaa yleiskuvan Java REPL: stä ja käsittelee joitain mahdollisuuksia siitä, miten voit käyttää sitä Java-ohjelmoinnissasi - joo, sinä!

Odota, Javalla ei ole vielä REPL-vastausta?

Varmasti vakiintuneella kielellä, kuten Javalla, on oltava REPL! Itse asiassa kaikilla kielillä ei ole niitä, ja Java on yksi niistä, josta se puuttuu. Epäilemättä Java on yksi seremonioista ja kattiloista enemmän kuin useimmilla kielillä, ja sen kehittäjät ovat ansainneet sen eniten. Java on ollut jonkin aikaa jonkin verran REPL-tyyppinen Java BeanShell -muodossa, mutta tämä projekti ei koskaan ollut täysin esillä oleva REPL muiden kielien kanssa. Se oli vain koko Java-kielen syntaksin osajoukko.

REPL vähentää läpimenoaikaa

Lyhentämällä läpimenoaikaa ja palautesilmukoita mahdollisimman paljon on uskomattoman tärkeää kehittäjän mielessä. REPL on loistava työkalu kehittäjille, jotka haluavat saavuttaa juuri tämän. Kehittäjät ovat tuottavimpia, kun he voivat nähdä työnsä tulokset välittömästi. Java REPL -palvelun avulla kehittäjät voivat kirjoittaa koodin, suorittaa koodin ja jatkaa koodinsa kehittämistä lennossa tarvitsematta poistua koontiversion ja niin edelleen suorittamiseksi. Vaikka monet Java-järjestelmistä ovat monimutkaisempia kuin mitä vuorovaikutteinen REPL voisi käsitellä, pelkkä REPL: n läsnäolo JDK: ssa tarkoittaa, että joku, jonnekin, löytää hämmästyttävän käyttötapauksen hetkessä. Se, että JShell paljastaa sovellusliittymän, varmistaa periaatteessa, että IDE-kehittäjät integroivat tämän REPL: n työkaluihin, joita käytämme koodin kirjoittamiseen. Odota vain, kunnes Java REPL on osa jokaista IDE: tä!

Aloita JShellin käyttö

On tärkeää ymmärtää, että kehitettävän REPL-projektin, Kulla-projektin, käyttö ei ole heikkohermoisille. Kulla, alias JShell, ei ole osa JDK 9 -esikatselupakettia kirjoituksen aikana, joten sinun on kloonattava Mercurial-projekti, käännettävä JDK ja koottava JShell itse. Varaa tunti tätä prosessia varten, varsinkin jos et yleensä heitä JDK-lähdekoodia. Sinun on poistettava varoitukset virheistä, ja jos rakennat OSX: ää, varmista, että olet asentanut XCoden ja XQuartzin freetype-kirjastoon. Asenna ja suorita Project Kulla Java-kehitysympäristössäsi noudattamalla alla olevia ohjeita.

1. Asenna Java 9

JShellin suorittamiseksi sinun on ladattava ja asennettava uusin Java 9: ​​n varhaisen käytön esikatselurakenne. Kun olet ladannut Java 9: ​​n, aseta JAVA_HOME ympäristömuuttuja ja ajaa java –versio vahvistaaksesi asennuksesi. Tämä voi olla tuskaa, etenkin OSX: ssä, joten kannattaa tarkistaa vielä kerran!

2. Asenna Mercurial ja Project Kulla

Project Kulla on OpenJDK-projekti, joten sinun on kloonattava Mercurial-arkisto sen kokoamiseksi.

Seuraavaksi kloonaat Kulla-arkiston:

 hg-klooni //hg.openjdk.java.net/kulla/dev kulla 

Määritä sitten koontiversio:

 cd kulla bash ./configure --disable-warnings-as--virheet tekevät kuvista 

3. Käännä ja suorita REPL

Tässä on koodi, jolla kootaan REPL:

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

Ja tässä on koodi sen suorittamiseksi:

 bash ./scripts/run.sh 

Kuten totesin, Javan REPL-ominaisuus ei ole vielä valmis yleiseen kulutukseen, mutta voimme silti ottaa sen varhaiselle koeajalle!

Teet matematiikan

Ensimmäisen esimerkin siitä, mitä JShell voi tehdä, arvioidaan joitain yksinkertaisia ​​lausekkeita java.lang.Math:

Listaus 1. Matemaattisten lausekkeiden arviointi REPL: llä

 $ bash ./scripts/run.sh | Tervetuloa JShell-versioon 0.710 | Kirjoita / auta apua -> Math.sqrt (144.0f); | Lausekearvo on: 12,0 | määritetty väliaikaiselle muuttujalle $ 1 tyypin double -> $ 1 + 100; | Lausekearvo on: 112,0 | määritetty väliaikaiselle muuttujalle $ 2 tyypistä double -> / vars | kaksinkertainen $ 1 = 12,0 | kaksinkertainen 2 dollaria = 112,0 -> kaksinkertainen val = Math.sqrt (9000); | Lisätty muuttuja val tyypin kaksinkertainen alkuarvolla 94,86832980505137 

Tässä arvioimme lausekkeita, etsimme luvun neliöjuuren ja lisäämme sitten kaksi lukua yhteen. Tämä ei ole monimutkaisin koodi, mutta sinun on huomattava, että / vars -komento antaa meille mahdollisuuden listata JShell-istunnossa luodut muuttujat. Voimme viitata määrittelemättömien lausekkeiden arvoihin dollarimerkinnällä ($). Lopuksi voimme luoda uuden muuttujan ja antaa sille arvon.

Määritä menetelmä

Nyt se muuttuu mielenkiintoisemmaksi. Tässä esimerkissä määritellään menetelmä Fibonacci-sekvenssin laskemiseksi. Kun menetelmä on määritelty, tarkistamme, mitkä menetelmät on määritelty / menetelmiä komento. Lopuksi suoritamme koodinpätkän taaksepäin taulukon läpi ja tulostamme sarjan ensimmäiset numerot.

Luettelo 2. Laske Fibonacci-sekvenssi

 $ bash ./scripts/run.sh | Tervetuloa JShell-versioon 0.710 | Tyyppi / apua apua varten -> pitkä fibonacci (pitkä luku) >> if ((numero == 0) | Lisätty menetelmä fibonacci (pitkä) -> / method | fibonacci (pitkä) pitkä -> fibonacci (12) | Lauseke on : 144 | määritetty väliaikaiselle muuttujalle $ 1 tyypistä long -> int [] matriisi = {1,2,3,4,5,6,7,8}; | Lisätty int-tyypin muuttujaryhmä alkuarvolla [I @ 4f4a7090 -> for (pitkä i: matriisi) {System.out.println (fibonacci (i));} 1 1 2 3 5 8 13 21 

Samassa JShell-istunnossa voin määritellä uudelleen Fibonacci-menetelmän määritelmän ja suorittaa saman koodin. Tällä tavalla voit käyttää REPL-sovellusta uusien algoritmien nopeaan toteuttamiseen, muokkaamiseen ja testaamiseen.

Luettelo 3. REPL uudelleenkäyttöä varten

 -> pitkä fibonacci (pitkä luku) {>> return 1; >>} | Muokattu menetelmä fibonacci (pitkä) -> (pitkä i: taulukko) {System.out.println (fibonacci (i)); } 1 1 1 1 1 1 1 

Määritä luokka

Seuraava esimerkki osoittaa, kuinka määritetään koko luokka JShellissä ja viitataan sitten kyseiseen luokkaan lausekkeessa - poistumatta REPL: stä. Kyky luoda ja testata koodia dynaamisesti vapauttaa sinut kokeilemaan ja toistamaan nopeasti uutta koodia.

Listaus 4. Dynaaminen luokan määritelmä

 MacOSX: korvaa tobrien $ bash ./scripts/run.sh | Tervetuloa JShell-versioon 0.710 | Kirjoita / avusta apua -> luokan henkilö {>> public String name; >> julkinen ikä; >> julkinen merkkijono kuvaus; >> >> public Person (merkkijonon nimi, ikä, merkkijonon kuvaus) {>> this.name = nimi; >> tämä. ikä = ikä; >> this.description = kuvaus; >>} >> >> public String toString () {>> palauta this.name; >>} >>} | Lisätty luokan henkilö -> henkilö p1 = uusi henkilö ("Tom", 4, "tykkää hämähäkkimies"); | Lisätty muuttuja p1 tyypistä Henkilö, jolla on alkuarvo Tom -> / vars | Henkilö p1 = Tom 

Vaikka kyky määritellä luokkia dynaamisesti on tehokas, kehittäjät eivät halua kirjoittaa suuria, monirivisiä määritelmiä interaktiiviseen kuoreen. Tässä on historia ja latautumisesta ja tallentamisesta REPL-tila alkaa tulla tärkeäksi. Kanssa /historia -komennolla voit luetella kaikki REPL-ohjelmassa arvioidut lauseet ja lausekkeet.

Listaus 5. Tunne / historiasi

 -> / historialuokka Henkilö {public String name; julkinen ikä; julkinen merkkijono kuvaus; public Person (merkkijonon nimi, ikä, merkkijonon kuvaus) {this.name = nimi; tämä. ikä = ikä; this.description = kuvaus; } public String toString () {palauta tämä.nimi; }} Henkilö p1 = uusi henkilö ("Tom", 4, "Tykkää Hämähäkkimies"); Henkilö p2 = uusi henkilö ("Zach", 10, "Hyvä matematiikassa"); / vars p1 p2 / historia 

Tämän jälkeen voit tallentaa REPL-historiasi tiedostoon ja nimetä sen, jotta se voidaan ladata myöhemmin uudelleen. Tässä on esimerkki:

 -> / save output.repl -> / reset | Tilan nollaus. -> / vars -> / open output.repl -> / vars | Henkilö p1 = Tom | Henkilö p2 = Zach 

/Tallentaa -komento tallentaa REPL-historian tiedostoon / nollaus -komento palauttaa REPL-tilan ja /avata komento lukee tiedostossa ja suorittaa tilat REPL: ää vastaan. Tallenna ja avaa -ominaisuuksien avulla voit määrittää erittäin monimutkaisia ​​REPL-komentosarjoja, joiden avulla voit määrittää erilaisia ​​REPL-skenaarioita.

Luokan määritelmän muokkaaminen lennossa

JShell mahdollistaa myös käynnistysmääritystiedoston asettamisen ja määritelmien lataamisen automaattisesti. Voit selata REPL-historiaasi ja muokata nimettyjä lähdemerkintöjä. Esimerkiksi, jos halusin muuttaa Henkilö luokan tästä esimerkistä voisin käyttää /lista ja /muokata komentoja.

Listaus 6. Henkilön muokkaaminen

 -> / l 1: luokan henkilö {public String name; julkinen ikä; julkinen merkkijono kuvaus; public Person (merkkijonon nimi, ikä, merkkijonon kuvaus) {this.name = nimi; tämä. ikä = ikä; this.description = kuvaus; } public String toString () {palauta tämä.nimi; }} 2: Henkilö p1 = uusi henkilö ("Tom", 4, "Tykkää Spidermanista"); 3: Henkilö p2 = uusi henkilö ("Zach", 10, "Hyvä matematiikassa"); 4: p1 5: p2 -> / muokkaa 1 

Suoritetaan tämä /muokata komento lataa yksinkertaisen editorin, jossa voin muuttaa luokan määritelmää ja päivittää luokan välittömästi.

Mikä on iso juttu?

Keskustele Clojure- tai LISP-ohjelmoijan kanssa siitä, kuinka he kehittyvät päivittäin, ja huomaat, että he koodaavat REPL: ssä. He eivät kirjoita komentosarjoja ja suorittavat ne sitten niin paljon kuin viettävät suurimman osan kehitysajastaan ​​koodin vaihtamiseen vuorovaikutteisesti. Jos sinulla on muutama tunti aikaa, kysy Scala- tai Clojure-kehittäjältä heidän REPL-vastauksestaan. Se miten he työskentelevät.

Java on eri kieli kuin Scala tai Clojure. Java-kehittäjät eivät viettää päiviä keskittyen yksittäisiin LISP-riveihin, jotka saattavat sisältää kokonaisia ​​ohjelmarakenteita muutamassa lausunnossa. Suurin osa Java-ohjelmista vaatii asennuksen toimiakseen oikein, ja vaikka äskettäiset muutokset kielessä ovat vähentäneet Java-järjestelmään kirjoitettujen järjestelmien rivimäärää, mitataan edelleen järjestelmiemme monimutkaisuutta tuhansina koodiriveinä. Yksinkertainen Henkilö Yllä mainittu esimerkki ei ole hyödyllinen koodi, ja kaikkein hyödyllisin Java-koodi sisältää monimutkaisuuden, jota on vaikea sovittaa REPL-pohjaiseen ohjelmointiympäristöön.

Scala- ja Clojure-kehittäjät harjoittavat jotain sellaista Clojure-ohjelmointi kirjailija Chas Emerick kutsuu "iteratiivista kehitystä", joka ei riipu tiedostopohjaisesta työnkulusta. Java-kehittäjät ovat riippuvaisia ​​kymmenistä kirjastoista, monimutkaisista riippuvuushierarkioista ja säilöistä, kuten Tomcat tai TomEE. Tästä syystä en ennusta, että REPL-suuntautunut ohjelmointi ohittaa perinteisen Java-kehityksen IDE: ssä. Sen sijaan näen Java REPL: n tarjoavan muutamia erillisiä etuja ja mahdollisuuksia.

1. Java-oppiminen: Koska Java-ohjelmat vaativat niin paljon asennusta, kieltä oppiville kehittäjille voi olla haastavaa ymmärtää syntaksin nopeasti. Java 9: ​​n REPL: stä tulee ensisijainen tapa, jolla uudet kehittäjät tarttuvat perussyntaksiin.

2. Kokeile uusia kirjastoja: Javalla on satoja hyödyllisiä avoimen lähdekoodin kirjastoja kaikkeen päivämäärän ja ajan manipuloinnista matemaattisiin kirjastoihin. Ilman REPL: ää, aina kun kehittäjä haluaa ymmärtää uuden kirjaston, he väistämättä luovat muutaman heittokurssin tavallisella "julkinen staattinen tyhjä pää"seremonia. REPL: llä voit vain laukaista sen ja pelata ilman tätä ylimääräistä.

3. Nopea prototyyppien muodostus: Tämä on lähempänä sitä, miten useimmat Clojure- ja Scala-kehittäjät työskentelevät iteratiivisesti, mutta jos työskentelet kohdennetun ongelman parissa, REPL: n avulla on helppo toistaa nopeasti luokkiin ja algoritmeihin tehdyistä muutoksista. REPL: n avulla sinun ei tarvitse odottaa rakennuksen päättymistä; voit muokata luokan määritelmää nopeasti, nollata REPL ja kokeilla sitä uudelleen.

4. Integrointi rakennusjärjestelmiin: Gradle tarjoaa interaktiivisen "shell" -tilan, ja Maven-yhteisö on toimittanut vastaavia työkaluja aiemmin. Kehittäjät, jotka haluavat vähentää rakennuksen monimutkaisuutta, voisivat tutkia REPL: n käyttöä työkaluna muiden järjestelmien organisoimiseksi.

Viimeinen 2c

Mielestäni Java REPL on jotain, joka alkaa vaikuttaa päivittäiseen kehitykseen lähivuosina niille, jotka päivittävät Java 9: ​​een. Uskon myös, että Java-yhteisö tarvitsee aikaa sopeutua täysin uuden kehitystyylin ja ymmärrä sekä haasteet että mahdollisuudet, joita REPL tarjoaa. En usko, että useimmat Java-kehittäjät siirtyvät REPL-suuntautuneeseen kehitykseen, kuten heidän Clojure-ohjelmointiserkkunsa ovat, mutta uskon, että näemme REPL: n vaikuttavan tapaan, jolla uudet kehittäjät oppivat Java: ta. Kun uudet Java-kehittäjät kohtaavat Java ensimmäistä kertaa REPL: ssä, ei ole epäilystäkään siitä, että se alkaa vaikuttaa Java-pohjaisten järjestelmien rakentamiseen ja prototyyppiin.

Tämän tarinan "Mitä REPL tarkoittaa Java: lle" julkaisi alun perin JavaWorld.