Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Greške
  • Novi programski jezik Kotlin. Zašto Kotlin toliko vole u Googleu i kome treba dvije tisuće programskih jezika

Novi programski jezik Kotlin. Zašto Kotlin toliko vole u Googleu i kome treba dvije tisuće programskih jezika

Programski jezik Kotlin, koji je razvila peterburška tvrtka JetBrains, postao je službeni razvojni jezik za Android. Ovo je službeno objavljeno na Google I/O konferenciji. Kotlin tim vodi diplomant Sveučilišta ITMO Andrey Breslav. Zašto je Kotlin toliko voljen od strane IT diva među mnogim drugim "mladim" jezicima, kako i zašto se uopće pojavljuju novi programski jezici, pročitajte u komentarima stručnjaka i zbirci informacija ITMO.NEWS.

Kako se razvijaju programski jezici

Prema različitim procjenama, u svijetu već postoji više od dvije tisuće različitih programskih jezika. Ažuriranja se stalno objavljuju za stare jezike, a pojavljuju se i novi jezici. Kada se sintaksa jezika ne mijenja, već samo postaje složenija i proširena, programeru je potrebno samo malo prakse da nastavi pisati na svom omiljenom jeziku. Ponekad se struktura samog jezika mijenja, a zatim programer ponekad mora ponovno učiti, prilagođavajući se ažuriranom jeziku. Obično se prijelaz na novu strukturu događa postupno iu dijelovima, odnosno samo 10-20% programskog koda počinje se pisati pomoću novog jezika.

« Programeri nisu bili potpuno zadovoljni jezicima C++ i Java, jer su to prilično složeni jezici, a prvi je teži od drugog. Stoga se pojavio jezik Scala koji se sviđa mnogim programerima, ali je i vrlo složen. Ogromno iskustvo JetBrainsa u stvaranju alata za razvoj programa za različite programske jezike omogućilo mu je da u sedam godina stvori jezik Kotlin, koji je u potpunosti kompatibilan s Javom, ali je jednostavniji i praktičniji od nje. Programski jezici se stalno razvijaju; nitko si više ne postavlja zadatak napraviti univerzalni jezik. Unatoč tome, svaki jezik je učinkovitiji u određenom području gdje se najčešće koristi. Postoji čak i smjer u stvaranju jezika kada su razvijeni za određeno predmetno područje“, komentirao je pročelnik Odjela za tehnologiju programiranja Sveučilišta ITMO.


Danas neke tvrtke čak sastavljaju vlastite jezične ocjene. Primjerice, tvrtka TIOBE, specijalizirana za procjenu kvalitete softvera, od 2001. mjesečno izračunava indeks popularnosti pojedinih jezika. Generirana lista sadrži 50 redaka, a kako bi programski jezik bio uvršten u indeks, programeri moraju napisati odgovarajuće pismo tvrtki. Izračun se temelji na podacima 25 internetskih tražilica. Do sada Java vodi na ljestvici s velikom razlikom, a slijedi je C. Istovremeno, sastavljači popisa naglašavaju da su tijekom prošle godine oba programska jezika postala manje popularna, za oko 6%. Istodobno, TIOBE pokazuje da je C bio jezik broj 1 do 2002. godine, a Java je 1997. bila na 14. mjestu, ali je pet godina kasnije zamijenila C na prvom mjestu.

Možete održati izvrsno predavanje o povijesti razvoja jezika: kustosica akademskih programa Yandexa, ravnateljica centra za studentska natjecanja Fakulteta računarstva Visoke ekonomske škole govori o tome kako jezici C , pojavili su se PHP, Ruby i Java. Mihail Gustokašin. Predavač naglašava da za svaki zadatak treba odabrati drugi programski jezik. Recimo, kaže da je za vojnu industriju najbolje pisati na dobrom starom Pascalu – jeziku koji je rođen davne 1970. godine! Zašto? Jer je pouzdaniji. Poslovne aplikacije mogu se pisati u Javi jer je i ovaj jezik prilično pouzdan, ali puno lakši za korištenje. Stručnjak također naglašava da je važno održati interes za jezik među programerima stvaranjem zajednice programera koji pišu na ovom jeziku. Ako se stvori infrastruktura oko novog jezika i ljudi se okupe da ga koriste, tek tada će jezik postati popularan. Usput, programeri Kotlina također su usvojili ovu strategiju.

Malo o Kotlinu

Programski jezik Kotlin počeo se razvijati u peterburškoj tvrtki JetBrains 2010. godine. Službeno izdanje proizvoda objavljeno je 2016. godine. Jezik je dobio ovo ime u čast otoka u Finskom zaljevu na kojem se nalazi Kronstadt. Zanimljivom podudarnošću, ime popularnog jezika Java ujedno je i ime jednog otoka u Indoneziji. Podudarnost vjerojatno nije slučajna. Kako stoji u priopćenju, Kotlin bi trebao raditi svugdje gdje se izvodi Java, a jedan od ciljeva bio je napraviti proizvod koji bi se mogao koristiti u mješovitim projektima koji se izrađuju na nekoliko jezika.


Kako navode autori Kotlina, najvažnije im je bilo stvoriti “pragmatičan” proizvod. To znači da nisu bili fokusirani samo na ispravljanje grešaka i poboljšanje proizvoda, što bi svaki programer učinio, već su htjeli napraviti koristan alat.

« Razvojni alati, uključujući programske jezike, neprestano se razvijaju. Jezici se razlikuju od drugih alata po tome što ih je prilično teško evolucijski razviti. Nova verzija jezika mora podržavati sve postojeće programe. Time se ograničavaju mogućnosti razvoja postojećih jezika i stvara potreba za nastankom novih. Čimbenik koji određuje uspjeh novog programskog jezika je, prije svega, pogodnost za programere. Osim što je koncizan i izražajan, Kotlin je vrlo kompatibilan s Java kodom: možete koristiti sve postojeće biblioteke, pa čak i miješati kod na dva jezika u jednom projektu, tako da nema posebnih poteškoća pri prijelazu“, komentirao je voditelj projekta Kotlin u JetBrainsu, koji je diplomirao na Sveučilištu ITMO.

Zašto je Google volio Kotlin

Na službenoj web stranici programeri Androida pišu da su primijetili "uspon" Kotlina posljednjih godina. Zaposlenici u Googleu ne srame se opisati jezik kao impresivan, koncizan, osnažujući i ugodan za rad. Ima povećanu produktivnost: programski kod u njemu je u prosjeku 40% kraći nego u drugim jezicima, a Kotlin također omogućuje izbjegavanje nekih pogrešaka u kodu. Jedan od odlučujućih čimbenika za Kotlinovu popularnost u Googleu bila je njegova kompatibilnost s Javom, koja se već koristi u razvoju aplikacija za Android.

Sada, kada programeri počnu stvarati novu aplikaciju u službenom razvojnom okruženju Android Studio, mogu odmah omogućiti dodatak “Kotlin podrška”. Također možete pretvoriti već stvorene linije koda na drugim jezicima u jezik Kotlin, umetnuti blokove na drugim jezicima u linije koda u Kotlinu. U budućnosti će se razviti više knjižnica i alata za jezik, više materijala za obuku i bit će lakše pronaći rješenja za moguće probleme.

« Nedostatak garancija jezične podrške od strane Googlea obeshrabrio je mnoge programere od prelaska na Kotlin. Čak i ako stvarno volite jezik,Programer uvijek razmišlja o riziku da će u nekom trenutku ovaj jezik jednostavno prestati raditi. Sada postoji jamstvo da Kotlin neće prestati raditi, a očekujemo da će se broj korisnika jezika naglo povećati. Bilo bi prirodno pretpostaviti da će se mnoge tvrtke na kraju potpuno prebaciti na Kotlin, iako ih tehnički ništa ne prisiljava na to, to je jednostavno stvar preferencija“- naglasio je Andrey Breslav.

Dodao je da se Kotlin vrlo aktivno razvija. Razvojni tim trenutno radi na sustavu izrade, brzini kompilacije, poboljšanju performansi IDE-a, dodavanju novih značajki alatu, uključujući one povezane s integracijom u Android Studio. Također se radi na višeplatformskim projektima (mogućnost kompajliranja istog koda za nekoliko platformi), a brojna poboljšanja jezika su u fazi dizajna.


Iz Googlea su također naglasili da su inspirirani konceptom jezika Kotlin, prema kojem je on uvijek bio i ostat će besplatan za programere, odnosno projekt otvorenog koda. To znači da jezik nije vezan ni za jednu tvrtku, a izvorni kod se distribuira pod besplatnom licencom. Možete preuzeti proizvod. Kako bi podržali razvoj Kotlina, Google i JetBrains uspostavit će neprofitno partnerstvo. Također, u sklopu “misije” Androida vrlo je važno da autori Kotlina oko svog proizvoda stvore zajednicu ljudi koji se profesionalno bave razvojem na ovom jeziku i vole dijeliti svoja iskustva. Na primjer, u studenom će se održati Kotlin konferencija u Sjedinjenim Državama, a programeri također mogu primati dnevne vijesti i savjete o softverskom proizvodu te se sastati lokalno.

Inače, sam projekt Android Studio razvijen je na temelju okruženja za razvoj softvera IntelliJ IDEA kojeg je također izradio JetBrains. No unatoč bliskoj suradnji, iz peterburške tvrtke naglašavaju da nema govora o bilo kakvoj prodaji JetBrainsa američkom informatičkom divu. Istovremeno, Koltin neće biti dizajniran samo za Android. Cilj tvrtke je napraviti programski jezik prikladnim za različite razvojne platforme.

Ovaj članak govori o programskom jeziku Kotlin. Upoznat ćete razloge nastanka projekta, mogućnosti jezika i vidjeti nekoliko primjera. Članak je prvenstveno napisan s očekivanjem da je čitatelj upoznat s programskim jezikom java, no i oni koji poznaju neki drugi jezik moći će steći predodžbu o temi. Članak je površan i ne bavi se pitanjima vezanim uz kompilaciju u javascriptu. Kompletnu dokumentaciju možete pronaći na službenim stranicama projekta, no pokušat ću ukratko govoriti o jeziku.

o projektu

Nedavno je JetBrains, tvrtka koja se bavi kreiranjem razvojnih okruženja, najavila svoj novi proizvod - programski jezik Kotlin. Val kritika pogodio je tvrtku: kritičari su predložili da se tvrtka urazumi i dovrši dodatak za Scala, umjesto da razvija vlastiti jezik. Scala programerima doista nedostaje dobro razvojno okruženje, ali problemi programera dodataka su razumljivi: Scala, koja je rođena zahvaljujući istraživačima iz Švicarske, ugradila je mnogo inovativnih znanstvenih koncepata i pristupa, zbog čega je stvaranje dobrog razvojnog alata postalo iznimno težak zadatak . Trenutačno je segment modernih statički tipiziranih jezika za JVM mali, tako da odluka o stvaranju vlastitog jezika zajedno s razvojnim okruženjem za njega izgleda vrlo dalekovidno. Čak i ako ovaj jezik uopće ne zaživi u zajednici, JetBrains ga prvenstveno radi za svoje potrebe. Svaki Java programer može razumjeti ove potrebe: Java se kao jezik razvija vrlo sporo, nove značajke se ne pojavljuju u jeziku (već nekoliko godina čekamo na funkcije prvog reda), kompatibilnost sa starijim verzijama jezika čini nemoguće da se mnoge korisne stvari pojave u bliskoj budućnosti (na primjer, pristojna parametrizacija tipa). Za tvrtku koja razvija softver, programski jezik je glavni radni alat, stoga su učinkovitost i jednostavnost jezika pokazatelji o kojima ovisi ne samo lakoća razvoja alata za njega, već i programerovi troškovi kodiranja, tj. koliko će lako održavati ovaj kod i razumjeti ga.

O jeziku

Jezik je statički tipiziran. Ali u usporedbi s Javom, Kotlin kompajler dodaje informacije tipu o tome može li referenca sadržavati null, što pooštrava provjeru tipa i čini izvršenje sigurnijim:

Fun foo(text:String) ( println(text.toLowerCase()) // NPE? Ne! ) val str:String? = null // String? -- nullable tip foo(str) //<- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

Unatoč činjenici da ovaj pristup može spasiti programera od niza problema povezanih s NPE-om, za Java programera isprva se čini nepotrebnim - morate raditi nepotrebne provjere ili konverzije. Ali nakon nekog vremena programiranja u kotlinu, vraćajući se na Javu, osjećate da vam nedostaju te informacije o tipu i razmišljate o korištenju Nullable/NotNull primjedbi. S tim su povezani problemi povratne kompatibilnosti s Javom - ove informacije nisu u bajt kodu Jave, ali koliko ja znam, ovaj problem je još uvijek u procesu rješavanja, a za sada su sve vrste koje dolaze iz Jave nullable.

Usput, o povratnoj kompatibilnosti: Kotlin je kompajliran u JVM bajt kod (kreatori jezika ulažu mnogo truda u održavanje kompatibilnosti), što mu omogućuje korištenje u istom projektu s Javom, te mogućnost međusobnog korištenja Jave i Kotlin klase čine prag za uvođenje Kotlina u veliki postojeći vrlo minimalan java projekt. U tom smislu, važna je mogućnost korištenja višestrukih Java razvojnih procesa stvaranjem projekta u potpunosti u kotlinu. Na primjer, bilo mi je gotovo lako napraviti mali projekt temeljen na spring-webmvc.

Pogledajmo fragment kontrolera:

Path(array("/notes/")) klasa kontrolera NotesController ( private autowired val notesService: NotesService? = null path(array("all")) fun all() = render("notes/notes") ( addObject(" bilješke", notesService!!.sve) ) ​​//... )

Osobitosti korištenja zabilješki u Kotlinu su vidljive: na nekim mjestima ne izgleda tako uredno kao u Javi (ovo se odnosi na posebne slučajeve, na primjer, niz od jednog elementa), ali zabilješke se mogu koristiti kao "domaće" ključne riječi kao što su kao autowired ili kontroler (ako navedete vrstu pseudonima prilikom uvoza), a u smislu mogućnosti, anotacije su bliže stvarnim klasama.

Treba napomenuti da Spring nije mogao omotati Kotlin klase za upravljanje transakcijama - nadam se da će to biti moguće u budućnosti.

Jezik ima podršku za prvorazredne funkcije. To znači da je funkcija tip ugrađen u jezik za koji postoji posebna sintaksa. Funkcije se mogu stvoriti lokalno, proslijediti kao parametri drugim funkcijama i pohraniti reference na njih:

Fun doSomething(thing:()->Unit) ( // deklarira parametar tipa function // ()->Unit ne prihvaća ništa i // ne vraća ništa važno thing() // poziv ) doSomething() ( // i ovdje u hodu stvaramo funkciju tipa // ()->Unit i prosljeđujemo je funkciji doShomething // ako je funkcija zadnji parametar, možete je // premjestiti izvan pozivnih zagrada println("Hello worlde) "))

Ako ovom proširenju dodamo funkcije koje nam omogućuju da proširimo već postojeću klasu koristeći metodu koja ne narušava enkapsulaciju klase, ali kojoj se može pristupiti kao metodi ove klase, tada ćemo dobiti prilično moćan mehanizam za proširenje standardne java biblioteke koje su prilično loše u smislu praktičnosti. Po tradiciji, dodajmo mogućnost filtriranja popisa koji već postoji u standardnoj biblioteci:

Zabava Popis .filter(uvjet:(T)->Boolean):Popis (val rezultat = popis () for(item in this) ( if(condition(item)) result.add(item) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Imajte na umu da varijable nemaju navedene tipove - Kotlin kompajler ih izvodi ako je moguće i ne ometa razumljivost sučelja. Općenito, jezik je dizajniran na takav način da osobu za tipkovnicom što je više moguće spasi od upisivanja nepotrebnih znakova: kratka, ali jasna sintaksa s minimalnim brojem ključnih riječi, nema potrebe za točkom i zarezom za odvajanje izraza, zaključivanje tipa gdje je to prikladno , nema nove ključne riječi za stvaranje klase - samo ono što je neophodno.

Za ilustraciju teme klasa i kratkoće, pogledajmo sljedeći kod:

// stvaranje klasa beana postaje // lakonsko, polja se mogu deklarirati // izravno u deklaraciji konstruktora class TimeLord(val name:String) // klasa možda uopće nema tijelo class TARDIS(val owner:TimeLord) fun main (args: Niz ) ( val doctor = TimeLord("Doctor") val tardis = TARDIS(doctor) println(tardis.owner.name) )

U nekoliko redaka uspjeli smo deklarirati dvije klase, kreirati dva objekta i ispisati ime vlasnika TARDIS-a! Možete primijetiti da je klasa deklarirana s parametrima svog jedinog mogućeg konstruktora, koji su ujedno i deklaracija njezinih svojstava. Izuzetno kratko, ali informativno. Zasigurno će biti onih koji će osuditi nemogućnost deklariranja više od jednog konstruktora, ali čini mi se da to ima svoj pragmatizam - uostalom, nekoliko konstruktora u Javi dopušta vam deklariranje zadanih parametara, što Kotlin podržava u jeziku razinu, ili pretvoriti jednu vrstu u drugu, s kojom će ova klasa raditi, a to se već može sigurno prepustiti tvorničkoj metodi. Obratite pozornost na deklaraciju “varijabli” i polja. Kotlin nas prisiljava da napravimo izbor: val ili var. Gdje val deklarira nepromjenjivu konačnu referencu, a var deklarira varijablu, što pomaže u izbjegavanju široke upotrebe promjenjivih referenci.

Primjer

Sada smo došli do mjesta gdje možemo raditi nešto zanimljivije. Tijekom intervjua često dam zadatak implementirati stablo, obići ga i odrediti neku akciju s elementom. Pogledajmo kako je ovo implementirano u kotlinu.

Ovako bih volio da upotreba izgleda:

Fun main(args: Array ) ( // stvoriti malo stablo val tree= stablo("root") ( čvor("1-1") ( čvor("2-1") čvor("2-2") ) čvor("1-2 " ) ( node("2-3") ) ) // prelazi preko njega i ispisuje vrijednosti u stablo konzole.traverse ( println(it) ) )

Sada pokušajmo ovo implementirati. Kreirajmo klasu čvora stabla:

/** * @param value node data */ class Node (val value:T) ( // node children private val children:List > = arrayList() /** * Metoda koja stvara i dodaje dijete čvoru * @param vrijednost vrijednost za novi čvor * @param init funkcija za inicijalizaciju novog čvora, izborno * parametar */ zabavni čvor(vrijednost: T, init:čvor .()->Jedinica = ()):Čvor ( val čvor = Čvor (vrijednost) node.init() children.add(node) return node ) /** * Metoda rekurzivno prelazi sve podređene čvorove počevši od * samog čvora, svaki čvor je obaviješten o rukovatelju * @param rukovatelj funkcija rukovatelja za vrijednost svakog čvora */ fun traverse(handler:(T)->Unit) ( handler(value) children.forEach ( child -> child.traverse(handler) ) ) )

Dodajmo sada funkciju za stvaranje vrha stabla:

/** * Stvara čvor stabla s vrijednošću vrijednosti i inicijalizira * njegovu djecu metodom init. */ zabavno stablo(vrijednost:T, init:čvor .()->Jedinica): Čvor ( val node = Node(value) // poziva init metodu koja je proslijeđena u // parametru na objektu čvora node.init() return node )

Na dva mjesta u kodu korištena je konstrukcija poput Node.()->Unit, čije značenje je da se kao ulaz očekuje tip funkcije koji će se izvršiti kao metoda objekta tipa Node. Iz tijela ove funkcije postoji pristup drugim metodama ovog objekta, kao što je metoda Node.node(), koja vam omogućuje inicijalizaciju stabla sličnu onoj opisanoj u primjeru.

Umjesto zaključka

Zbog svoje dobre kompatibilnosti s Javom i mogućnosti postupne zamjene starog koda, Kotlin bi u budućnosti mogao postati dobra zamjena za Javu u velikim projektima i prikladan alat za izradu malih projekata s perspektivom njihovog razvoja. Jednostavnost jezika i njegova fleksibilnost daje programeru više mogućnosti za pisanje brzog, ali visokokvalitetnog koda.

Ako vas jezik zanima, sve informacije o jeziku možete pronaći na službenim stranicama projekta, njihove izvore možete pronaći na githubu, a sve pronađene greške možete objaviti u Issue Trackeru. Još uvijek ima mnogo problema, ali programeri jezika aktivno se bore s njima. Sada tim radi na još uvijek ne baš stabilnoj verziji milestone 3, nakon stabilizacije, koliko ja znam, planira se koristiti jezik unutar tvrtke JetBrains, nakon čega je već planirano prvo izdanje.

Oznake: Dodajte oznake

Godine 2010. skupina programera iz ruskog ogranka JetBrainsa krenula je u razvoj jezika koji bi bio praktičniji i sigurniji od Jave, ali ne tako složen kao Scala. Ime ovog jezika dano je u čast otoka Kotlin, koji se nalazi u Finskom zaljevu (po analogiji s Javom, koja je također dobila ime po otoku).

Ako pogledate bilo koji moderni pregled programskih jezika koji najviše obećavaju, uključujući, sigurno ćete tamo pronaći Kotlin. Što je suština ovog jezika, zašto ga svi toliko vole, kakve perspektive ima - o tome kasnije.

Sintaksa

Ideja stvaranja jezika koji je jednako prikladan i za početnike i za iskusne programere izravno je izražena u njegovoj sintaksi. Kao i svaki moderni analog, Kotlin je izuzetno koncizan, kompaktan i razumljiv. Ogromna količina koda koji je prethodno morao biti napisan u Javi sada se jednostavno može zanemariti. Jednostavan primjer: korištenje točke i zareza za odvajanje iskaza nije uvjet - kompajler sada sve razumije sam ako samo prijeđete u novi red. Kod deklariranja varijabli u mnogim slučajevima nije potrebno navesti tip - on će se odrediti automatski.

Pritom se mora reći da se Kotlin u snimateljskom smislu malo vratio Pascalovom stilu – i ovdje jasnoća prevladava nad jasnoćom struktura. Nešto više o tome možete pročitati u ovom kratkom članku. Pokriva samo osnovne principe konstruiranja jezika Java i Kotlin, tako da će biti razumljiv apsolutno svima.

Međutim, ipak ćemo ostaviti mali dio koda:

fun main(args: Array ) {
val opseg = "svijet"
println("Zdravo, $scope!")
}

Izuzetno jednostavan unos koji bi trebao biti razumljiv svima koji su barem godinu dana učili programiranje u školi ili na fakultetu.

Važno je spomenuti da je Kotlin u potpunosti kompatibilan s Javom. Zato se u početku smatrao jednostavnim sintaktičkim šećerom, korištenim za složene zadatke gdje se jednostavno željelo uštedjeti vrijeme i trud.

Prednosti

Općenito, sve prednosti u odnosu na Javu već su spomenute, pa ćemo ih samo sakupiti na jednom mjestu:

    Kod volumena. Nekorištenje nepotrebnih arhaičnih dijelova koda ubrzava razvojni proces i povećava čitljivost;

    Sigurnost. Pravila za stvaranje koda ugrađenog u sintaksu jezika omogućuju vam da izbjegnete male pogreške koje je teško pratiti i koje se pojavljuju samo tijekom izvođenja programa;

    Kompatibilnost u Javi. Ovo je zgodno i sa gledišta učenja novog jezika i sa gledišta postupnog prijenosa vaših softverskih proizvoda s Jave na Kotlin. Primjerice, upravo se to dogodilo s aplikacijom Basecamp.

Mane

Kao jezik koji je razvijen na temelju Jave, Kotlin ima dva očita nedostatka u usporedbi: brzinu i razrađenost. U prvom slučaju sve je jasno: radeći na JVM-u teško je nadmašiti Javu u pogledu performansi. Drugi problem je malo nategnut za tako mlad jezik, jer je u službenom optjecaju tek nešto više od godinu dana. Da, ovdje ima znatno manje alata i biblioteka nego u Javi. Ali, prvo, to još nije kritično, a drugo, u svijetu Jave kvantiteta nije uvijek prevedena u kvalitetu.

Kotlin se za sada nosi sa svojim glavnim zadacima, a puna kompatibilnost s Javom pomaže nam zatvoriti oči na ove nedostatke.

Izgledi

Unatoč činjenici da je razvoj Kotlina započeo 2010., prva službena verzija objavljena je tek u veljači 2016. Od tada potražnja za jezikom brzo raste, u ocjeni TIOBE probio se u TOP-50 u roku od godinu dana , a prošli mjesec na konferenciji Google I /O najavio službenu podršku za Kotlin u sustavu za razvoj aplikacija Android.

Uzimajući u obzir veliku popularnost IntelliJ IDEA među programerima i strateški fokus tvrtke na Kotlin, možemo pouzdano reći da ćemo ga za 3-4 godine vidjeti među punopravnim konkurentima Jave i Swifta u području mobilnog razvoja. Osim toga, ako se tvorci jezika ne razočaraju svojim proizvodom, Kotlin će sigurno nastaviti ozbiljno osvajati druge horizonte: web, AI, Internet of things, big data, desktop aplikacije.

Ako ste ozbiljno zainteresirani za ovaj jezik, svakako pogledajte njegovu službenu stranicu (ruska verzija) i iskusite sve njegove prednosti iz osobnog iskustva. Požurite prije nego postane mainstream.

Ovaj članak govori o programskom jeziku Kotlin. Upoznat ćete razloge nastanka projekta, mogućnosti jezika i vidjeti nekoliko primjera. Članak je prvenstveno napisan s očekivanjem da je čitatelj upoznat s programskim jezikom java, no i oni koji poznaju neki drugi jezik moći će steći predodžbu o temi. Članak je površan i ne bavi se pitanjima vezanim uz kompilaciju u javascriptu. Kompletnu dokumentaciju možete pronaći na službenim stranicama projekta, no pokušat ću ukratko govoriti o jeziku.

o projektu

Nedavno je JetBrains, tvrtka koja se bavi kreiranjem razvojnih okruženja, najavila svoj novi proizvod - programski jezik Kotlin. Val kritika pogodio je tvrtku: kritičari su predložili da se tvrtka urazumi i dovrši dodatak za Scala, umjesto da razvija vlastiti jezik. Scala programerima doista nedostaje dobro razvojno okruženje, ali problemi programera dodataka su razumljivi: Scala, koja je rođena zahvaljujući istraživačima iz Švicarske, ugradila je mnogo inovativnih znanstvenih koncepata i pristupa, zbog čega je stvaranje dobrog razvojnog alata postalo iznimno težak zadatak . Trenutačno je segment modernih statički tipiziranih jezika za JVM mali, tako da odluka o stvaranju vlastitog jezika zajedno s razvojnim okruženjem za njega izgleda vrlo dalekovidno. Čak i ako ovaj jezik uopće ne zaživi u zajednici, JetBrains ga prvenstveno radi za svoje potrebe. Svaki Java programer može razumjeti ove potrebe: Java se kao jezik razvija vrlo sporo, nove značajke se ne pojavljuju u jeziku (već nekoliko godina čekamo na funkcije prvog reda), kompatibilnost sa starijim verzijama jezika čini nemoguće da se mnoge korisne stvari pojave u bliskoj budućnosti (na primjer, pristojna parametrizacija tipa). Za tvrtku koja razvija softver, programski jezik je glavni radni alat, stoga su učinkovitost i jednostavnost jezika pokazatelji o kojima ovisi ne samo lakoća razvoja alata za njega, već i programerovi troškovi kodiranja, tj. koliko će lako održavati ovaj kod i razumjeti ga.

O jeziku

Jezik je statički tipiziran. Ali u usporedbi s Javom, Kotlin kompajler dodaje informacije tipu o tome može li referenca sadržavati null, što pooštrava provjeru tipa i čini izvršenje sigurnijim:

Fun foo(text:String) ( println(text.toLowerCase()) // NPE? Ne! ) val str:String? = null // String? -- nullable tip foo(str) //<- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

Unatoč činjenici da ovaj pristup može spasiti programera od niza problema povezanih s NPE-om, za Java programera isprva se čini nepotrebnim - morate raditi nepotrebne provjere ili konverzije. Ali nakon nekog vremena programiranja u kotlinu, vraćajući se na Javu, osjećate da vam nedostaju te informacije o tipu i razmišljate o korištenju Nullable/NotNull primjedbi. S tim su povezani problemi povratne kompatibilnosti s Javom - ove informacije nisu u bajt kodu Jave, ali koliko ja znam, ovaj problem je još uvijek u procesu rješavanja, a za sada su sve vrste koje dolaze iz Jave nullable.

Usput, o povratnoj kompatibilnosti: Kotlin je kompajliran u JVM bajt kod (kreatori jezika ulažu mnogo truda u održavanje kompatibilnosti), što mu omogućuje korištenje u istom projektu s Javom, te mogućnost međusobnog korištenja Jave i Kotlin klase čine prag za uvođenje Kotlina u veliki postojeći vrlo minimalan java projekt. U tom smislu, važna je mogućnost korištenja višestrukih Java razvojnih procesa stvaranjem projekta u potpunosti u kotlinu. Na primjer, bilo mi je gotovo lako napraviti mali projekt temeljen na spring-webmvc.

Pogledajmo fragment kontrolera:

Path(array("/notes/")) klasa kontrolera NotesController ( private autowired val notesService: NotesService? = null path(array("all")) fun all() = render("notes/notes") ( addObject(" bilješke", notesService!!.sve) ) ​​//... )

Osobitosti korištenja zabilješki u Kotlinu su vidljive: na nekim mjestima ne izgleda tako uredno kao u Javi (ovo se odnosi na posebne slučajeve, na primjer, niz od jednog elementa), ali zabilješke se mogu koristiti kao "domaće" ključne riječi kao što su kao autowired ili kontroler (ako navedete vrstu pseudonima prilikom uvoza), a u smislu mogućnosti, anotacije su bliže stvarnim klasama.

Treba napomenuti da Spring nije mogao omotati Kotlin klase za upravljanje transakcijama - nadam se da će to biti moguće u budućnosti.

Jezik ima podršku za prvorazredne funkcije. To znači da je funkcija tip ugrađen u jezik za koji postoji posebna sintaksa. Funkcije se mogu stvoriti lokalno, proslijediti kao parametri drugim funkcijama i pohraniti reference na njih:

Fun doSomething(thing:()->Unit) ( // deklarira parametar tipa function // ()->Unit ne prihvaća ništa i // ne vraća ništa važno thing() // poziv ) doSomething() ( // i ovdje u hodu stvaramo funkciju tipa // ()->Unit i prosljeđujemo je funkciji doShomething // ako je funkcija zadnji parametar, možete je // premjestiti izvan pozivnih zagrada println("Hello worlde) "))

Ako ovom proširenju dodamo funkcije koje nam omogućuju da proširimo već postojeću klasu koristeći metodu koja ne narušava enkapsulaciju klase, ali kojoj se može pristupiti kao metodi ove klase, tada ćemo dobiti prilično moćan mehanizam za proširenje standardne java biblioteke koje su prilično loše u smislu praktičnosti. Po tradiciji, dodajmo mogućnost filtriranja popisa koji već postoji u standardnoj biblioteci:

Zabava Popis .filter(uvjet:(T)->Boolean):Popis (val rezultat = popis () for(item in this) ( if(condition(item)) result.add(item) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Imajte na umu da varijable nemaju navedene tipove - Kotlin kompajler ih izvodi ako je moguće i ne ometa razumljivost sučelja. Općenito, jezik je dizajniran na takav način da osobu za tipkovnicom što je više moguće spasi od upisivanja nepotrebnih znakova: kratka, ali jasna sintaksa s minimalnim brojem ključnih riječi, nema potrebe za točkom i zarezom za odvajanje izraza, zaključivanje tipa gdje je to prikladno , nema nove ključne riječi za stvaranje klase - samo ono što je neophodno.

Za ilustraciju teme klasa i kratkoće, pogledajmo sljedeći kod:

// stvaranje klasa beana postaje // lakonsko, polja se mogu deklarirati // izravno u deklaraciji konstruktora class TimeLord(val name:String) // klasa možda uopće nema tijelo class TARDIS(val owner:TimeLord) fun main (args: Niz ) ( val doctor = TimeLord("Doctor") val tardis = TARDIS(doctor) println(tardis.owner.name) )

U nekoliko redaka uspjeli smo deklarirati dvije klase, kreirati dva objekta i ispisati ime vlasnika TARDIS-a! Možete primijetiti da je klasa deklarirana s parametrima svog jedinog mogućeg konstruktora, koji su ujedno i deklaracija njezinih svojstava. Izuzetno kratko, ali informativno. Zasigurno će biti onih koji će osuditi nemogućnost deklariranja više od jednog konstruktora, ali čini mi se da to ima svoj pragmatizam - uostalom, nekoliko konstruktora u Javi dopušta vam deklariranje zadanih parametara, što Kotlin podržava u jeziku razinu, ili pretvoriti jednu vrstu u drugu, s kojom će ova klasa raditi, a to se već može sigurno prepustiti tvorničkoj metodi. Obratite pozornost na deklaraciju “varijabli” i polja. Kotlin nas prisiljava da napravimo izbor: val ili var. Gdje val deklarira nepromjenjivu konačnu referencu, a var deklarira varijablu, što pomaže u izbjegavanju široke upotrebe promjenjivih referenci.

Primjer

Sada smo došli do mjesta gdje možemo raditi nešto zanimljivije. Tijekom intervjua često dam zadatak implementirati stablo, obići ga i odrediti neku akciju s elementom. Pogledajmo kako je ovo implementirano u kotlinu.

Ovako bih volio da upotreba izgleda:

Fun main(args: Array ) ( // stvoriti malo stablo val tree= stablo("root") ( čvor("1-1") ( čvor("2-1") čvor("2-2") ) čvor("1-2 " ) ( node("2-3") ) ) // prelazi preko njega i ispisuje vrijednosti u stablo konzole.traverse ( println(it) ) )

Sada pokušajmo ovo implementirati. Kreirajmo klasu čvora stabla:

/** * @param value node data */ class Node (val value:T) ( // node children private val children:List > = arrayList() /** * Metoda koja stvara i dodaje dijete čvoru * @param vrijednost vrijednost za novi čvor * @param init funkcija za inicijalizaciju novog čvora, izborno * parametar */ zabavni čvor(vrijednost: T, init:čvor .()->Jedinica = ()):Čvor ( val čvor = Čvor (vrijednost) node.init() children.add(node) return node ) /** * Metoda rekurzivno prelazi sve podređene čvorove počevši od * samog čvora, svaki čvor je obaviješten o rukovatelju * @param rukovatelj funkcija rukovatelja za vrijednost svakog čvora */ fun traverse(handler:(T)->Unit) ( handler(value) children.forEach ( child -> child.traverse(handler) ) ) )

Dodajmo sada funkciju za stvaranje vrha stabla:

/** * Stvara čvor stabla s vrijednošću vrijednosti i inicijalizira * njegovu djecu metodom init. */ zabavno stablo(vrijednost:T, init:čvor .()->Jedinica): Čvor ( val node = Node(value) // poziva init metodu koja je proslijeđena u // parametru na objektu čvora node.init() return node )

Na dva mjesta u kodu korištena je konstrukcija poput Node.()->Unit, čije značenje je da se kao ulaz očekuje tip funkcije koji će se izvršiti kao metoda objekta tipa Node. Iz tijela ove funkcije postoji pristup drugim metodama ovog objekta, kao što je metoda Node.node(), koja vam omogućuje inicijalizaciju stabla sličnu onoj opisanoj u primjeru.

Umjesto zaključka

Zbog svoje dobre kompatibilnosti s Javom i mogućnosti postupne zamjene starog koda, Kotlin bi u budućnosti mogao postati dobra zamjena za Javu u velikim projektima i prikladan alat za izradu malih projekata s perspektivom njihovog razvoja. Jednostavnost jezika i njegova fleksibilnost daje programeru više mogućnosti za pisanje brzog, ali visokokvalitetnog koda.

Ako vas jezik zanima, sve informacije o jeziku možete pronaći na službenim stranicama projekta, njihove izvore možete pronaći na githubu, a sve pronađene greške možete objaviti u Issue Trackeru. Još uvijek ima mnogo problema, ali programeri jezika aktivno se bore s njima. Sada tim radi na još uvijek ne baš stabilnoj verziji milestone 3, nakon stabilizacije, koliko ja znam, planira se koristiti jezik unutar tvrtke JetBrains, nakon čega je već planirano prvo izdanje.

Oznake:

  • kotlin
  • Java
  • jetbrains
Dodaj oznake

Fun main(args: Array ) ( val brojevi = arrayListOf(15, -5, 11, -39) val nonNegativeNumbers = numbers.filter ( it >= 0 ) println(nonNegativeNumbers) ) // Izlaz: 15, 11

Funkcije višeg reda su funkcije koje uzimaju druge funkcije kao argumente i vraćaju funkcije. Razmotrite sljedeći primjer:

Zabavni alphaNum(func: () -> Jedinica) ()

U njemu je func naziv argumenta, a () -> Jedinica je tip funkcije. Kažemo da će func biti funkcija koja ne prima argumente i ne vraća ništa.

Lambda izrazi ili anonimne funkcije su funkcije koje se ne deklariraju, već se prosljeđuju kao izrazi. Evo primjera:

Zbroj vrijednosti: (Int, Int) -> Int = ( x, y -> x + y )

Deklariramo varijablu sum koja uzima dva broja, zbraja ih i vraća zbroj sveden na cijeli broj. Jednostavan zbroj (2,2) je dovoljan da ga nazovemo.

Usporedba brzine između Jave i Kotlina

Prva izrada Kotlin koda traje otprilike 15-20% duže od istog procesa u Javi. Međutim, Kotlinova inkrementalna izrada čak je malo brža od Javine. Dakle, jezici su približno jednaki u brzini kompilacije.

Budućnost Kotlina

Kotlin je sljedeća evolucija Jave s kojom je u potpunosti kompatibilan. To ga čini izvrsnim alatom za mobilne i poslovne aplikacije. A budući da je Kotlin sada službeni jezik Androida, nema straha da ćete njegovim učenjem ostati bez posla.

Niz članaka pomoći će vam u učenju ovog jezika, opisujući proces stvaranja jednostavne mobilne aplikacije Keddit - klijenta za popularni resurs Reddit. Radi vaše udobnosti, popisali smo sve njegove dijelove na donjem popisu.

Trebat će vam sljedeće biblioteke:

  • Naknada 2.0;
  • RxJava;
  • Picasso;
  • RecyclerView;
  • Kotlin proširenja za Android;
  • Bodež 2.

Svi izvori dostupni su na GitHubu. Serija se sastoji od sljedećih dijelova.

Najbolji članci na temu