Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Erori
  • Noul limbaj de programare Kotlin. De ce Kotlin este atât de iubit la Google și care are nevoie de două mii de limbaje de programare

Noul limbaj de programare Kotlin. De ce Kotlin este atât de iubit la Google și care are nevoie de două mii de limbaje de programare

Limbajul de programare Kotlin, dezvoltat de compania JetBrains din Sankt Petersburg, a devenit limbajul oficial de dezvoltare pentru Android. Acest lucru a fost anunțat oficial la conferința Google I/O. Echipa Kotlin este condusă de absolventul Universității ITMO Andrey Breslav. De ce Kotlin este atât de iubit de gigantul IT printre multe alte limbaje „tinere”, cum și de ce apar noi limbaje de programare în general, citiți în comentariile experților și în colecția de informații ITMO.NEWS.

Cum sunt dezvoltate limbajele de programare

Potrivit diverselor estimări, există deja peste două mii de limbaje de programare diferite în lume. Actualizările sunt lansate în mod constant pentru limbile vechi și apar și limbi noi. Când sintaxa unei limbi nu se schimbă, ci doar devine mai complexă și extinsă, dezvoltatorul are nevoie doar de puțină practică pentru a continua să scrie în limba sa preferată. Uneori structura limbajului în sine se schimbă, iar apoi programatorul trebuie să învețe din nou, adaptându-se la limbajul actualizat. De obicei, trecerea la o nouă structură are loc treptat și în părți, adică doar 10-20% din codul programului începe să fie scris folosind noul limbaj.

« Programatorii nu au fost complet mulțumiți de limbajele C++ și Java, deoarece acestea sunt limbaje destul de complexe, iar prima este mai dificilă decât a doua. Prin urmare, a apărut limbajul Scala, pe care multor programatori le place, dar este și foarte complex. Vasta experiență a JetBrains în crearea de instrumente de dezvoltare de programe pentru diferite limbaje de programare i-a permis să creeze limbajul Kotlin în șapte ani, care este pe deplin compatibil cu Java, dar mai simplu și mai convenabil decât acesta. Limbajele de programare sunt în mod constant dezvoltate; nimeni nu își mai pune sarcina de a crea un limbaj universal. În ciuda acestui fapt, fiecare limbă este mai eficientă într-un anumit domeniu în care este folosită cel mai des. Există chiar și o direcție în crearea limbilor atunci când acestea sunt dezvoltate pentru o anumită zonă„, a comentat șeful Departamentului de Tehnologie de Programare din cadrul Universității ITMO.


Astăzi, unele companii chiar își compilează propriile evaluări lingvistice. De exemplu, compania TIOBE, specializată în evaluarea calității software-ului, calculează lunar indicele de popularitate al anumitor limbi din 2001. Lista generată conține 50 de rânduri, iar pentru ca un limbaj de programare să fie inclus în index, dezvoltatorii trebuie să scrie o scrisoare corespunzătoare companiei. Calculul se bazează pe date de la 25 de motoare de căutare de pe Internet. Până acum, Java se află în fruntea clasamentului cu o marjă largă, urmată de C. În același timp, compilatorii listei subliniază că, în ultimul an, ambele limbaje de programare au devenit mai puțin populare, cu aproximativ 6%. În același timp, TIOBE arată că C a fost limbajul nr. 1 până în 2002, iar Java a fost pe locul 14 în 1997, dar cinci ani mai târziu a înlocuit C pe prima poziție.

Puteți susține o prelegere excelentă despre istoria dezvoltării limbilor: curatorul programelor academice la Yandex, directorul centrului pentru concursuri studențești de la Facultatea de Informatică a Școlii Superioare de Economie vorbește despre modul în care limbile C Au apărut , PHP, Ruby și Java. Mihail Gustokashin. Lectorul subliniază că pentru fiecare sarcină ar trebui să fie ales un limbaj de programare diferit. De exemplu, el spune că pentru industria militară cel mai bine este să scrieți în pascal bun, o limbă care s-a născut în 1970! De ce? Pentru că este mai de încredere. Aplicațiile de afaceri pot fi scrise în Java, deoarece acest limbaj este, de asemenea, destul de fiabil, dar mult mai ușor de utilizat. Expertul mai subliniază că este important să se mențină interesul pentru limbaj în rândul programatorilor prin crearea unei comunități de dezvoltatori care scriu în acest limbaj. Dacă se creează o infrastructură în jurul unei noi limbi și oamenii se adună pentru a o folosi, doar atunci limba va deveni populară. Apropo, dezvoltatorii Kotlin au adoptat și ei această strategie.

Câteva despre Kotlin

Limbajul de programare Kotlin a început să fie dezvoltat la compania JetBrains din Sankt Petersburg în 2010. Lansarea oficială a produsului a fost lansată în 2016. Limba a primit acest nume în onoarea insulei din Golful Finlandei pe care se află Kronstadt. Într-o coincidență interesantă, numele popularului limbaj Java este și numele unei insule din Indonezia. Coincidența probabil nu este întâmplătoare. După cum se spune în comunicatul de presă, Kotlin ar trebui să funcționeze oriunde rulează Java, iar unul dintre obiective a fost acela de a realiza un produs care să poată fi utilizat în proiecte mixte care sunt create în mai multe limbi.


După cum notează autorii Kotlin, cel mai important lucru pentru ei a fost să creeze un produs „pragmatic”. Aceasta înseamnă că nu s-au concentrat doar pe remedierea erorilor și îmbunătățirea produsului, ceea ce ar face orice programator, ci și-au dorit să facă un instrument util.

« Instrumentele de dezvoltare, inclusiv limbaje de programare, evoluează constant. Limbile diferă de alte instrumente prin faptul că sunt destul de dificil de dezvoltat evolutiv. Noua versiune a limbii trebuie să accepte toate programele existente. Acest lucru limitează posibilitățile de dezvoltare a limbilor existente și creează nevoia apariției altora noi. Factorul care determină succesul unui nou limbaj de programare este, în primul rând, comoditatea pentru dezvoltatori. Pe lângă faptul că este concis și expresiv, Kotlin este foarte compatibil cu codul Java: puteți utiliza toate bibliotecile existente și chiar puteți amesteca codul în două limbi într-un singur proiect, astfel încât să nu existe dificultăți speciale de tranziție„, a comentat Kotlin manager de proiect la JetBrains, absolvent al Universității ITMO.

De ce Google l-a iubit pe Kotlin

Pe site-ul oficial, dezvoltatorii Android scriu că au observat „ascensiunea” lui Kotlin în ultimii ani. Angajații Google nu se sfiesc să descrie limba ca fiind impresionantă, concisă, responsabilă și plăcută de lucrat. Are o productivitate crescută: codul programului din acesta este în medie cu 40% mai scurt decât în ​​alte limbi, iar Kotlin vă permite, de asemenea, să evitați unele erori în cod. Unul dintre factorii determinanți pentru popularitatea lui Kotlin la Google a fost faptul că este compatibil cu Java, care este deja folosit în dezvoltarea de aplicații pentru Android.

Acum, când programatorii încep să creeze o nouă aplicație în mediul oficial de dezvoltare Android Studio, aceștia pot activa imediat pluginul „Suport Kotlin”. De asemenea, puteți converti liniile de cod deja create în alte limbi în limba Kotlin, inserați blocuri în alte limbi în linii de cod în Kotlin. În viitor, vor fi dezvoltate mai multe biblioteci și instrumente pentru limbă, vor fi dezvoltate mai multe materiale de instruire și va fi mai ușor să găsiți soluții la eventualele probleme.

« Lipsa garanțiilor de suport lingvistic de la Google a descurajat mulți dezvoltatori să treacă la Kotlin. Chiar dacă îți place foarte mult limbajul,Un programator se gândește întotdeauna la riscul ca la un moment dat acest limbaj să nu mai funcționeze. Acum există garanția că Kotlin nu va înceta să funcționeze și ne așteptăm ca numărul utilizatorilor de limbi să crească brusc. Ar fi firesc să presupunem că multe companii vor trece în cele din urmă complet la Kotlin, deși din punct de vedere tehnic nimic nu le obligă să facă acest lucru, este pur și simplu o chestiune de preferință.„- a subliniat Andrey Breslav.

El a adăugat că Kotlin este dezvoltat foarte activ. Echipa de dezvoltare lucrează în prezent la sistemul de construire, viteza de compilare, îmbunătățirea performanței IDE, adăugarea de noi funcții la setul de instrumente, inclusiv cele legate de integrarea în Android Studio. De asemenea, se lucrează la proiecte multi-platformă (capacitatea de a compila același cod pentru mai multe platforme), iar o serie de îmbunătățiri ale limbajului sunt în faza de proiectare.


Google a mai subliniat că sunt inspirați de conceptul limbajului Kotlin, conform căruia acesta a fost și va rămâne întotdeauna gratuit pentru dezvoltatori, adică un proiect open source. Aceasta înseamnă că limba nu este legată de nicio companie anume, iar codul sursă este distribuit sub o licență gratuită. Puteți descărca produsul. Pentru a sprijini dezvoltarea Kotlin, Google și JetBrains vor crea un parteneriat non-profit. De asemenea, ca parte a „misiunii” Android, este foarte important ca autorii Kotlin să creeze o comunitate de oameni în jurul produsului lor, care sunt implicați profesional în dezvoltarea în acest limbaj și iubesc să-și împărtășească experiența. De exemplu, în noiembrie va avea loc conferința Kotlin în Statele Unite, iar dezvoltatorii pot primi zilnic știri și sfaturi despre produsul software și se pot întâlni la nivel local.

Apropo, proiectul Android Studio în sine a fost dezvoltat pe baza mediului de dezvoltare software IntelliJ IDEA, care a fost creat și de JetBrains. Dar, în ciuda cooperării strânse, compania din Sankt Petersburg subliniază că nu se vorbește despre vreo vânzare de JetBrains către gigantul IT american. În același timp, Koltin nu va fi proiectat doar pentru Android. Scopul companiei este de a face limbajul de programare adecvat pentru diferite platforme de dezvoltare.

Acest articol vorbește despre limbajul de programare Kotlin. Veți afla despre motivele apariției proiectului, capacitățile limbii și veți vedea mai multe exemple. Articolul a fost scris în primul rând cu așteptarea ca cititorul să fie familiarizat cu limbajul de programare java, cu toate acestea, cei care cunosc o altă limbă își vor putea, de asemenea, să-și facă o idee despre subiect. Articolul este superficial și nu abordează probleme legate de compilarea în javascript. Poți găsi documentația completă pe site-ul oficial al proiectului, dar voi încerca să vorbesc pe scurt despre limbă.

despre proiect

Nu cu mult timp în urmă, JetBrains, o companie care creează medii de dezvoltare, și-a anunțat noul produs - limbajul de programare Kotlin. Un val de critici a lovit compania: criticii au sugerat ca compania să-și vină în fire și să completeze pluginul pentru Scala, în loc să-și dezvolte propriul limbaj. Dezvoltatorilor Scala le lipsește într-adevăr un mediu de dezvoltare bun, dar problemele dezvoltatorilor de pluginuri sunt de înțeles: Scala, care s-a născut datorită cercetătorilor din Elveția, a încorporat multe concepte și abordări științifice inovatoare, ceea ce a făcut ca crearea unui instrument de dezvoltare bun să fie o sarcină extrem de dificilă. . În prezent, segmentul de limbi moderne tipizate static pentru JVM este mic, așa că decizia de a vă crea propriul limbaj împreună cu un mediu de dezvoltare pare foarte lungă de vedere. Chiar dacă acest limbaj nu prinde deloc rădăcini în comunitate, JetBrains îl face în primul rând pentru nevoile sale. Orice programator Java poate înțelege aceste nevoi: Java ca limbaj se dezvoltă foarte lent, funcțiile noi nu apar în limbaj (așteptăm funcții de primă ordine de câțiva ani deja), compatibilitatea cu versiunile mai vechi ale limbajului îl face imposibil ca multe lucruri utile să apară în viitorul apropiat.viitor (de exemplu, parametrizare de tip decent). Pentru o companie care dezvoltă software, limbajul de programare este principalul instrument de lucru, prin urmare eficiența și simplitatea limbajului sunt indicatori de care depinde nu numai ușurința dezvoltării instrumentelor pentru acesta, ci și costurile de codare ale programatorului, adică cât de ușor va fi. trebuie să menținem acest cod și să-l înțelegi.

Despre limbaj

Limba este tipizată static. Dar, în comparație cu java, compilatorul Kotlin adaugă informații tipului despre dacă referința poate conține null, ceea ce înăsprește verificarea tipului și face execuția mai sigură:

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

În ciuda faptului că această abordare poate salva programatorul de o serie de probleme asociate cu NPE, pentru un programator Java la început pare inutil - trebuie să faci verificări sau conversii inutile. Dar, după ceva timp de programare în kotlin, revenind la java, simțiți că vă lipsesc aceste informații despre tip și vă gândiți să utilizați adnotări Nullable/NotNull. Legate de acestea sunt probleme de compatibilitate inversă cu java - aceste informații nu se află în bytecode java, dar din câte știu, această problemă este încă în curs de rezolvare și, deocamdată, toate tipurile care provin din java sunt nulabile.

Apropo, despre compatibilitatea inversă: Kotlin este compilat în bytecode JVM (creatorii limbajului depun mult efort pentru menținerea compatibilității), ceea ce îi permite să fie folosit în același proiect cu java și capacitatea de a folosi java reciproc și clasele Kotlin fac pragul pentru introducerea lui Kotlin într-un proiect java mare existent foarte minimal. În acest sens, abilitatea de a utiliza mai multe dezvoltări java prin crearea unui proiect în întregime în kotlin este importantă. De exemplu, mi-a fost aproape ușor să fac un mic proiect bazat pe spring-webmvc.

Să ne uităm la fragmentul de controler:

Path(array("/notes/")) clasa controler NotesController ( private autowired val notesService: NotesService? = cale nulă(array("toate")) fun all() = render("note/note") ( addObject(" note", noteService!!.toate) ) //... )

Particularitățile utilizării adnotărilor în Kotlin sunt vizibile: în unele locuri nu arată la fel de bine ca în java (acest lucru se aplică cazurilor speciale, de exemplu, o matrice a unui element), dar adnotările pot fi folosite ca cuvinte cheie „de casă”, cum ar fi ca cablare automată sau controler (dacă specificați un tip de alias la import) și în ceea ce privește capabilitățile, adnotările sunt mai aproape de clasele reale.

Trebuie remarcat faptul că Spring nu a reușit să împacheteze clasele Kotlin pentru a gestiona tranzacțiile - sper că acest lucru va fi posibil în viitor.

Limbajul are suport pentru funcții de primă clasă. Aceasta înseamnă că o funcție este un tip încorporat în limbaj pentru care există o sintaxă specială. Funcțiile pot fi create local, transmise ca parametri altor funcții, iar referințele la acestea pot fi stocate:

Fun doSomething(thing:()->Unit) ( // declara un parametru de tip function // ()->Unit nu accepta nimic si // returneaza nimic important() // call ) doSomething() ( // și aici din mers creăm o funcție de tip // ()->Unit și o transmitem funcției doShomething // dacă funcția este ultimul parametru, o puteți // muta în afara parantezelor de apel println("Bună lume "))

Dacă adăugăm la această extensie funcții care ne permit să extindem o clasă deja existentă folosind o metodă care nu încalcă încapsularea clasei, dar care poate fi accesată ca metode ale acestei clase, atunci vom obține un mecanism destul de puternic de extindere. biblioteci java standard care sunt destul de slabe din punct de vedere al confortului. Prin tradiție, să adăugăm capacitatea de a filtra lista care există deja în biblioteca standard:

Distracţie Listă .filtru (condiție:(T)->Boolean):List (val result = listă () for(articol din acest) ( if(condition(item)) result.add(item) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Vă rugăm să rețineți că variabilele nu au tipuri specificate - compilatorul Kotlin le deduce dacă este posibil și nu interferează cu înțelegerea interfeței. În general, limbajul este conceput astfel încât să salveze pe cât posibil persoana de la tastatură de la tastarea caracterelor inutile: sintaxă scurtă, dar clară, cu un minim de cuvinte cheie, nu este nevoie de punct și virgulă pentru a separa expresiile, introduceți inferență acolo unde este cazul , niciun cuvânt cheie nou pentru a crea o clasă - doar ceea ce este necesar.

Pentru a ilustra subiectul claselor și concizia, să ne uităm la următorul cod:

// crearea claselor de fasole devine // laconic, câmpurile pot fi declarate // direct în clasa de declarație a constructorului TimeLord(val name:String) // clasa poate să nu aibă un corp deloc clasă TARDIS(val owner:TimeLord) fun main (args:Matrice ) ( val doctor = TimeLord("Doctor") val tardis = TARDIS(doctor) println(tardis.owner.name) )

În câteva rânduri, am reușit să declarăm două clase, să creăm două obiecte și să tipărim numele proprietarului TARDIS! Puteți observa că clasa este declarată cu parametrii singurului său constructor posibil, care sunt și declararea proprietăților sale. Extrem de scurt, dar informativ. Cu siguranță vor fi cei care vor condamna imposibilitatea de a declara mai mult de un constructor, dar mi se pare că acesta are propriul pragmatism - la urma urmei, mai mulți constructori în java fie vă permit să declarați parametri impliciti, pe care Kotlin îi acceptă la limbaj. nivel sau convertiți un tip în altul, cu care această clasă va funcționa, iar acest lucru poate fi deja lăsat în siguranță la metoda din fabrică. Acordați atenție declarației „variabilelor” și câmpurilor. Kotlin ne obligă să facem o alegere: val sau var . Unde val declară o referință finală imuabilă și var declară o variabilă, ceea ce ajută la evitarea utilizării pe scară largă a referințelor mutabile.

Exemplu

Acum am ajuns la locul unde putem face ceva mai interesant. În timpul interviurilor, îmi dau adesea sarcina de a implementa un arbore, de a-l traversa și de a determina o acțiune cu un element. Să vedem cum este implementat acest lucru în kotlin.

Iată cum aș dori să arate utilizarea:

Fun main(args: Array ) ( // creează un arbore mic val tree= tree("rădăcină") ( node("1-1") ( node("2-1") node("2-2") ) node("1-2") " ) ( node("2-3") ) ) ) // traversează-l și imprimă valorile în arborele consolei.traverse ( println(it) ) )

Acum să încercăm să implementăm acest lucru. Să creăm o clasă de noduri de arbore:

/** * @param value node data */ class Node (valoare val:T) ( // nod copii private val copii:List > = arrayList() /** * Metodă care creează și adaugă un copil la un nod * @param value valoarea pentru noul nod * @param funcția init pentru a inițializa noul nod, opțional * parametru */ fun node(valoare: T, init:Node .()->Unitate = ()):Nod (val node = Node (valoare) node.init() children.add(node) return node ) /** * Metoda traversează recursiv toate nodurile copil pornind de la * nodul însuși, fiecare nod este notificat despre un handler * @param handler funcția handler pentru valoarea fiecărui nod */ fun traverse(handler:(T)->Unitate) ( handler(valoare) children.forEach (copil -> child.traverse(handler) ) ) )

Acum să adăugăm o funcție pentru a crea partea superioară a arborelui:

/** * Creează un nod arbore cu valoare valoare și inițializează * copiii săi cu metoda init. */ distracție arbore(valoare:T, init:Nod .()->Unitate): Nod ( val node = Node(valoare) // apelează metoda init transmisă în parametrul // pe obiectul nod node.init() return node )

În două locuri din cod a fost folosită o construcție precum Node.()->Unitate, sensul acesteia este că se așteaptă ca intrare un tip de funcție, care va fi executat ca metodă a unui obiect de tipul Node. Din corpul acestei funcții există acces la alte metode ale acestui obiect, cum ar fi metoda Node.node(), care vă permite să faceți inițializarea arborelui similar cu cea descrisă în exemplu.

În loc de concluzie

Datorită compatibilității sale bune cu java și a capacității de a înlocui codul vechi treptat, în viitor Kotlin ar putea deveni un înlocuitor bun pentru java în proiecte mari și un instrument convenabil pentru crearea de proiecte mici cu perspectiva dezvoltării lor. Simplitatea limbajului și flexibilitatea acestuia oferă dezvoltatorului mai multe oportunități de a scrie cod rapid, dar de înaltă calitate.

Dacă sunteți interesat de limbă, toate informațiile despre limbă pot fi găsite pe site-ul oficial al proiectului, sursele acestora pot fi găsite pe github, iar eventualele erori găsite pot fi postate în Issue Tracker. Există încă multe probleme, dar dezvoltatorii de limbi se luptă activ cu ele. Acum echipa lucrează la versiunea încă nu foarte stabilă a jalonului 3, după stabilizare, din câte știu, este planificată utilizarea limbajului în cadrul companiei JetBrains, după care este deja planificată prima lansare.

Etichete: Adăugați etichete

În 2010, un grup de dezvoltatori din filiala rusă a JetBrains și-a propus să dezvolte un limbaj care să fie mai convenabil și mai sigur decât Java, dar nu la fel de complex ca Scala. Numele acestei limbi a fost dat în onoarea insulei Kotlin, situată în Golful Finlandei (prin analogie cu Java, care poartă și numele insulei).

Dacă te uiți la orice prezentare modernă a celor mai promițătoare limbaje de programare, inclusiv, cu siguranță îl vei găsi acolo pe Kotlin. Care este esența acestui limbaj, de ce le place tuturor, ce perspective are - mai multe despre asta mai târziu.

Sintaxă

Ideea de a crea un limbaj care este la fel de convenabil atât pentru începători, cât și pentru dezvoltatorii experimentați este exprimată direct în sintaxa sa. Ca orice analog modern, Kotlin este extrem de concis, compact și de înțeles. O cantitate imensă de cod care anterior trebuia scris în Java poate fi pur și simplu ignorată. Un exemplu simplu: folosirea punctului și virgulă pentru a separa instrucțiunile nu este o cerință - compilatorul înțelege acum totul de la sine dacă accesați o linie nouă. La declararea variabilelor, în multe cazuri nu este necesară specificarea tipului - acesta va fi determinat automat.

În același timp, trebuie spus că Kotlin, în ceea ce privește înregistrarea, a revenit puțin la stilul Pascal - și aici, claritatea primează asupra clarității structurilor. Puteți citi puțin mai multe despre acest lucru în acest scurt articol. Acesta acoperă doar principiile de bază ale construirii limbajelor Java și Kotlin, așa că va fi de înțeles de absolut toată lumea.

Cu toate acestea, vom lăsa în continuare o mică bucată de cod:

fun main(args: Array ) {
val scope = "lume"
println("Bună ziua, $scope!")
}

O intrare extrem de simplă care ar trebui să fie de înțeles oricui a studiat programarea la școală sau universitate timp de cel puțin un an.

Este important de menționat că Kotlin este pe deplin compatibil cu Java. De aceea, la început a fost considerat un simplu zahăr sintactic, folosit pentru sarcini complexe în care se dorea pur și simplu să economisească timp și efort.

Avantaje

În general, toate avantajele în comparație cu Java au fost deja menționate, așa că le vom colecta într-un singur loc:

    Volumul codului. Nu folosirea unor bucăți de cod arhaice inutile accelerează procesul de dezvoltare și crește lizibilitatea;

    Siguranță. Regulile pentru crearea codului încorporat în sintaxa limbajului vă permit să evitați erorile mici, greu de urmărit, care apar doar în timpul execuției programului;

    Compatibilitate în Java. Acest lucru este convenabil atât din punctul de vedere al învățării unei noi limbi, cât și din punctul de vedere al transferului treptat al produselor dumneavoastră software din Java în Kotlin. De exemplu, exact asta s-a întâmplat cu aplicația Basecamp.

Defecte

Fiind un limbaj care a fost dezvoltat pe baza Java, Kotlin are două dezavantaje evidente în comparație: viteza și elaborarea. În primul caz, totul este clar: lucrând pe JVM este dificil să învingi Java în ceea ce privește performanța. A doua problemă este un pic cam exagerată pentru o limbă atât de tânără, pentru că se află în circulație oficială de puțin peste un an. Da, există mult mai puține instrumente și biblioteci aici decât în ​​Java. Dar, în primul rând, acest lucru nu este încă critic și, în al doilea rând, în lumea Java, cantitatea nu s-a tradus întotdeauna în calitate.

Kotlin, deocamdată, face față sarcinilor sale principale, iar compatibilitatea deplină cu Java ne ajută să ne închidem ochii la aceste lacune.

Perspective

În ciuda faptului că dezvoltarea lui Kotlin a început în 2010, prima versiune oficială a fost lansată abia în februarie 2016. De atunci, cererea pentru limbă a crescut rapid, în ratingul TIOBE a intrat în TOP-50 în decurs de un an. , iar luna trecută la conferința Google I /O a anunțat suport oficial pentru Kotlin în sistemul de dezvoltare a aplicațiilor Android.

Având în vedere popularitatea ridicată a IntelliJ IDEA în rândul dezvoltatorilor și concentrarea strategică a companiei pe Kotlin, putem spune cu încredere că în 3-4 ani îl vom vedea printre concurenții cu drepturi depline ai Java și Swift în domeniul dezvoltării mobile. În plus, dacă creatorii limbajului nu sunt dezamăgiți de produsul lor, Kotlin va continua cu siguranță să surprindă serios alte orizonturi: web, AI, Internet of Things, big data, aplicații desktop.

Dacă sunteți serios interesat de această limbă, atunci asigurați-vă că aruncați o privire pe site-ul său oficial (versiunea rusă) și experimentați toate avantajele sale din experiența personală. Grăbește-te înainte să devină mainstream.

Acest articol vorbește despre limbajul de programare Kotlin. Veți afla despre motivele apariției proiectului, capacitățile limbii și veți vedea mai multe exemple. Articolul a fost scris în primul rând cu așteptarea ca cititorul să fie familiarizat cu limbajul de programare java, cu toate acestea, cei care cunosc o altă limbă își vor putea, de asemenea, să-și facă o idee despre subiect. Articolul este superficial și nu abordează probleme legate de compilarea în javascript. Poți găsi documentația completă pe site-ul oficial al proiectului, dar voi încerca să vorbesc pe scurt despre limbă.

despre proiect

Nu cu mult timp în urmă, JetBrains, o companie care creează medii de dezvoltare, și-a anunțat noul produs - limbajul de programare Kotlin. Un val de critici a lovit compania: criticii au sugerat ca compania să-și vină în fire și să completeze pluginul pentru Scala, în loc să-și dezvolte propriul limbaj. Dezvoltatorilor Scala le lipsește într-adevăr un mediu de dezvoltare bun, dar problemele dezvoltatorilor de pluginuri sunt de înțeles: Scala, care s-a născut datorită cercetătorilor din Elveția, a încorporat multe concepte și abordări științifice inovatoare, ceea ce a făcut ca crearea unui instrument de dezvoltare bun să fie o sarcină extrem de dificilă. . În prezent, segmentul de limbi moderne tipizate static pentru JVM este mic, așa că decizia de a vă crea propriul limbaj împreună cu un mediu de dezvoltare pare foarte lungă de vedere. Chiar dacă acest limbaj nu prinde deloc rădăcini în comunitate, JetBrains îl face în primul rând pentru nevoile sale. Orice programator Java poate înțelege aceste nevoi: Java ca limbaj se dezvoltă foarte lent, funcțiile noi nu apar în limbaj (așteptăm funcții de primă ordine de câțiva ani deja), compatibilitatea cu versiunile mai vechi ale limbajului îl face imposibil ca multe lucruri utile să apară în viitorul apropiat.viitor (de exemplu, parametrizare de tip decent). Pentru o companie care dezvoltă software, limbajul de programare este principalul instrument de lucru, prin urmare eficiența și simplitatea limbajului sunt indicatori de care depinde nu numai ușurința dezvoltării instrumentelor pentru acesta, ci și costurile de codare ale programatorului, adică cât de ușor va fi. trebuie să menținem acest cod și să-l înțelegi.

Despre limbaj

Limba este tipizată static. Dar, în comparație cu java, compilatorul Kotlin adaugă informații tipului despre dacă referința poate conține null, ceea ce înăsprește verificarea tipului și face execuția mai sigură:

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

În ciuda faptului că această abordare poate salva programatorul de o serie de probleme asociate cu NPE, pentru un programator Java la început pare inutil - trebuie să faci verificări sau conversii inutile. Dar, după ceva timp de programare în kotlin, revenind la java, simțiți că vă lipsesc aceste informații despre tip și vă gândiți să utilizați adnotări Nullable/NotNull. Legate de acestea sunt probleme de compatibilitate inversă cu java - aceste informații nu se află în bytecode java, dar din câte știu, această problemă este încă în curs de rezolvare și, deocamdată, toate tipurile care provin din java sunt nulabile.

Apropo, despre compatibilitatea inversă: Kotlin este compilat în bytecode JVM (creatorii limbajului depun mult efort pentru menținerea compatibilității), ceea ce îi permite să fie folosit în același proiect cu java și capacitatea de a folosi java reciproc și clasele Kotlin fac pragul pentru introducerea lui Kotlin într-un proiect java mare existent foarte minimal. În acest sens, abilitatea de a utiliza mai multe dezvoltări java prin crearea unui proiect în întregime în kotlin este importantă. De exemplu, mi-a fost aproape ușor să fac un mic proiect bazat pe spring-webmvc.

Să ne uităm la fragmentul de controler:

Path(array("/notes/")) clasa controler NotesController ( private autowired val notesService: NotesService? = cale nulă(array("toate")) fun all() = render("note/note") ( addObject(" note", noteService!!.toate) ) //... )

Particularitățile utilizării adnotărilor în Kotlin sunt vizibile: în unele locuri nu arată la fel de bine ca în java (acest lucru se aplică cazurilor speciale, de exemplu, o matrice a unui element), dar adnotările pot fi folosite ca cuvinte cheie „de casă”, cum ar fi ca cablare automată sau controler (dacă specificați un tip de alias la import) și în ceea ce privește capabilitățile, adnotările sunt mai aproape de clasele reale.

Trebuie remarcat faptul că Spring nu a reușit să împacheteze clasele Kotlin pentru a gestiona tranzacțiile - sper că acest lucru va fi posibil în viitor.

Limbajul are suport pentru funcții de primă clasă. Aceasta înseamnă că o funcție este un tip încorporat în limbaj pentru care există o sintaxă specială. Funcțiile pot fi create local, transmise ca parametri altor funcții, iar referințele la acestea pot fi stocate:

Fun doSomething(thing:()->Unit) ( // declara un parametru de tip function // ()->Unit nu accepta nimic si // returneaza nimic important() // call ) doSomething() ( // și aici din mers creăm o funcție de tip // ()->Unit și o transmitem funcției doShomething // dacă funcția este ultimul parametru, o puteți // muta în afara parantezelor de apel println("Bună lume "))

Dacă adăugăm la această extensie funcții care ne permit să extindem o clasă deja existentă folosind o metodă care nu încalcă încapsularea clasei, dar care poate fi accesată ca metode ale acestei clase, atunci vom obține un mecanism destul de puternic de extindere. biblioteci java standard care sunt destul de slabe din punct de vedere al confortului. Prin tradiție, să adăugăm capacitatea de a filtra lista care există deja în biblioteca standard:

Distracţie Listă .filtru (condiție:(T)->Boolean):List (val result = listă () for(articol din acest) ( if(condition(item)) result.add(item) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Vă rugăm să rețineți că variabilele nu au tipuri specificate - compilatorul Kotlin le deduce dacă este posibil și nu interferează cu înțelegerea interfeței. În general, limbajul este conceput astfel încât să salveze pe cât posibil persoana de la tastatură de la tastarea caracterelor inutile: sintaxă scurtă, dar clară, cu un minim de cuvinte cheie, nu este nevoie de punct și virgulă pentru a separa expresiile, introduceți inferență acolo unde este cazul , niciun cuvânt cheie nou pentru a crea o clasă - doar ceea ce este necesar.

Pentru a ilustra subiectul claselor și concizia, să ne uităm la următorul cod:

// crearea claselor de fasole devine // laconic, câmpurile pot fi declarate // direct în clasa de declarație a constructorului TimeLord(val name:String) // clasa poate să nu aibă un corp deloc clasă TARDIS(val owner:TimeLord) fun main (args:Matrice ) ( val doctor = TimeLord("Doctor") val tardis = TARDIS(doctor) println(tardis.owner.name) )

În câteva rânduri, am reușit să declarăm două clase, să creăm două obiecte și să tipărim numele proprietarului TARDIS! Puteți observa că clasa este declarată cu parametrii singurului său constructor posibil, care sunt și declararea proprietăților sale. Extrem de scurt, dar informativ. Cu siguranță vor fi cei care vor condamna imposibilitatea de a declara mai mult de un constructor, dar mi se pare că acesta are propriul pragmatism - la urma urmei, mai mulți constructori în java fie vă permit să declarați parametri impliciti, pe care Kotlin îi acceptă la limbaj. nivel sau convertiți un tip în altul, cu care această clasă va funcționa, iar acest lucru poate fi deja lăsat în siguranță la metoda din fabrică. Acordați atenție declarației „variabilelor” și câmpurilor. Kotlin ne obligă să facem o alegere: val sau var . Unde val declară o referință finală imuabilă și var declară o variabilă, ceea ce ajută la evitarea utilizării pe scară largă a referințelor mutabile.

Exemplu

Acum am ajuns la locul unde putem face ceva mai interesant. În timpul interviurilor, îmi dau adesea sarcina de a implementa un arbore, de a-l traversa și de a determina o acțiune cu un element. Să vedem cum este implementat acest lucru în kotlin.

Iată cum aș dori să arate utilizarea:

Fun main(args: Array ) ( // creează un arbore mic val tree= tree("rădăcină") ( node("1-1") ( node("2-1") node("2-2") ) node("1-2") " ) ( node("2-3") ) ) ) // traversează-l și imprimă valorile în arborele consolei.traverse ( println(it) ) )

Acum să încercăm să implementăm acest lucru. Să creăm o clasă de noduri de arbore:

/** * @param value node data */ class Node (valoare val:T) ( // nod copii private val copii:List > = arrayList() /** * Metodă care creează și adaugă un copil la un nod * @param value valoarea pentru noul nod * @param funcția init pentru a inițializa noul nod, opțional * parametru */ fun node(valoare: T, init:Node .()->Unitate = ()):Nod (val node = Node (valoare) node.init() children.add(node) return node ) /** * Metoda traversează recursiv toate nodurile copil pornind de la * nodul însuși, fiecare nod este notificat despre un handler * @param handler funcția handler pentru valoarea fiecărui nod */ fun traverse(handler:(T)->Unitate) ( handler(valoare) children.forEach (copil -> child.traverse(handler) ) ) )

Acum să adăugăm o funcție pentru a crea partea superioară a arborelui:

/** * Creează un nod arbore cu valoare valoare și inițializează * copiii săi cu metoda init. */ distracție arbore(valoare:T, init:Nod .()->Unitate): Nod ( val node = Node(valoare) // apelează metoda init transmisă în parametrul // pe obiectul nod node.init() return node )

În două locuri din cod a fost folosită o construcție precum Node.()->Unitate, sensul acesteia este că se așteaptă ca intrare un tip de funcție, care va fi executat ca metodă a unui obiect de tipul Node. Din corpul acestei funcții există acces la alte metode ale acestui obiect, cum ar fi metoda Node.node(), care vă permite să faceți inițializarea arborelui similar cu cea descrisă în exemplu.

În loc de concluzie

Datorită compatibilității sale bune cu java și a capacității de a înlocui codul vechi treptat, în viitor Kotlin ar putea deveni un înlocuitor bun pentru java în proiecte mari și un instrument convenabil pentru crearea de proiecte mici cu perspectiva dezvoltării lor. Simplitatea limbajului și flexibilitatea acestuia oferă dezvoltatorului mai multe oportunități de a scrie cod rapid, dar de înaltă calitate.

Dacă sunteți interesat de limbă, toate informațiile despre limbă pot fi găsite pe site-ul oficial al proiectului, sursele acestora pot fi găsite pe github, iar eventualele erori găsite pot fi postate în Issue Tracker. Există încă multe probleme, dar dezvoltatorii de limbi se luptă activ cu ele. Acum echipa lucrează la versiunea încă nu foarte stabilă a jalonului 3, după stabilizare, din câte știu, este planificată utilizarea limbajului în cadrul companiei JetBrains, după care este deja planificată prima lansare.

Etichete:

  • kotlin
  • java
  • jetbrains
Adaugă etichete

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

Funcțiile de ordin superior sunt funcții care iau alte funcții drept argumente și returnează funcții. Luați în considerare următorul exemplu:

Fun alphaNum(func: () -> Unit) ()

În el, func este numele argumentului, iar () -> Unit este tipul funcției. Spunem că func va fi o funcție care nu primește argumente și nu returnează nimic.

Expresiile Lambda, sau funcțiile anonime, sunt funcții care nu sunt declarate, ci mai degrabă trecute ca expresii. Iată un exemplu:

Val suma: (Int, Int) -> Int = ( x, y -> x + y )

Declarăm o sumă variabilă care ia două numere, le adună și returnează suma redusă la un număr întreg. O sumă simplă (2,2) este suficientă pentru a o numi.

Comparație de viteză între Java și Kotlin

Prima compilare a codului Kotlin durează cu aproximativ 15-20% mai mult decât același proces din Java. Cu toate acestea, construcția incrementală a lui Kotlin este chiar puțin mai rapidă decât cea a lui Java. Astfel, limbile sunt aproximativ egale ca viteză de compilare.

Viitorul lui Kotlin

Kotlin este următoarea evoluție a Java, cu care este pe deplin compatibil. Acest lucru îl face un instrument excelent pentru aplicații mobile și de întreprindere. Și, deoarece Kotlin este acum limba oficială a Androidului, nu este teamă că învățarea acestuia vă va lăsa fără un loc de muncă.

O serie de articole vă vor ajuta să învățați această limbă, descriind procesul de creare a unei aplicații mobile simple Keddit - un client pentru resursa populară Reddit. Pentru confortul dumneavoastră, am enumerat toate părțile sale în lista de mai jos.

Veți avea nevoie de următoarele biblioteci:

  • Retrofit 2.0;
  • RxJava;
  • Picasso;
  • RecyclerView;
  • extensii Kotlin pentru Android;
  • Pumnalul 2.

Toate sursele sunt disponibile pe GitHub. Seria constă din următoarele părți.

Cele mai bune articole pe această temă