Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Gabimet
  • Gjuha e re e programimit Kotlin. Pse Kotlin është kaq i dashur në Google dhe kujt i duhen dy mijë gjuhë programimi

Gjuha e re e programimit Kotlin. Pse Kotlin është kaq i dashur në Google dhe kujt i duhen dy mijë gjuhë programimi

Gjuha e programimit Kotlin, e zhvilluar nga kompania e Shën Petersburgut JetBrains, është bërë gjuha zyrtare e zhvillimit për Android. Kjo u njoftua zyrtarisht në konferencën e Google I/O. Ekipi Kotlin drejtohet nga i diplomuari në Universitetin ITMO, Andrey Breslav. Pse Kotlin është kaq i dashur nga gjigandi i IT në mesin e shumë gjuhëve të tjera "të reja", si dhe pse shfaqen gjuhë të reja programimi në përgjithësi, lexoni në komentet e ekspertëve dhe koleksionin e informacionit ITMO.NEWS.

Si zhvillohen gjuhët e programimit

Sipas vlerësimeve të ndryshme, tashmë ka më shumë se dy mijë gjuhë të ndryshme programimi në botë. Përditësimet po lëshohen vazhdimisht për gjuhët e vjetra dhe po shfaqen edhe gjuhë të reja. Kur sintaksa e një gjuhe nuk ndryshon, por vetëm bëhet më e ndërlikuar dhe e zgjeruar, zhvilluesit i duhet vetëm pak praktikë për të vazhduar të shkruajë në gjuhën e tij të preferuar. Ndonjëherë struktura e vetë gjuhës ndryshon, dhe më pas programuesi ndonjëherë duhet të mësojë përsëri, duke iu përshtatur gjuhës së përditësuar. Në mënyrë tipike, kalimi në një strukturë të re ndodh gradualisht dhe në pjesë, domethënë, vetëm 10-20% e kodit të programit fillon të shkruhet duke përdorur gjuhën e re.

« Programuesit nuk ishin plotësisht të kënaqur me gjuhët C++ dhe Java, sepse këto janë gjuhë mjaft komplekse dhe e para është më e vështirë se e dyta. Prandaj, u shfaq gjuha Scala, të cilën shumë programues e pëlqejnë, por është gjithashtu shumë komplekse. Përvoja e madhe e JetBrains në krijimin e mjeteve të zhvillimit të programeve për gjuhë të ndryshme programimi e lejoi atë të krijojë gjuhën Kotlin në shtatë vjet, e cila është plotësisht e pajtueshme me Java, por më e thjeshtë dhe më e përshtatshme se ajo. Gjuhët e programimit po zhvillohen vazhdimisht; askush nuk i vendos më vetes detyrën për të bërë një gjuhë universale. Pavarësisht kësaj, çdo gjuhë është më efektive në një fushë të caktuar ku përdoret më shpesh. Ekziston edhe një drejtim në krijimin e gjuhëve kur ato zhvillohen për një fushë specifike lëndore“, komentoi kreu i Departamentit të Teknologjisë së Programimit në Universitetin ITMO.


Sot, disa kompani madje përpilojnë vlerësimet e tyre gjuhësore. Për shembull, kompania TIOBE, e specializuar në vlerësimin e cilësisë së softuerit, ka llogaritur çdo muaj indeksin e popullaritetit të gjuhëve të caktuara që nga viti 2001. Lista e krijuar përmban 50 rreshta dhe në mënyrë që një gjuhë programimi të përfshihet në indeks, zhvilluesit duhet t'i shkruajnë një letër përkatëse kompanisë. Llogaritja bazohet në të dhënat nga 25 motorë kërkimi në internet. Deri më tani, Java kryeson me një diferencë të madhe në renditje, e ndjekur nga C. Njëkohësisht, hartuesit e listës theksojnë se gjatë vitit të kaluar, të dyja gjuhët e programimit janë bërë më pak të njohura, me rreth 6%. Në të njëjtën kohë, TIOBE tregon se C ishte gjuha nr. 1 deri në vitin 2002 dhe Java ishte në vendin e 14-të në 1997, por pesë vjet më vonë ajo zëvendësoi C-në në pozicionin e parë.

Ju mund të jepni një leksion të shkëlqyeshëm për historinë e zhvillimit të gjuhëve: kuratori i programeve akademike në Yandex, drejtor i qendrës për garat studentore në Fakultetin e Shkencave Kompjuterike në Shkollën e Lartë të Ekonomisë flet për mënyrën se si gjuhët C , PHP, Ruby dhe Java u shfaqën. Mikhail Gustokashin. Pedagogu thekson se për çdo detyrë duhet zgjedhur një gjuhë programimi e ndryshme. Për shembull, ai thotë se për industrinë ushtarake është më mirë të shkruash në Pascal të vjetër të mirë - një gjuhë që lindi në vitin 1970! Pse? Sepse është më i besueshëm. Aplikacionet e biznesit mund të shkruhen në Java sepse kjo gjuhë është gjithashtu mjaft e besueshme, por shumë më e lehtë për t'u përdorur. Eksperti thekson gjithashtu se është e rëndësishme të ruhet interesi për gjuhën midis programuesve duke krijuar një komunitet zhvilluesish që shkruajnë në këtë gjuhë. Nëse krijohet një infrastrukturë rreth një gjuhe të re dhe njerëzit mblidhen për ta përdorur atë, vetëm atëherë gjuha do të bëhet e njohur. Nga rruga, zhvilluesit e Kotlin miratuan gjithashtu këtë strategji.

Pak për Kotlin

Gjuha e programimit Kotlin filloi të zhvillohej në kompaninë JetBrains në Shën Petersburg në vitin 2010. Lëshimi zyrtar i produktit u lëshua në vitin 2016. Gjuha e mori këtë emër për nder të ishullit në Gjirin e Finlandës në të cilin ndodhet Kronstadt. Në një rastësi interesante, emri i gjuhës popullore Java është gjithashtu emri i një ishulli në Indonezi. Rastësia ndoshta nuk është e rastësishme. Siç thuhet në njoftimin për shtyp, Kotlin duhet të punojë kudo ku funksionon Java, dhe një nga qëllimet ishte të krijonte një produkt që mund të përdoret në projekte të përziera që krijohen në disa gjuhë.


Siç vërejnë autorët e Kotlin, gjëja më e rëndësishme për ta ishte krijimi i një produkti "pragmatik". Kjo do të thotë se ata nuk ishin të fokusuar vetëm në rregullimin e gabimeve dhe përmirësimin e produktit, gjë që do ta bënte çdo programues, por donin të krijonin një mjet të dobishëm.

« Mjetet e zhvillimit, duke përfshirë gjuhët e programimit, janë vazhdimisht në zhvillim. Gjuhët ndryshojnë nga mjetet e tjera në atë që janë mjaft të vështira për t'u zhvilluar në mënyrë evolucionare. Versioni i ri i gjuhës duhet të mbështesë të gjitha programet ekzistuese. Kjo kufizon mundësitë për zhvillimin e gjuhëve ekzistuese dhe krijon nevojën për shfaqjen e gjuhëve të reja. Faktori që përcakton suksesin e një gjuhe të re programimi është, para së gjithash, komoditeti për zhvilluesit. Përveç të qenit konciz dhe shprehës, Kotlin është shumë i pajtueshëm me kodin Java: mund të përdorni të gjitha bibliotekat ekzistuese dhe madje të përzieni kodin në dy gjuhë në një projekt, kështu që nuk ka vështirësi të veçanta në tranzicion.“, komentoi menaxheri i projektit Kotlin në JetBrains, i diplomuar në Universitetin ITMO.

Pse Google e donte Kotlin

Në faqen zyrtare të internetit, zhvilluesit e Android shkruajnë se kanë vëzhguar "ngritjen" e Kotlin viteve të fundit. Punonjësit e Google nuk kanë turp ta përshkruajnë gjuhën si mbresëlënëse, koncize, fuqizuese dhe të këndshme për të punuar. Ka rritur produktivitetin: kodi i programit në të është mesatarisht 40% më i shkurtër se në gjuhët e tjera, dhe Kotlin gjithashtu ju lejon të shmangni disa gabime në kod. Një nga faktorët përcaktues për popullaritetin e Kotlin në Google ishte se ai është i pajtueshëm me Java, e cila tashmë përdoret në zhvillimin e aplikacioneve për Android.

Tani, kur programuesit fillojnë të krijojnë një aplikacion të ri në mjedisin zyrtar të zhvillimit të Android Studio, ata mund të aktivizojnë menjëherë shtojcën "mbështetje Kotlin". Ju gjithashtu mund të konvertoni linja kodi të krijuara tashmë në gjuhë të tjera në gjuhën Kotlin, të futni blloqe në gjuhë të tjera në linja kodi në Kotlin. Në të ardhmen, do të zhvillohen më shumë biblioteka dhe mjete për gjuhën, do të zhvillohen më shumë materiale trajnimi dhe do të jetë më e lehtë për të gjetur zgjidhje për problemet e mundshme.

« Mungesa e garancive të mbështetjes gjuhësore nga Google dekurajoi shumë zhvillues që të kalonin në Kotlin. Edhe nëse ju pëlqen vërtet gjuha,Një programues gjithmonë mendon për rrezikun që në një moment kjo gjuhë thjesht të ndalojë së punuari. Tani ka një garanci që Kotlin nuk do të ndalojë së punuari dhe ne presim që numri i përdoruesve të gjuhës të rritet ndjeshëm. Do të ishte e natyrshme të supozohej se shumë kompani përfundimisht do të kalojnë plotësisht në Kotlin, megjithëse teknikisht asgjë nuk i detyron ata ta bëjnë këtë, është thjesht një çështje preference.“- theksoi Andrey Breslav.

Ai shtoi se Kotlin po zhvillohet në mënyrë shumë aktive. Ekipi i zhvillimit aktualisht është duke punuar në sistemin e ndërtimit, shpejtësinë e përpilimit, përmirësimin e performancës IDE, shtimin e veçorive të reja në paketën e veglave, duke përfshirë ato që lidhen me integrimin në Android Studio. Po punohet gjithashtu për projekte me shumë platforma (mundësia për të përpiluar të njëjtin kod për disa platforma), dhe një numër përmirësimesh gjuhësore janë në fazën e projektimit.


Google theksoi gjithashtu se janë frymëzuar nga koncepti i gjuhës Kotlin, sipas të cilit ajo ka qenë dhe do të mbetet gjithmonë falas për zhvilluesit, domethënë një projekt me kod të hapur. Kjo do të thotë që gjuha nuk është e lidhur me ndonjë kompani të veçantë dhe kodi burim shpërndahet nën një licencë falas. Ju mund ta shkarkoni produktin. Për të mbështetur zhvillimin e Kotlin, Google dhe JetBrains do të krijojnë një partneritet jofitimprurës. Gjithashtu, si pjesë e “misionit” të Android, është shumë e rëndësishme që autorët e Kotlin të krijojnë një komunitet njerëzish rreth produktit të tyre, të cilët janë të përfshirë profesionalisht në zhvillimin e kësaj gjuhe dhe duan të ndajnë përvojën e tyre. Për shembull, në nëntor konferenca Kotlin do të mbahet në Shtetet e Bashkuara dhe zhvilluesit mund të marrin gjithashtu lajme dhe këshilla të përditshme rreth produktit softuer dhe të takohen në nivel lokal.

Nga rruga, vetë projekti Android Studio u zhvillua në bazë të mjedisit të zhvillimit të softuerit IntelliJ IDEA, i cili u krijua gjithashtu nga JetBrains. Por pavarësisht bashkëpunimit të ngushtë, kompania e Shën Petersburgut thekson se nuk flitet për ndonjë shitje të JetBrains te gjigandi amerikan i IT. Në të njëjtën kohë, Koltin nuk do të jetë i dizajnuar vetëm për Android. Qëllimi i kompanisë është ta bëjë gjuhën e programimit të përshtatshme për platforma të ndryshme zhvillimi.

Ky artikull flet për gjuhën e programimit Kotlin. Do të mësoni për arsyet e shfaqjes së projektit, aftësitë e gjuhës dhe do të shihni disa shembuj. Artikulli u shkrua kryesisht me shpresën që lexuesi të njihet me gjuhën e programimit java, megjithatë, ata që dinë një gjuhë tjetër do të jenë gjithashtu në gjendje të marrin një ide për temën. Artikulli është sipërfaqësor dhe nuk trajton çështje që lidhen me përpilimin në javascript. Dokumentacionin e plotë mund ta gjeni në faqen zyrtare të projektit, por do të përpiqem të flas shkurtimisht për gjuhën.

rreth projektit

Jo shumë kohë më parë, JetBrains, një kompani që krijon mjedise zhvillimi, njoftoi produktin e saj të ri - gjuhën e programimit Kotlin. Një valë kritikash goditi kompaninë: kritikët sugjeruan që kompania të vinte në vete dhe të plotësonte shtojcën për Scala, në vend që të zhvillonte gjuhën e saj. Zhvilluesve të Scala me të vërtetë u mungon një mjedis i mirë zhvillimi, por problemet e zhvilluesve të shtojcave janë të kuptueshme: Scala, e cila lindi falë studiuesve nga Zvicra, ka inkorporuar shumë koncepte dhe qasje shkencore novatore, gjë që e ka bërë krijimin e një mjeti të mirë zhvillimi një detyrë jashtëzakonisht të vështirë. . Për momentin, segmenti i gjuhëve moderne të shtypura statike për JVM është i vogël, kështu që vendimi për të krijuar gjuhën tuaj së bashku me një mjedis zhvillimi për të duket shumë largpamës. Edhe nëse kjo gjuhë nuk zë rrënjë fare në komunitet, JetBrains e bën atë kryesisht për nevojat e saj. Çdo programues Java mund t'i kuptojë këto nevoja: Java si gjuhë po zhvillohet shumë ngadalë, veçoritë e reja nuk po shfaqen në gjuhë (ne kemi pritur për funksione të rendit të parë për disa vite tashmë), përputhshmëria me versionet më të vjetra të gjuhës e bën atë e pamundur që shumë gjëra të dobishme të shfaqen në të ardhmen e afërt (për shembull, parametrizimi i tipit të mirë). Për një kompani që zhvillon softuer, gjuha e programimit është mjeti kryesor i punës, prandaj efikasiteti dhe thjeshtësia e gjuhës janë tregues nga të cilët varet jo vetëm lehtësia e zhvillimit të mjeteve për të, por edhe kostot e kodimit të programuesit, d.m.th sa e lehtë do të jetë. të jetë për të ruajtur këtë kod dhe për ta kuptuar atë.

Rreth gjuhës

Gjuha është e shtypur në mënyrë statike. Por në krahasim me java, përpiluesi Kotlin shton informacion në llojin nëse referenca mund të përmbajë null, gjë që shtrëngon kontrollin e tipit dhe e bën ekzekutimin më të sigurt:

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

Përkundër faktit se kjo qasje mund ta shpëtojë programuesin nga një sërë problemesh që lidhen me NPE, për një programues Java në fillim duket e panevojshme - duhet të bëni kontrolle ose konvertime të panevojshme. Por pas njëfarë kohe programimi në kotlin, duke u kthyer në java, ju mendoni se ju mungon ky informacion për llojin dhe mendoni të përdorni shënimet Nullable/NotNull. Të lidhura me këtë janë çështjet e përputhshmërisë së prapambetur me java - ky informacion nuk është në bytecode java, por me sa di unë, kjo çështje është ende në proces të zgjidhjes, dhe tani për tani të gjitha llojet që vijnë nga java janë të anulueshme.

Nga rruga, në lidhje me pajtueshmërinë e prapambetur: Kotlin është përpiluar në bytecode JVM (krijuesit e gjuhës shpenzojnë shumë përpjekje për të ruajtur përputhshmërinë), gjë që lejon që ajo të përdoret në të njëjtin projekt me java, dhe aftësinë për të përdorur reciprokisht java dhe klasat Kotlin e bëjnë pragun për futjen e Kotlin në një projekt të madh ekzistues shumë minimal java. Në këtë drejtim, aftësia për të përdorur zhvillime të shumta java duke krijuar një projekt tërësisht në kotlin është e rëndësishme. Për shembull, ishte pothuajse e lehtë për mua të bëja një projekt të vogël të bazuar në pranverë-webmvc.

Le të shohim fragmentin e kontrolluesit:

Klasa e kontrolluesit Path(array("/notes/")) NotesController ( val notes privat me kabllo automatikeShërbimi: NotesService? = shtegu null(array("të gjitha")) argëtim të gjitha() = render("shënime/shënime") ( addObject(" shënime", shënimeShërbimi!!.të gjitha) ) //... )

Veçoritë e përdorimit të shënimeve në Kotlin janë të dukshme: në disa vende nuk duket aq i pastër sa në java (kjo vlen për raste të veçanta, për shembull, një grup prej një elementi), por shënimet mund të përdoren si fjalë kyçe "shtëpi" si p.sh. si automatik ose kontrollues (nëse specifikoni një lloj pseudonimi kur importoni), dhe për sa i përket aftësive, shënimet janë më afër klasave reale.

Duhet të theksohet se Spring nuk ishte në gjendje të mbyllte klasat e Kotlin për të menaxhuar transaksionet - shpresoj se kjo do të jetë e mundur në të ardhmen.

Gjuha ka mbështetje për funksionet e klasit të parë. Kjo do të thotë që një funksion është një lloj i integruar në gjuhë për të cilin ekziston një sintaksë e veçantë. Funksionet mund të krijohen në nivel lokal, të kalohen si parametra në funksione të tjera dhe referencat për to të ruhen:

Fun doSomething(thing:()->Unit) ( // deklaro një parametër të tipit të funksionit // ()-> Njësia nuk pranon asgjë dhe // nuk kthen asgjë të rëndësishme() // thirrje ) doSomething() ( // dhe këtu në fluturim krijojmë një funksion të tipit // ()->Njësi dhe ia kalojmë funksionit doShomething // nëse funksioni është parametri i fundit, mund ta // zhvendosni jashtë kllapave të thirrjes println("Hello world "))

Nëse kësaj shtese i shtojmë funksione që na lejojnë të zgjerojmë një klasë tashmë ekzistuese duke përdorur një metodë që nuk cenon kapsulimin e klasës, por që mund të aksesohet si metoda të kësaj klase, atëherë do të marrim një mekanizëm mjaft të fuqishëm për zgjerimin bibliotekat standarde java që janë mjaft të varfra për sa i përket komoditetit. Sipas traditës, le të shtojmë aftësinë për të filtruar listën që ekziston tashmë në bibliotekën standarde:

Argëtim Listë .filter(kushti:(T)->Boolean):Lista ( val rezultat = lista () for(artikull në këtë) ( if(kushti(artikull)) result.add(artikull) ) kthe rezultat ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Ju lutemi vini re se variablat nuk kanë lloje të specifikuara - përpiluesi Kotlin i nxjerr ato nëse është e mundur dhe nuk ndërhyn në kuptueshmërinë e ndërfaqes. Në përgjithësi, gjuha është krijuar në atë mënyrë që të shpëtojë sa më shumë që të jetë e mundur personin në tastierë nga shtypja e karaktereve të panevojshme: sintaksë e shkurtër por e qartë me një minimum fjalë kyçe, nuk ka nevojë për pikëpresje për të ndarë shprehjet, shkruani konkluzionet aty ku është e përshtatshme. , asnjë fjalë kyçe e re për të krijuar klasë - vetëm ajo që është e nevojshme.

Për të ilustruar temën e klasave dhe shkurtësinë, le të shohim kodin e mëposhtëm:

// krijimi i klasave bean bëhet // lakonike, fushat mund të deklarohen // direkt në klasën e deklarimit të konstruktorit TimeLord(val emri:String) // klasa mund të mos ketë fare një trup të klasës TARDIS(pronari val:TimeLord) kryesore argëtuese (argumentet: Array ) ( val doktor = TimeLord("Doktor") val tardis = TARDIS(mjek) println(tardis.pronarit.emër) )

Në pak rreshta, ne mundëm të deklaronim dy klasa, të krijonim dy objekte dhe të printonim emrin e pronarit të TARDIS! Mund të vërehet se klasa është deklaruar me parametrat e konstruktorit të saj të vetëm të mundshëm, të cilët janë edhe deklarimi i vetive të saj. Jashtëzakonisht i shkurtër, por informues. Me siguri do të ketë nga ata që do të dënojnë pamundësinë për të deklaruar më shumë se një konstruktor, por mua më duket se kjo ka pragmatizmin e vet - në fund të fundit, disa konstruktorë në java ose ju lejojnë të deklaroni parametrat e paracaktuar, të cilat Kotlin i mbështet në gjuhë nivel, ose konvertoni një lloj në një tjetër, me të cilin do të funksionojë kjo klasë, dhe kjo tashmë mund t'i lihet në mënyrë të sigurt metodës së fabrikës. Kushtojini vëmendje deklarimit të "variablave" dhe fushave. Kotlin na detyron të bëjmë një zgjedhje: val ose var. Ku val deklaron një referencë përfundimtare të pandryshueshme, dhe var deklaron një ndryshore, e cila ndihmon në shmangien e përdorimit të gjerë të referencave të ndryshueshme.

Shembull

Tani kemi arritur në vendin ku mund të bëjmë diçka më interesante. Gjatë intervistave, unë shpesh jap detyrën për të zbatuar një pemë, për ta kapërcyer atë dhe për të përcaktuar ndonjë veprim me një element. Le të shohim se si zbatohet kjo në kotlin.

Kështu do të doja të dukej përdorimi:

Kryesor argëtues (args: Array ) ( // krijoni një pemë të vogël val pemë = pemë ("rrënja") ( nyje ("1-1") ( nyje ("2-1") nyje ("2-2") ) nyje ("1-2" " ) ( nyja ("2-3") ) ) // përshkoni atë dhe printoni vlerat në pemën e konsolës.traverse (println(it)))

Tani le të përpiqemi ta zbatojmë këtë. Le të krijojmë një klasë nyje peme:

/** * @param vlera e të dhënave të nyjes */ klasa Nyja (vlera val:T) ( // nyja e fëmijëve fëmijët privatë val:Lista > = arrayList() /** * Metoda që krijon dhe shton një fëmijë në një nyje * @param vlerën e vlerës për nyjen e re * Funksioni init @param për të inicializuar nyjen e re, opsional * parametri */ nyja argëtuese(vlera: T, fillimi: Nyja .()->Njësi = ()):Nyja (nyja val = Nyja (vlera) node.init() children.add(node) return node ) /** * Metoda përshkon në mënyrë rekursive të gjitha nyjet fëmijë duke filluar nga vetë nyja *, secila nyje njoftohet për një mbajtës * @param mbajtës funksioni mbajtës për vlera e secilës nyje */ traverse argëtuese(handler:(T)->Njësi) (trajtues(vlera) fëmijët.forEach (fëmijë -> fëmijë.përshkim(trajtimtar)) )

Tani le të shtojmë një funksion për të krijuar majën e pemës:

/** * Krijon një nyje peme me vlerë vlere dhe inicializon * fëmijët e saj me metodën init. */ argëtim pema (vlera: T, fillimi: nyja .()->Njësi): Nyje ( nyja val = Nyja(vlera) // thirrja e metodës init të kaluar në parametrin // në nyjen e objektit të nyjës.init() nyja kthyese)

Në dy vende të kodit është përdorur një konstruksion si Node.()->Njësi, kuptimi i tij është se si hyrje pritet një lloj funksioni, i cili do të ekzekutohet si metodë e një objekti të tipit Node. Nga trupi i këtij funksioni ka qasje në metoda të tjera të këtij objekti, siç është metoda Node.node(), e cila ju lejon të bëni inicializimin e pemës të ngjashme me atë të përshkruar në shembull.

Në vend të një përfundimi

Për shkak të pajtueshmërisë së tij të mirë me Java dhe aftësisë për të zëvendësuar gradualisht kodin e vjetër, në të ardhmen Kotlin mund të bëhet një zëvendësim i mirë për java-n në projekte të mëdha dhe një mjet i përshtatshëm për krijimin e projekteve të vogla me perspektivën e zhvillimit të tyre. Thjeshtësia e gjuhës dhe fleksibiliteti i saj i jep zhvilluesit më shumë mundësi për të shkruar kod të shpejtë por me cilësi të lartë.

Nëse jeni të interesuar për gjuhën, të gjitha informacionet rreth gjuhës mund të gjenden në faqen zyrtare të projektit, burimet e tyre mund të gjenden në github dhe çdo gabim i gjetur mund të postohet në gjurmuesin e çështjeve. Ka ende shumë probleme, por zhvilluesit e gjuhës po i luftojnë në mënyrë aktive ato. Tani ekipi është duke punuar në versionin jo shumë të qëndrueshëm të milestone 3, pas stabilizimit, me sa di unë, është planifikuar të përdoret gjuha brenda kompanisë JetBrains, pas së cilës është planifikuar tashmë lëshimi i parë.

Etiketa: Shtoni etiketa

Në vitin 2010, një grup zhvilluesish nga dega ruse e JetBrains u përpoqën të zhvillonin një gjuhë që do të ishte më e përshtatshme dhe më e sigurt se Java, por jo aq komplekse sa Scala. Emri i kësaj gjuhe u dha për nder të ishullit Kotlin, i vendosur në Gjirin e Finlandës (për analogji me Java, i cili gjithashtu është emëruar pas ishullit).

Nëse shikoni ndonjë përmbledhje moderne të gjuhëve më premtuese të programimit, duke përfshirë, sigurisht që do të gjeni Kotlin atje. Cili është thelbi i kësaj gjuhe, pse të gjithëve u pëlqen kaq shumë, çfarë perspektive ka - më shumë për këtë më vonë.

Sintaksë

Ideja për të krijuar një gjuhë që është po aq e përshtatshme si për fillestarët ashtu edhe për zhvilluesit me përvojë shprehet drejtpërdrejt në sintaksën e saj. Si çdo analog modern, Kotlin është jashtëzakonisht konciz, kompakt dhe i kuptueshëm. Një sasi e madhe kodi që më parë duhej të shkruhej në Java, tani thjesht mund të injorohet. Një shembull i thjeshtë: përdorimi i një pikëpresjeje për të ndarë deklaratat nuk është një kërkesë - përpiluesi tani kupton gjithçka vetë nëse thjesht shkoni në një rresht të ri. Gjatë deklarimit të variablave, në shumë raste nuk është e nevojshme të specifikohet lloji - ai do të përcaktohet automatikisht.

Në të njëjtën kohë, duhet thënë se Kotlin, përsa i përket regjistrimit, i është rikthyer pak stilit Pascal – edhe këtu qartësia mbizotëron mbi qartësinë e strukturave. Mund të lexoni pak më shumë rreth kësaj në këtë artikull të shkurtër. Ai mbulon vetëm parimet bazë të ndërtimit të gjuhëve Java dhe Kotlin, kështu që do të jetë e kuptueshme për absolutisht të gjithë.

Sidoqoftë, ne do të lëmë përsëri një pjesë të vogël të kodit:

kryesore argëtuese (args: Array ) {
val scope = "botë"
println ("Përshëndetje, $scope!")
}

Një hyrje jashtëzakonisht e thjeshtë që duhet të jetë e kuptueshme për këdo që ka studiuar programim në shkollë ose universitet për të paktën një vit.

Është e rëndësishme të përmendet se Kotlin është plotësisht në përputhje me Java. Kjo është arsyeja pse në fillim u konsiderua si sheqer i thjeshtë sintaksor, i përdorur për detyra komplekse ku thjesht donte të kursente kohë dhe përpjekje.

Përparësitë

Në përgjithësi, të gjitha avantazhet në krahasim me Java janë përmendur tashmë, kështu që ne thjesht do t'i mbledhim ato në një vend:

    Vëllimi i kodit. Mospërdorimi i pjesëve të panevojshme arkaike të kodit përshpejton procesin e zhvillimit dhe rrit lexueshmërinë;

    Siguria. Rregullat për krijimin e kodit të ngulitur në sintaksën e gjuhës ju lejojnë të shmangni gabime të vogla, të vështira për t'u gjurmuar që lindin vetëm gjatë ekzekutimit të programit;

    Pajtueshmëria në Java. Kjo është e përshtatshme si nga pikëpamja e të mësuarit të një gjuhe të re, ashtu edhe nga pikëpamja e transferimit gradualisht të produkteve tuaja softuerike nga Java në Kotlin. Për shembull, kjo është pikërisht ajo që ndodhi me aplikacionin Basecamp.

Të metat

Si një gjuhë që u zhvillua bazuar në Java, Kotlin ka dy disavantazhe të dukshme në krahasim: shpejtësinë dhe përpunimin. Në rastin e parë, gjithçka është e qartë: duke punuar në JVM është e vështirë të mposhtet Java për sa i përket performancës. Problemi i dytë është pak i largët për një gjuhë kaq të re, sepse ka pak më shumë se një vit që është në qarkullim zyrtar. Po, ka shumë më pak mjete dhe biblioteka këtu sesa në Java. Por, së pari, kjo nuk është ende kritike, dhe së dyti, në botën Java, sasia nuk është përkthyer gjithmonë në cilësi.

Kotlin, tani për tani, përballon detyrat e tij kryesore, dhe pajtueshmëria e plotë me Java na ndihmon të mbyllim sytë ndaj këtyre boshllëqeve.

Perspektivat

Përkundër faktit se zhvillimi i Kotlin filloi në 2010, versioni i parë zyrtar u lëshua vetëm në shkurt 2016. Që atëherë, kërkesa për gjuhën është rritur me shpejtësi, në vlerësimin TIOBE ajo u fut në TOP-50 brenda një viti. , dhe muajin e kaluar në konferencën e Google I /O njoftoi mbështetjen zyrtare për Kotlin në sistemin e zhvillimit të aplikacioneve Android.

Duke marrë parasysh popullaritetin e lartë të IntelliJ IDEA midis zhvilluesve dhe fokusin strategjik të kompanisë në Kotlin, mund të themi me besim se në 3-4 vjet do ta shohim atë në mesin e konkurrentëve të plotë të Java dhe Swift në fushën e zhvillimit celular. Përveç kësaj, nëse krijuesit e gjuhës nuk janë të zhgënjyer në produktin e tyre, Kotlin me siguri do të vazhdojë të kapë seriozisht horizonte të tjera: ueb, AI, Interneti i gjërave, të dhëna të mëdha, aplikacione desktop.

Nëse jeni seriozisht të interesuar për këtë gjuhë, atëherë sigurohuni që të hidhni një sy në faqen e saj zyrtare (versioni rus) dhe të përjetoni të gjitha avantazhet e saj nga përvoja personale. Nxitoni përpara se të bëhet e zakonshme.

Ky artikull flet për gjuhën e programimit Kotlin. Do të mësoni për arsyet e shfaqjes së projektit, aftësitë e gjuhës dhe do të shihni disa shembuj. Artikulli u shkrua kryesisht me shpresën që lexuesi të njihet me gjuhën e programimit java, megjithatë, ata që dinë një gjuhë tjetër do të jenë gjithashtu në gjendje të marrin një ide për temën. Artikulli është sipërfaqësor dhe nuk trajton çështje që lidhen me përpilimin në javascript. Dokumentacionin e plotë mund ta gjeni në faqen zyrtare të projektit, por do të përpiqem të flas shkurtimisht për gjuhën.

rreth projektit

Jo shumë kohë më parë, JetBrains, një kompani që krijon mjedise zhvillimi, njoftoi produktin e saj të ri - gjuhën e programimit Kotlin. Një valë kritikash goditi kompaninë: kritikët sugjeruan që kompania të vinte në vete dhe të plotësonte shtojcën për Scala, në vend që të zhvillonte gjuhën e saj. Zhvilluesve të Scala me të vërtetë u mungon një mjedis i mirë zhvillimi, por problemet e zhvilluesve të shtojcave janë të kuptueshme: Scala, e cila lindi falë studiuesve nga Zvicra, ka inkorporuar shumë koncepte dhe qasje shkencore novatore, gjë që e ka bërë krijimin e një mjeti të mirë zhvillimi një detyrë jashtëzakonisht të vështirë. . Për momentin, segmenti i gjuhëve moderne të shtypura statike për JVM është i vogël, kështu që vendimi për të krijuar gjuhën tuaj së bashku me një mjedis zhvillimi për të duket shumë largpamës. Edhe nëse kjo gjuhë nuk zë rrënjë fare në komunitet, JetBrains e bën atë kryesisht për nevojat e saj. Çdo programues Java mund t'i kuptojë këto nevoja: Java si gjuhë po zhvillohet shumë ngadalë, veçoritë e reja nuk po shfaqen në gjuhë (ne kemi pritur për funksione të rendit të parë për disa vite tashmë), përputhshmëria me versionet më të vjetra të gjuhës e bën atë e pamundur që shumë gjëra të dobishme të shfaqen në të ardhmen e afërt (për shembull, parametrizimi i tipit të mirë). Për një kompani që zhvillon softuer, gjuha e programimit është mjeti kryesor i punës, prandaj efikasiteti dhe thjeshtësia e gjuhës janë tregues nga të cilët varet jo vetëm lehtësia e zhvillimit të mjeteve për të, por edhe kostot e kodimit të programuesit, d.m.th sa e lehtë do të jetë. të jetë për të ruajtur këtë kod dhe për ta kuptuar atë.

Rreth gjuhës

Gjuha është e shtypur në mënyrë statike. Por në krahasim me java, përpiluesi Kotlin shton informacion në llojin nëse referenca mund të përmbajë null, gjë që shtrëngon kontrollin e tipit dhe e bën ekzekutimin më të sigurt:

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

Përkundër faktit se kjo qasje mund ta shpëtojë programuesin nga një sërë problemesh që lidhen me NPE, për një programues Java në fillim duket e panevojshme - duhet të bëni kontrolle ose konvertime të panevojshme. Por pas njëfarë kohe programimi në kotlin, duke u kthyer në java, ju mendoni se ju mungon ky informacion për llojin dhe mendoni të përdorni shënimet Nullable/NotNull. Të lidhura me këtë janë çështjet e përputhshmërisë së prapambetur me java - ky informacion nuk është në bytecode java, por me sa di unë, kjo çështje është ende në proces të zgjidhjes, dhe tani për tani të gjitha llojet që vijnë nga java janë të anulueshme.

Nga rruga, në lidhje me pajtueshmërinë e prapambetur: Kotlin është përpiluar në bytecode JVM (krijuesit e gjuhës shpenzojnë shumë përpjekje për të ruajtur përputhshmërinë), gjë që lejon që ajo të përdoret në të njëjtin projekt me java, dhe aftësinë për të përdorur reciprokisht java dhe klasat Kotlin e bëjnë pragun për futjen e Kotlin në një projekt të madh ekzistues shumë minimal java. Në këtë drejtim, aftësia për të përdorur zhvillime të shumta java duke krijuar një projekt tërësisht në kotlin është e rëndësishme. Për shembull, ishte pothuajse e lehtë për mua të bëja një projekt të vogël të bazuar në pranverë-webmvc.

Le të shohim fragmentin e kontrolluesit:

Klasa e kontrolluesit Path(array("/notes/")) NotesController ( val notes privat me kabllo automatikeShërbimi: NotesService? = shtegu null(array("të gjitha")) argëtim të gjitha() = render("shënime/shënime") ( addObject(" shënime", shënimeShërbimi!!.të gjitha) ) //... )

Veçoritë e përdorimit të shënimeve në Kotlin janë të dukshme: në disa vende nuk duket aq i pastër sa në java (kjo vlen për raste të veçanta, për shembull, një grup prej një elementi), por shënimet mund të përdoren si fjalë kyçe "shtëpi" si p.sh. si automatik ose kontrollues (nëse specifikoni një lloj pseudonimi kur importoni), dhe për sa i përket aftësive, shënimet janë më afër klasave reale.

Duhet të theksohet se Spring nuk ishte në gjendje të mbyllte klasat e Kotlin për të menaxhuar transaksionet - shpresoj se kjo do të jetë e mundur në të ardhmen.

Gjuha ka mbështetje për funksionet e klasit të parë. Kjo do të thotë që një funksion është një lloj i integruar në gjuhë për të cilin ekziston një sintaksë e veçantë. Funksionet mund të krijohen në nivel lokal, të kalohen si parametra në funksione të tjera dhe referencat për to të ruhen:

Fun doSomething(thing:()->Unit) ( // deklaro një parametër të tipit të funksionit // ()-> Njësia nuk pranon asgjë dhe // nuk kthen asgjë të rëndësishme() // thirrje ) doSomething() ( // dhe këtu në fluturim krijojmë një funksion të tipit // ()->Njësi dhe ia kalojmë funksionit doShomething // nëse funksioni është parametri i fundit, mund ta // zhvendosni jashtë kllapave të thirrjes println("Hello world "))

Nëse kësaj shtese i shtojmë funksione që na lejojnë të zgjerojmë një klasë tashmë ekzistuese duke përdorur një metodë që nuk cenon kapsulimin e klasës, por që mund të aksesohet si metoda të kësaj klase, atëherë do të marrim një mekanizëm mjaft të fuqishëm për zgjerimin bibliotekat standarde java që janë mjaft të varfra për sa i përket komoditetit. Sipas traditës, le të shtojmë aftësinë për të filtruar listën që ekziston tashmë në bibliotekën standarde:

Argëtim Listë .filter(kushti:(T)->Boolean):Lista ( val rezultat = lista () for(artikull në këtë) ( if(kushti(artikull)) result.add(artikull) ) kthe rezultat ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Ju lutemi vini re se variablat nuk kanë lloje të specifikuara - përpiluesi Kotlin i nxjerr ato nëse është e mundur dhe nuk ndërhyn në kuptueshmërinë e ndërfaqes. Në përgjithësi, gjuha është krijuar në atë mënyrë që të shpëtojë sa më shumë që të jetë e mundur personin në tastierë nga shtypja e karaktereve të panevojshme: sintaksë e shkurtër por e qartë me një minimum fjalë kyçe, nuk ka nevojë për pikëpresje për të ndarë shprehjet, shkruani konkluzionet aty ku është e përshtatshme. , asnjë fjalë kyçe e re për të krijuar klasë - vetëm ajo që është e nevojshme.

Për të ilustruar temën e klasave dhe shkurtësinë, le të shohim kodin e mëposhtëm:

// krijimi i klasave bean bëhet // lakonike, fushat mund të deklarohen // direkt në klasën e deklarimit të konstruktorit TimeLord(val emri:String) // klasa mund të mos ketë fare një trup të klasës TARDIS(pronari val:TimeLord) kryesore argëtuese (argumentet: Array ) ( val doktor = TimeLord("Doktor") val tardis = TARDIS(mjek) println(tardis.pronarit.emër) )

Në pak rreshta, ne mundëm të deklaronim dy klasa, të krijonim dy objekte dhe të printonim emrin e pronarit të TARDIS! Mund të vërehet se klasa është deklaruar me parametrat e konstruktorit të saj të vetëm të mundshëm, të cilët janë edhe deklarimi i vetive të saj. Jashtëzakonisht i shkurtër, por informues. Me siguri do të ketë nga ata që do të dënojnë pamundësinë për të deklaruar më shumë se një konstruktor, por mua më duket se kjo ka pragmatizmin e vet - në fund të fundit, disa konstruktorë në java ose ju lejojnë të deklaroni parametrat e paracaktuar, të cilat Kotlin i mbështet në gjuhë nivel, ose konvertoni një lloj në një tjetër, me të cilin do të funksionojë kjo klasë, dhe kjo tashmë mund t'i lihet në mënyrë të sigurt metodës së fabrikës. Kushtojini vëmendje deklarimit të "variablave" dhe fushave. Kotlin na detyron të bëjmë një zgjedhje: val ose var. Ku val deklaron një referencë përfundimtare të pandryshueshme, dhe var deklaron një ndryshore, e cila ndihmon në shmangien e përdorimit të gjerë të referencave të ndryshueshme.

Shembull

Tani kemi arritur në vendin ku mund të bëjmë diçka më interesante. Gjatë intervistave, unë shpesh jap detyrën për të zbatuar një pemë, për ta kapërcyer atë dhe për të përcaktuar ndonjë veprim me një element. Le të shohim se si zbatohet kjo në kotlin.

Kështu do të doja të dukej përdorimi:

Kryesor argëtues (args: Array ) ( // krijoni një pemë të vogël val pemë = pemë ("rrënja") ( nyje ("1-1") ( nyje ("2-1") nyje ("2-2") ) nyje ("1-2" " ) ( nyja ("2-3") ) ) // përshkoni atë dhe printoni vlerat në pemën e konsolës.traverse (println(it)))

Tani le të përpiqemi ta zbatojmë këtë. Le të krijojmë një klasë nyje peme:

/** * @param vlera e të dhënave të nyjes */ klasa Nyja (vlera val:T) ( // nyja e fëmijëve fëmijët privatë val:Lista > = arrayList() /** * Metoda që krijon dhe shton një fëmijë në një nyje * @param vlerën e vlerës për nyjen e re * Funksioni init @param për të inicializuar nyjen e re, opsional * parametri */ nyja argëtuese(vlera: T, fillimi: Nyja .()->Njësi = ()):Nyja (nyja val = Nyja (vlera) node.init() children.add(node) return node ) /** * Metoda përshkon në mënyrë rekursive të gjitha nyjet fëmijë duke filluar nga vetë nyja *, secila nyje njoftohet për një mbajtës * @param mbajtës funksioni mbajtës për vlera e secilës nyje */ traverse argëtuese(handler:(T)->Njësi) (trajtues(vlera) fëmijët.forEach (fëmijë -> fëmijë.përshkim(trajtimtar)) )

Tani le të shtojmë një funksion për të krijuar majën e pemës:

/** * Krijon një nyje peme me vlerë vlere dhe inicializon * fëmijët e saj me metodën init. */ argëtim pema (vlera: T, fillimi: nyja .()->Njësi): Nyje ( nyja val = Nyja(vlera) // thirrja e metodës init të kaluar në parametrin // në nyjen e objektit të nyjës.init() nyja kthyese)

Në dy vende të kodit është përdorur një konstruksion si Node.()->Njësi, kuptimi i tij është se si hyrje pritet një lloj funksioni, i cili do të ekzekutohet si metodë e një objekti të tipit Node. Nga trupi i këtij funksioni ka qasje në metoda të tjera të këtij objekti, siç është metoda Node.node(), e cila ju lejon të bëni inicializimin e pemës të ngjashme me atë të përshkruar në shembull.

Në vend të një përfundimi

Për shkak të pajtueshmërisë së tij të mirë me Java dhe aftësisë për të zëvendësuar gradualisht kodin e vjetër, në të ardhmen Kotlin mund të bëhet një zëvendësim i mirë për java-n në projekte të mëdha dhe një mjet i përshtatshëm për krijimin e projekteve të vogla me perspektivën e zhvillimit të tyre. Thjeshtësia e gjuhës dhe fleksibiliteti i saj i jep zhvilluesit më shumë mundësi për të shkruar kod të shpejtë por me cilësi të lartë.

Nëse jeni të interesuar për gjuhën, të gjitha informacionet rreth gjuhës mund të gjenden në faqen zyrtare të projektit, burimet e tyre mund të gjenden në github dhe çdo gabim i gjetur mund të postohet në gjurmuesin e çështjeve. Ka ende shumë probleme, por zhvilluesit e gjuhës po i luftojnë në mënyrë aktive ato. Tani ekipi është duke punuar në versionin jo shumë të qëndrueshëm të milestone 3, pas stabilizimit, me sa di unë, është planifikuar të përdoret gjuha brenda kompanisë JetBrains, pas së cilës është planifikuar tashmë lëshimi i parë.

Etiketa:

  • kotlin
  • java
  • jet trurit
Shto etiketa

Kryesor argëtues (args: Array ) ( val numra = arrayListOf(15, -5, 11, -39) val nonNegativeNumbers = numrat.filter ( it >= 0 ) println(numrat jonegativ) ) // Dalja: 15, 11

Funksionet e rendit më të lartë janë funksione që marrin funksione të tjera si argumente dhe funksione kthyese. Merrni parasysh shembullin e mëposhtëm:

Fun alphaNum(func: () -> Njësia) ()

Në të, func është emri i argumentit, dhe () -> Njësia është lloji i funksionit. Ne themi se func do të jetë një funksion që nuk merr argumente dhe nuk kthen asgjë.

Shprehjet lambda, ose funksionet anonime, janë funksione që nuk deklarohen, por kalohen si shprehje. Ja një shembull:

Shuma e vlerave: (Int, Int) -> Int = ( x, y -> x + y )

Ne deklarojmë një shumë të ndryshueshme që merr dy numra, i mbledh dhe e kthen shumën e reduktuar në një numër të plotë. Mjafton një shumë e thjeshtë (2,2) për ta quajtur atë.

Krahasimi i shpejtësisë midis Java dhe Kotlin

Ndërtimi i parë i kodit Kotlin zgjat afërsisht 15–20% më shumë se i njëjti proces në Java. Sidoqoftë, ndërtimi në rritje i Kotlin është edhe pak më i shpejtë se ai i Java. Kështu, gjuhët janë afërsisht të barabarta në shpejtësinë e përpilimit.

E ardhmja e Kotlin

Kotlin është evolucioni i radhës i Java, me të cilin është plotësisht i pajtueshëm. Kjo e bën atë një mjet të shkëlqyeshëm për aplikacionet celulare dhe të ndërmarrjeve. Dhe meqenëse Kotlin tani është gjuha zyrtare e Android, nuk ka frikë se mësimi i tij do t'ju lërë pa punë.

Një seri artikujsh do t'ju ndihmojnë në mësimin e kësaj gjuhe, duke përshkruar procesin e krijimit të një aplikacioni të thjeshtë celular Keddit - një klient për burimin popullor Reddit. Për lehtësinë tuaj, ne kemi renditur të gjitha pjesët e tij në listën e mëposhtme.

Do t'ju duhen bibliotekat e mëposhtme:

  • Retrofit 2.0;
  • RxJava;
  • Pikaso;
  • RecyclerView;
  • Shtesat Kotlin për Android;
  • Kamë 2.

Të gjitha burimet janë të disponueshme në GitHub. Seria përbëhet nga pjesët e mëposhtme.

Artikujt më të mirë mbi këtë temë