Programmēšana

Ko REPL nozīmē Java

Varbūt jūs esat Clojure skapis vai Scala izstrādātājs, vai varbūt esat strādājis ar LISP agrāk. Ja tā, tad pastāv liela iespēja, ka esat izmantojis REPL kā daļu no ikdienas. REPL, vai read-eval-print-loop, ir čaulas interfeiss, kas nolasa katru ievades rindu, novērtē šo līniju un pēc tam izdrukā rezultātu. Tūlītējas atsauksmes, jauki!

Izmantojot REPL, jūs interaktīvi rakstāt kodu un izpildāt to bez kavēšanās. Java 9 izlaišana 2016. gadā nodrošinās pilnībā funkcionējošu REPL vidi ar nosaukumu JShell (ar kodu Kulla). Šajā rakstā ir sniegts pārskats par Java REPL un apspriestas dažas iespējas, kā jūs to varētu izmantot Java programmēšanā - jā, jūs!

Pagaidiet, Java jau nav REPL?

Noteikti izveidotai valodai, piemēram, Java, ir jābūt REPL! Nu, patiesībā, ne visās valodās tās ir, un Java ir viena no tām, kuras tai trūkst. Var apgalvot, ka Java ir viena no valodām, kuras izstrādātāji to ir pelnījuši, jo tajā ir vairāk ceremoniju un katlu nekā vairākumā valodu. Java kādu laiku bija kaut kas nedaudz līdzīgs REPL Java BeanShell formā, taču šis projekts nekad nebija pilnībā aprīkots ar REPL līdzvērtīgi citu valodu projektiem. Tas bija tikai pilnas Java valodas sintakses apakškopa.

REPL samazina apgrozījumu

Cik vien iespējams saīsināt apgrozījuma laiku un atgriezeniskās saites, izstrādātāja saprātam ir ārkārtīgi svarīgi. REPL ir lielisks rīks izstrādātājiem, kuri vēlas tieši to sasniegt. Izstrādātāji ir visproduktīvākie, ja viņi uzreiz var redzēt sava darba rezultātus. Izmantojot Java REPL, izstrādātāji varēs rakstīt kodu, izpildīt šo kodu un pēc tam turpināt koda pilnveidošanu lidojuma laikā, neizejot no tā, lai palaistu būvējumu un tā tālāk. Kaut arī daudzas no sistēmām, kurās tiek izmantota Java, ir sarežģītāka par to, ko varētu apstrādāt interaktīvā REPL, vienīgā REPL klātbūtne JDK nozīmē, ka kāds kaut kur atradīs pārsteidzošu lietojuma gadījumu. Fakts, ka JShell atklāj API, būtībā nodrošina to, ka IDE izstrādātāji šo REPL integrēs rīkos, kurus mēs izmantojam koda rakstīšanai. Vienkārši pagaidiet, līdz Java REPL ir daļa no katra IDE!

Sāciet darbu ar JShell

Ir svarīgi saprast, ka projekta REPL izmantošana projektā Kulla nav domāta vājprātīgajiem. Kulla, aka JShell, rakstīšanas laikā nav iekļauta JDK 9 priekšskatījuma komplektā, tāpēc jums būs jāklonē Mercurial projekts, jāapkopo JDK un jāapkopo JShell pats. Atvēliet stundu šim procesam, it īpaši, ja jūs parasti nemētājaties ar JDK pirmkodu. Jums būs jāatspējo brīdinājumi kā kļūdas, un, ja veidojat OSX, pārliecinieties, vai freetype bibliotēkai esat instalējis XCode kopā ar XQuartz. Izpildiet tālāk sniegtos norādījumus, lai instalētu un palaistu Project Kulla Java izstrādes vidē.

1. Instalējiet Java 9

Lai palaistu JShell, jums būs jāielādē un jāinstalē jaunākais agrīnās piekļuves priekšskatījuma veidojums Java 9. Kad esat lejupielādējis Java 9, iestatiet JAVA_HOME vides mainīgais un palaist java –versija lai pārbaudītu instalāciju. Tas var būt sāpes, īpaši OSX, tāpēc ir vērts vēlreiz pārbaudīt!

2. Instalējiet Mercurial un Project Kulla

Project Kulla ir OpenJDK projekts, tāpēc, lai to sastādītu, jums būs jāklonē Mercurial krātuve.

Pēc tam jūs klonēsit Kulla krātuvi:

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

Tad jūs konfigurēsit būvējumu:

 cd kulla bash ./configure --disable-brīdinājumi-kā-kļūdas veido attēlus 

3. Apkopojiet un palaidiet REPL

Šeit ir kods, lai apkopotu REPL:

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

Un šeit ir kods, lai to palaistu:

 bash ./scripts/run.sh 

Kā es atzīmēju, Java REPL funkcija vēl nav gatava vispārējam patēriņam, taču mēs to joprojām varam ņemt par agrīnu testa braucienu!

Jūs veicat matemātiku

Sākotnējais piemērs tam, ko JShell var darīt, novērtēsim dažus vienkāršus izteicienus, izmantojot java.lang.Math:

Saraksts 1. Matemātisko izteiksmju novērtēšana ar REPL

 $ bash ./scripts/run.sh | Laipni lūdzam JShell versijā 0.710 | Tips / palīdzība pēc palīdzības -> Math.sqrt (144.0f); | Izteiksmes vērtība ir: 12,0 | piešķirts dubultā tipa pagaidu mainīgajam $ 1 -> $ 1 + 100; | Izteiksmes vērtība ir: 112,0 | piešķirts dubultā tipa>> / vars | pagaidu mainīgajam $ 2 dubultā $ 1 = 12,0 | dubultā $ 2 = 112,0 -> double val = Math.sqrt (9000); | Pievienots mainīgais val tips dubultā ar sākotnējo vērtību 94.86832980505137 

Šeit mēs novērtējam izteicienus, atrodam skaitļa kvadrātsakni un pēc tam saskaitot divus skaitļus. Šis nav vissarežģītākais kods, taču jums jāņem vērā, ka / vars komanda dod mums iespēju uzskaitīt mainīgos, kas izveidoti JShell sesijā. Mēs varam atsaukties uz nepiešķirto izteicienu vērtībām, izmantojot dolāra zīmes ($) apzīmējumu. Visbeidzot, mēs varam izveidot jaunu mainīgo un piešķirt tam vērtību.

Definējiet metodi

Tagad kļūst interesantāk. Šajā piemērā mēs definējam metodi Fibonači secības aprēķināšanai. Pēc metodes definēšanas mēs pārbaudām, kuras metodes ir definētas ar /metodes komandu. Visbeidzot, mēs izpildām koda fragmentu, lai apietu masīvu un izdrukātu dažus pirmos numurus secībā.

Saraksts 2. Aprēķiniet Fibonači secību

 $ bash ./scripts/run.sh | Laipni lūdzam JShell versijā 0.710 | Tips / palīdzība pēc palīdzības -> garš fibonacci (garš skaitlis) >> if ((skaitlis == 0) | Pievienotā metode fibonacci (garā) -> / method | fibonacci (garā) garā -> fibonacci (12) | Izteiksmes vērtība ir : 144 | piešķirts garā tipa pagaidu mainīgajam $ 1 -> int [] masīvs = {1,2,3,4,5,6,7,8}; | Pievienots int [] mainīgā masīva masīvs ar sākotnējo vērtību [I @ 4f4a7090 -> priekš (garš i: masīvs) {System.out.println (fibonacci (i));} 1 1 2 3 5 8 13 21 

Tajā pašā JShell sesijā es varu no jauna definēt Fibonacci metodes definīciju un izpildīt to pašu kodu. Tādā veidā jūs varat izmantot REPL, lai ātri izpildītu, modificētu un pārbaudītu jaunus algoritmus.

Saraksts 3. REPL atkārtotai izmantošanai

 -> long fibonacci (garš skaitlis) {>> return 1; >>} | Modificēta metode fibonacci (garš) -> for (garš i: masīvs) {System.out.println (fibonacci (i)); } 1 1 1 1 1 1 1 

Definējiet klasi

Šis piemērs parāda, kā JShell definēt visu klasi un pēc tam atsaukties uz šo klasi izteiksmē - visu neatstājot REPL. Spēja dinamiski izveidot un pārbaudīt kodu ļauj ātri eksperimentēt un atkārtoties ar jaunu kodu.

Saraksts 4. Dinamiskās klases definīcija

 MacOSX: aizstājiet tobrien $ bash ./scripts/run.sh | Laipni lūdzam JShell versijā 0.710 | Tips / palīdzība pēc palīdzības -> klases persona {>> public virknes nosaukums; >> publiskais vecums; >> public Stīgu apraksts; >> >> publiska persona (virknes nosaukums, vecums, virknes apraksts) {>> this.name = vārds; >> šī.vecums = vecums; >> this.description = apraksts; >>} >> >> public String toString () {>> atgriezt this.name; >>} >>} | Pievienotā klases persona -> persona p1 = jauna persona ("Toms", 4, "Patīk Zirnekļcilvēks"); | Pievienots Personas tipa mainīgais p1 ar sākotnējo vērtību Toms -> / vars | Persona p1 = Toms 

Kaut arī spēja dinamiski definēt klases ir spēcīga, nav tā, ka izstrādātāji mudina rakstīt lielas, daudzrindu definīcijas interaktīvā čaulā. Šeit ir jēdziens vēsture un gatavojas ielādēt un saglabāt REPL stāvokli sāk kļūt svarīga. Ar /vēsture komandu varat uzskaitīt visus REPL novērtētos apgalvojumus un izteicienus.

Saraksts 5. Ziniet savu / vēsturi

 -> / vēstures klase Persona {publiskais Stīgas nosaukums; public int age; publisks virknes apraksts; publiska persona (virknes nosaukums, int vecums, virknes apraksts) {this.name = name; tas.vecums = vecums; this.description = apraksts; } public String toString () {return this.name; }} Persona p1 = jauna persona ("Toms", 4, "Patīk Zirnekļcilvēks"); Persona p2 = jauna persona ("Zach", 10, "Matemātika ir laba"); / vars p1 p2 / vēsture 

Pēc tam jūs varat saglabāt savu REPL vēsturi failā un nosaukt to, lai to vēlāk varētu ielādēt vēlreiz. Lūk, piemērs:

 -> / save output.repl -> / reset | Stata atiestatīšana. -> / vars -> / open output.repl -> / vars | Persona p1 = Toms | Persona p2 = Zaks 

The / saglabāt komanda saglabā REPL vēsturi failā / reset komanda atiestata REPL stāvokli un / atvērts komanda nolasa failā un izpilda stāvokļus pret REPL. Saglabāšanas un atvēršanas funkcijas ļauj iestatīt ļoti sarežģītus REPL skriptus, kurus varat izmantot dažādu REPL scenāriju konfigurēšanai.

Klases definīcijas rediģēšana lidojumā

JShell ļauj arī iestatīt starta definīcijas failu un automātiski ielādēt definīcijas. Varat pārlūkot savu REPL vēsturi un rediģēt nosaukto avotu ierakstus. Piemēram, ja es vēlētos modificēt Persona klases no šī piemēra es varētu izmantot / saraksts un / edit komandas.

Uzskaitīšana 6. Personas modificēšana

 -> / l 1: klase Persona {publiskais Stīgas nosaukums; public int age; publisks virknes apraksts; publiska persona (virknes nosaukums, int vecums, virknes apraksts) {this.name = name; tas.vecums = vecums; this.description = apraksts; } public String toString () {return this.name; }} 2: Persona p1 = jauna persona ("Toms", 4, "Patīk Zirnekļcilvēks"); 3: Persona p2 = jauna persona ("Zach", 10, "Labs matemātikā"); 4: p1 5: p2 -> / edit 1 

Palaist šo / edit komanda ielādē vienkāršu redaktoru, kur es varu mainīt klases definīciju un klasi nekavējoties atjaunināt.

Kas ir liels darījums?

Runājiet ar Clojure vai LISP programmētāju par to, kā viņi attīstās katru dienu, un jūs redzēsiet, ka viņi kodē REPL. Viņi neraksta skriptus un pēc tam tos izpilda tik daudz, cik viņi tērē lielāko daļu sava izstrādes laika, interaktīvi mainot kodu. Ja jums ir dažas stundas laika, jautājiet Scala vai Clojure izstrādātājam par viņu REPL. Tā viņi strādā.

Java valoda atšķiras no Scala vai Clojure. Java izstrādātāji netērē dienas, koncentrējoties uz atsevišķām LISP rindām, kurās dažos paziņojumos varētu būt iekļautas visas programmas struktūras. Lielākajai daļai Java programmu ir nepieciešama iestatīšana, lai tā darbotos pareizi, un, lai gan nesenās valodas izmaiņas ir samazinājušas Java rakstīto sistēmu rindu skaitu, mēs joprojām mēra mūsu sistēmu sarežģītību tūkstošos koda rindiņu. Vienkārši Persona Iepriekš uzskaitītais piemērs nav noderīgs kods, un visnoderīgākais Java kods satur sarežģītību, kuru būs grūti iekļaut REPL balstītā programmēšanas vidē.

Scala un Clojure izstrādātāji praktizē kaut ko tādu Clojure programmēšana autors Čass Emeriks sauc par “iteratīvu izstrādi”, kas nav atkarīga no failiem balstītas darbplūsmas. Java izstrādātāji ir atkarīgi no desmitiem bibliotēku, sarežģītu atkarības hierarhiju un konteineru, piemēram, Tomcat vai TomEE. Šī iemesla dēļ es neprognozēju, ka uz REPL orientēta programmēšana pārspēs tradicionālo Java attīstību IDE. Tā vietā es redzu, ka Java REPL sniedz dažas atšķirīgas priekšrocības un iespējas.

1. Java mācīšanās: Tā kā Java programmām ir nepieciešams tik daudz iestatīšanas, izstrādātājiem var būt grūti mācīties valodu, lai ātri saprastu sintaksi. Java 9 REPL kļūs par galveno veidu, kā jaunie izstrādātāji tiek galā ar pamata sintaksi.

2. Eksperimentēšana ar jaunām bibliotēkām: Java ir simtiem noderīgu atvērtā pirmkoda bibliotēku, sākot no manipulācijām ar datumu un laiku līdz matemātikas bibliotēkām. Bez REPL vienmēr, kad izstrādātājs vēlas izprast jaunu bibliotēku, viņš neizbēgami izveido dažas izmetamās klases ar parasto "public static void main"ceremonija. Izmantojot REPL, jūs varat to vienkārši iedarbināt un spēlēt bez šīs galvas.

3. Ātra prototipēšana: Tas ir tuvāk tam, kā lielākā daļa Clojure un Scala izstrādātāju darbojas iteratīvi, bet, ja jūs strādājat ar fokusētu problēmu, REPL ļauj viegli ātri atkārtot izmaiņas klasēs un algoritmos. Izmantojot REPL, nebūs jāgaida, kamēr būve tiks pabeigta; jūs varat ātri pielāgot klases definīciju, atiestatīt savu REPL un mēģināt vēlreiz.

4. Integrācija ar būvēšanas sistēmām: Gradle nodrošina interaktīvu "čaulas" režīmu, un Maven kopiena agrāk ir piegādājusi līdzīgus rīkus. Izstrādātāji, kas vēlas samazināt būvniecības sarežģītību, varētu izpētīt REPL izmantošanu kā instrumentu citu sistēmu organizēšanai.

Mans pēdējais 2.c

Es uzskatu, ka Java REPL ir kaut kas, kas dažu nākamo gadu laikā sāks ietekmēt ikdienas attīstību tiem, kas veic jaunināšanu uz Java 9. Es arī domāju, ka Java kopienai būs vajadzīgs laiks, lai pilnībā pielāgotos jaunu attīstības stilu un izprot gan REPL piedāvātās problēmas, gan iespējas. Es nedomāju, ka lielākā daļa Java izstrādātāju pāriet uz attīstību, kas vērsta uz REPL, piemēram, viņu Clojure programmēšanas brālēniem, taču es domāju, ka mēs redzēsim, ka REPL ietekmēs veidu, kā jaunie izstrādātāji apgūst Java. Tā kā jaunie Java izstrādātāji ar Java pirmo reizi sastopas REPL ietvaros, nav šaubu, ka tas sāks ietekmēt to, kā mēs veidojam un prototipējam uz Java balstītas sistēmas.

Šo stāstu “Ko REPL nozīmē Java” sākotnēji publicēja JavaWorld.

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