Programavimas

Ką REPL reiškia „Java“

Galbūt esate spintelės „Clojure“ ar „Scala“ kūrėjas, o gal anksčiau dirbote su LISP. Jei taip, yra didelė tikimybė, kad REPL naudojote kaip savo kasdienybės dalį. ATSAKYTIarba „read-eval-print-loop“ yra apvalkalo sąsaja, kuri nuskaito kiekvieną įvesties eilutę, įvertina tą eilutę ir tada atspausdina rezultatą. Greitas atsiliepimas, malonu!

Kai naudojate REPL, jūs rašote kodą interaktyviai ir vykdote jį nedelsdami. Išleidus „Java 9“ 2016 m. Bus sukurta visiškai veikianti REPL aplinka, pavadinta „JShell“ (kodinis pavadinimas „Kulla“). Šiame straipsnyje pateikiama „Java REPL“ apžvalga ir aptariamos kelios galimybės, kaip galėtumėte ją naudoti programuodami „Java“ - taip, jūs!

Palaukite, „Java“ jau neturi REPL?

Tikrai tokia kalba kaip „Java“ turi turėti REPL! Na, iš tikrųjų jų nėra visose kalbose, o „Java“ yra viena iš tų, kurių jai trūksta. Galima teigti, kad „Java“ yra viena iš tų kalbų, kurios kūrėjai nusipelnė daugiau nei daugelyje kalbų nei daugelyje kalbų. „Java“ kurį laiką turėjo kažką panašaus į REPL „Java BeanShell“ pavidalu, tačiau šis projektas niekada nebuvo pilnai pristatytas REPL, lygiavertis kitų kalbų. Tai buvo tik visos Java kalbos sintaksės pogrupis.

REPL sumažina apyvartą

Kūrėjo protui nepaprastai svarbu kuo labiau sutrumpinti apyvartos laiką ir grįžtamąjį ryšį. REPL yra puiki priemonė kūrėjams, norintiems to pasiekti. Kūrėjai yra produktyviausi, kai gali iškart pamatyti savo darbo rezultatus. Naudodami „Java REPL“ kūrėjai galės rašyti kodą, vykdyti tą kodą ir tada toliau tobulinti savo kodą skrisdami, neišeidami, norėdami paleisti kūrimą ir pan. Nors daugelis sistemų, naudojančių „Java“, nėra tokios sudėtingos, kaip galėtų veikti interaktyvus REPL, vien tai, kad REPL yra JDK, reiškia, kad kažkas iš kažkur greitai suras nuostabų naudojimo atvejį. Tai, kad „JShell“ atskleidžia API, iš esmės užtikrina, kad IDE kūrėjai integruos šį REPL į įrankius, kuriuos naudojame rašydami kodą. Tiesiog palaukite, kol „Java REPL“ bus kiekvieno IDE dalis!

Pradėkite naudotis „JShell“

Svarbu suvokti, kad „REPL“ projektas „Project Kulla“ nėra skirtas silpnai širdžiai. Kulla, dar žinomas JShell, rašymo metu nėra „JDK 9“ peržiūros paketo dalis, todėl turėsite klonuoti „Mercurial“ projektą, sukompiliuoti JDK ir patys surinkti „JShell“. Skirkite valandą šiam procesui, ypač jei paprastai nemėtote JDK šaltinio kodo. Turėsite išjungti įspėjimus kaip klaidas, o jei kuriate OSX, įsitikinkite, kad freetype bibliotekai įdiegėte „XCode“ kartu su „XQuartz“. Vykdykite toliau pateiktas instrukcijas, kad įdiegtumėte ir paleistumėte „Project Kulla“ savo „Java“ kūrimo aplinkoje.

1. Įdiekite „Java 9“

Norėdami paleisti „JShell“, turėsite atsisiųsti ir įdiegti naujausią „Java 9“ ankstyvosios prieigos peržiūros versiją. Atsisiuntę „Java 9“ nustatykite JAVA_HOME aplinkos kintamasis ir paleisti java –versija kad patikrintumėte savo diegimą. Tai gali būti skausmas, ypač naudojant OSX, todėl verta dar kartą patikrinti!

2. Įdiekite „Mercurial“ ir „Project Kulla“

„Project Kulla“ yra „OpenJDK“ projektas, todėl norėdami jį sukomponuoti, turite klonuoti „Mercurial“ saugyklą.

Tada klonuosite „Kulla“ saugyklą:

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

Tada sukonfigūruosite komponavimą:

 CD kulla bash ./configure --disable-warnings-as-klaidos daro vaizdus 

3. Sudarykite ir paleiskite REPL

Štai kodas norint surinkti REPL:

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

Ir štai kodas jį paleisti:

 bash ./scripts/run.sh 

Kaip jau pastebėjau, „Java“ REPL funkcija dar nėra parengta bendram vartojimui, tačiau vis tiek galime ją laikyti ankstyvu bandomuoju važiavimu!

Jūs darote matematiką

Pradinį pavyzdį, ką „JShell“ gali padaryti, įvertinkime keletą paprastų posakių java.lang.Math:

Sąrašas 1. Matematinių išraiškų įvertinimas naudojant REPL

 $ bash ./scripts/run.sh | Sveiki atvykę į „JShell“ - versija 0.710 | Tipas / pagalba pagalbai -> Math.sqrt (144.0f); | Išraiškos vertė yra: 12,0 | priskirtas dvigubo tipo laikinajam kintamajam $ 1 -> $ 1 + 100; | Išraiškos vertė yra: 112,0 | priskirtas laikinam $ 2 tipui double -> / vars | dvigubai 1 USD = 12,0 | dviguba 2 USD = 112,0 -> dviguba val = Math.sqrt (9000); | Pridėtas dvigubo tipo kintamasis val su pradine verte 94,86832980505137 

Čia mes vertiname išraiškas, surandame skaičiaus kvadratinę šaknį ir sujungiame du skaičius. Tai nėra pats sudėtingiausias kodas, tačiau turėtumėte atkreipti dėmesį, kad / vars komanda suteikia mums galimybę išvardyti kintamuosius, sukurtus JShell sesijoje. Nepriskirtų išraiškų vertes galime nurodyti naudodami dolerio ženklo ($) žymėjimą. Galiausiai galime sukurti naują kintamąjį ir priskirti jam vertę.

Apibrėžkite metodą

Dabar pasidaro įdomiau. Šiame pavyzdyje mes apibrėžiame Fibonači sekos apskaičiavimo metodą. Apibrėžus metodą, mes patikriname, kurie metodai yra apibrėžti naudojant / metodai komandą. Galiausiai įvykdome kodo fragmentą, kad galėtume pereiti per masyvą ir išspausdinti pirmuosius kelis eilės skaičius.

Sąrašas 2. Apskaičiuokite Fibonači seką

 $ bash ./scripts/run.sh | Sveiki atvykę į „JShell“ - versija 0.710 | Tipas / pagalba pagalbai -> ilgas fibonacci (ilgas skaičius) >> if ((skaičius == 0) | Pridėtas metodas fibonacci (ilgas) -> / metodai | fibonacci (ilgas) ilgas -> fibonacci (12) | Išraiškos vertė yra : 144 | priskirtas ilgojo tipo laikinajam kintamajam $ 1 -> int [] masyvas = {1,2,3,4,5,6,7,8}; | Pridėtas int tipo kintamasis masyvas su pradine verte [I @ 4f4a7090 -> skirtas (ilgam i: masyvui) {System.out.println (fibonacci (i));} 1 1 2 3 5 8 13 21 

Toje pačioje „JShell“ sesijoje galiu iš naujo apibrėžti „Fibonacci“ metodo apibrėžimą ir įvykdyti tą patį kodą. Tokiu būdu galite naudoti REPL, kad greitai įvykdytumėte, modifikuotumėte ir išbandytumėte naujus algoritmus.

3 sąrašas. REPL pakartotiniam naudojimui

 -> ilgasis fibonači (ilgasis skaičius) {>> grąžina 1; >>} | Modifikuotas metodas fibonacci (ilgas) -> for (ilgas i: masyvas) {System.out.println (fibonacci (i)); } 1 1 1 1 1 1 1 

Apibrėžkite klasę

Šis pavyzdys parodo, kaip apibrėžti visą klasę „JShell“ ir nurodyti nuorodą į tą klasę išraiškoje - nepaliekant REPL. Galimybė dinamiškai kurti ir išbandyti kodą leidžia greitai eksperimentuoti ir kartoti naują kodą.

Sąrašas 4. Dinaminis klasės apibrėžimas

 „MacOSX“: pakeiskite tobrien $ bash ./scripts/run.sh | Sveiki atvykę į „JShell“ - versija 0.710 | Tipas / pagalba pagalbai -> klasės asmuo {>> public String name; >> public int age; >> viešosios eilutės aprašymas; >> >> viešasis asmuo (eilutės vardas, int amžius, eilutės aprašymas) {>> this.name = vardas; >> this.age = amžius; >> tai.aprašas = aprašymas; >>} >> >> public String toString () {>> grąžinti this.name; >>} >>} | Pridėta klasės asmenybė -> asmuo p1 = naujas asmuo („Tomas“, 4 m., „Mėgsta vorą“); | Pridėtas asmens kintamasis p1 su pradine verte Tom -> / vars | Asmuo p1 = Tomas 

Nors galimybė dinamiškai apibrėžti klases yra galinga, tai nėra panašu, kad kūrėjai reikalauja rašyti didelius kelių eilučių apibrėžimus į interaktyvų apvalkalą. Čia yra sąvoka istorija ir ruošiantis įkelti ir išsaugoti REPL būseną, tampa svarbu. Su /istorija komandą galite išvardyti visus teiginius ir posakius, įvertintus REPL.

Sąrašas 5. Žinokite savo istoriją

 -> / istorijos klasė Asmuo {public Stygos vardas; public int age; viešosios eilutės aprašymas; viešasis asmuo (eilutės vardas, int amžius, eilutės aprašymas) {this.name = vardas; tai. amžius = amžius; tai.aprašas = aprašymas; } public String toString () {return this.name; }} Asmuo p1 = naujas asmuo („Tomas“, 4 m., „Mėgsta vorą“); Asmuo p2 = naujas asmuo („Zach“, 10, „gerai moki matematiką“); / vars p1 p2 / istorija 

Tada galite išsaugoti savo REPL istoriją faile ir pavadinti, kad vėliau ją būtų galima vėl įkelti. Štai pavyzdys:

 -> / išsaugoti išvestį.repl -> / atstatyti | Būsenos nustatymas iš naujo. -> / vars -> / open output.repl -> / vars | Asmuo p1 = Tomas | Asmuo p2 = Zachas 

/sutaupyti komanda išsaugo REPL istoriją faile, / atstatyti komanda iš naujo nustato REPL būseną, o /atviras komanda nuskaito failą ir vykdo būsenas prieš REPL. Įrašymo ir atidarymo funkcijos leidžia nustatyti labai sudėtingus REPL scenarijus, kuriuos galite naudoti norėdami konfigūruoti skirtingus REPL scenarijus.

Redaguoti klasės apibrėžimą skriejant

„JShell“ taip pat leidžia automatiškai nustatyti paleisties apibrėžimo failą ir įkelti apibrėžimus. Galite pereiti prie savo REPL istorijos ir redaguoti įvardytus šaltinio įrašus. Pavyzdžiui, jei norėčiau modifikuoti Asmuo klasę iš šio pavyzdžio galėčiau naudoti / sąrašas ir /Redaguoti komandos.

Sąrašas 6. Modifikuojantis asmuo

 -> / l 1: klasės asmuo {public String name; public int age; viešosios eilutės aprašymas; viešasis asmuo (eilutės vardas, int amžius, eilutės aprašymas) {this.name = vardas; tai. amžius = amžius; tai.aprašas = aprašymas; } public String toString () {return this.name; }} 2: asmuo p1 = naujas asmuo („Tomas“, 4 m., „Mėgsta vorą“); 3: asmuo p2 = naujas asmuo („Zach“, 10, „gerai moki matematiką“); 4: p1 5: p2 -> / redaguoti 1 

Tai paleisti /Redaguoti komanda įkelia paprastą redaktorių, kur galiu pakeisti klasės apibrėžimą ir nedelsiant atnaujinti klasę.

Koks tas svarbus reikalas?

Pasitarkite su „Clojure“ ar „LISP“ programuotoju, kaip jie vystosi kasdien, ir pamatysite, kad jie koduoja REPL. Jie nerašo scenarijų ir tada juos vykdo tiek, kiek praleidžia didžiąją savo kūrimo laiko dalį interaktyviai keisdami kodą. Jei turite kelias valandas laiko, paklauskite „Scala“ ar „Clojure“ kūrėjo apie jų REPL. Tai kaip jie dirba.

„Java“ kalba skiriasi nuo „Scala“ ar „Clojure“. „Java“ kūrėjai neleidžia dienų, orientuotų į atskiras LISP eilutes, kuriose keliose ataskaitose gali būti visos programos struktūros. Daugumai „Java“ programų reikia sąrankos, kad tinkamai veiktų, ir nors dėl naujausių kalbos pakeitimų sumažėjo „Java“ parašytų sistemų eilučių skaičius, mes vis dar matuojame savo sistemų sudėtingumą tūkstančiais kodo eilučių. Paprasta Asmuo Aukščiau pateiktas pavyzdys nėra naudingas kodas, o naudingiausias „Java“ kodas yra sudėtingas, kurį bus sunku pritaikyti REPL pagrįstoje programavimo aplinkoje.

„Scala“ ir „Clojure“ kūrėjai praktikuoja tai, kas Clojure programavimas autorius Chasas Emerickas vadina „iteracinį kūrimą“, kuris nepriklauso nuo failais pagrįstos darbo eigos. „Java“ kūrėjai priklauso nuo dešimčių bibliotekų, sudėtingų priklausomybės hierarchijų ir konteinerių, tokių kaip „Tomcat“ ar „TomEE“. Dėl šios priežasties aš neprognozuoju, kad į REPL orientuotas programavimas pralenks tradicinę Java plėtrą IDE. Vietoj to matau, kad „Java REPL“ teikia keletą skirtingų privalumų ir galimybių.

1. Java mokymasis: Kadangi „Java“ programoms reikia tiek daug sąrankos, kalbos mokantiems kūrėjams gali būti sunku suprasti sintaksę greitai. „Java 9“ REPL taps pagrindiniu būdu, kuriuo naujieji kūrėjai susiduria su pagrindine sintakse.

2. Eksperimentai su naujomis bibliotekomis: „Java“ turi šimtus naudingų atvirojo kodo bibliotekų, skirtų viskam, pradedant manipuliavimu data ir laiku, baigiant matematikos bibliotekomis. Be REPL, kai kūrėjas nori suprasti naują biblioteką, jis neišvengiamai sukuria keletą pamokų su įprastomis klasėmis "public static void main"ceremonija. Naudodamiesi REPL, galite tiesiog jį paleisti ir žaisti be šios pridėtinės sumos.

3. Greitas prototipų kūrimas: Tai yra arčiau to, kaip dauguma „Clojure“ ir „Scala“ kūrėjų dirba iteratyviai, tačiau jei dirbate su tiksline problema, REPL leidžia lengvai greitai pakartoti keičiant klases ir algoritmus. Su REPL nereikės laukti, kol baigsis kūrimas; galite greitai pritaikyti klasės apibrėžimą, iš naujo nustatyti REPL ir bandyti dar kartą.

4. Integracija su komponavimo sistemomis: „Gradle“ suteikia interaktyvų „apvalkalo“ režimą, o „Maven“ bendruomenė praeityje pristatė panašius įrankius. Kūrėjai, norintys sumažinti kūrimo sudėtingumą, galėtų ištirti REPL naudojimą kaip įrankį kitų sistemų organizavimui.

Mano paskutinis 2c

Manau, kad „Java REPL“ yra kažkas, kas per ateinančius kelerius metus pradės veikti kasdienę plėtrą tiems, kurie atnaujina versiją į „Java 9“. Aš taip pat manau, kad „Java“ bendruomenei reikės laiko, kad galėtų visiškai prisitaikyti prie naują vystymosi stilių ir suprasti iššūkius bei galimybes, kurias suteikia ATSI. Aš nesitikiu, kad dauguma „Java“ kūrėjų pereis prie REPL orientuoto kūrimo, kaip jų pusbroliai turi „Clojure“ programavimo pusbrolius, tačiau manau, kad matysime, kad REPL daro įtaką naujų kūrėjų mokymuisi „Java“. Kai naujieji „Java“ kūrėjai pirmą kartą susiduria su „Java“ per REPL, nėra jokių abejonių, kad tai pradės daryti įtaką tam, kaip mes kuriame ir prototipuojame „Java“ sistemas.

Šią istoriją „Ką REPL reiškia„ Java “iš pradžių paskelbė„ JavaWorld “.