Scala | |
---|---|
Clasa de limba | Multi-paradigma : funcțional , orientat pe obiecte , imperativ |
Aparut in | 20 ianuarie 2004 |
Autor | Oderski, Martin |
Dezvoltator | Laboratorul de Metode de Programare al EPFL |
Extensie de fișier | .scalasau.sc |
Eliberare | 3.1.3 [1] (21 iunie 2022 ) |
Tip sistem | static , strict , inferență de tip , structural |
A fost influențat | Java , Haskell , Erlang , Standard ML , Objective Caml , Smalltalk , Scheme , Algol68 , Lisp |
influențat | Kotlin , Swift |
Licență | BSD și licență Apache 2.0 [2] |
Site-ul web | scala-lang.org _ |
Platformă | Java Virtual Machine , JavaScript [3] și Native [4] |
Scala este un limbaj de programare cu mai multe paradigme, conceput pentru a fi concis și sigur de tip pentru crearea ușoară și rapidă a software-ului componente , combinând caracteristicile programării funcționale și orientate pe obiecte .
Primele versiuni ale limbajului au fost create în 2003 de echipa laboratorului de metode de programare al Școlii Politehnice Federale din Lausanne sub conducerea lui Martin Odersky , limbajul a fost implementat pentru platformele Java și JavaScript . Potrivit lui James Strachan , creatorul limbajului de programare Groovy , Scala ar putea fi succesorul limbajului Java [5] .
Limbajul a fost creat în 2001-2004 la Laboratorul de Metode de Programare EPFL . Acesta a fost rezultatul cercetărilor menite să dezvolte suport lingvistic îmbunătățit pentru software-ul componente. Două idei au fost luate ca bază pentru dezvoltarea limbii:
Limbajul a fost lansat pentru utilizare generală pe platforma JVM în ianuarie 2004 și pe platforma .NET în iunie 2004, iar compilatorul LLVM (Scala Native) a fost creat în 2016 [6] .
Designul limbajului a fost influențat de multe limbi și lucrări de cercetare.
În primul rând, limbajul a absorbit un număr semnificativ de concepte și convenții sintactice Java și C# . Modul în care sunt exprimate proprietățile este în mare măsură împrumutat de la Sather . Conceptul de model de obiect unificat este preluat din Smalltalk . Din BETA a venit ideea că totul, inclusiv clasele, ar trebui să permită cuibărirea. Tipurile abstracte din Scala sunt foarte asemănătoare cu tipurile de semnătură abstractă din SML și OCaml , generalizate în contextul componentelor cu drepturi depline.
Într-un fel, Scala este o continuare a muncii Pizza . La fel ca Pizza, Scala se compilează pe VM Java, adăugând funcții de ordin superior , potrivire de modele , constructe care au fost create inițial în comunitatea de programare funcțională . În timp ce Pizza este compatibil cu Java, scopul Scala este doar interoperabilitatea, deci are mai multă libertate de proiectare. Un alt obiectiv al Scala este de a oferi constructe avansate pentru abstracția și compoziția componentelor, împărtășite cu mai multe dezvoltări recente ale cercetării.
Programele Scala sunt similare cu programele Java în multe feluri și pot interacționa liber cu codul Java. Limbajul include un model de obiect uniform, în sensul că orice valoare este un obiect și orice operație este un apel de metodă . În același timp, este și un limbaj funcțional în sensul că funcțiile sunt valori cu drepturi depline.
Scala include concepte de abstractizare puternice și consistente atât pentru tipuri, cât și pentru valori. În special, limbajul conține constructe mixin simetrice flexibile pentru alcătuirea claselor și trăsăturilor . Poate vă permite să descompuneți obiecte comparând cu un eșantion ; modelele și expresiile au fost generalizate pentru a sprijini procesarea naturală a documentelor XML . În general, aceste construcții facilitează exprimarea componentelor de sine stătătoare folosind bibliotecile Scala fără a utiliza constructe de limbaj speciale.
Limba permite extensii de componente externe folosind vizualizări . Caracteristicile de programare generice sunt realizate prin suportul de funcții generice ( generice ), inclusiv de tip superior ( generice de tip superior ). Pe lângă diferitele tipuri de date structurale clasice, limbajul include suport pentru tipuri existențiale .
Limbajul folosește un model pur orientat pe obiecte similar cu al lui Smalltalk : fiecare valoare este un obiect și fiecare operație este un mesaj. De exemplu, adăugarea x+yeste interpretată ca x.+(y), adică ca un apel de metodă +cu un argument yși xca un obiect receptor.
Să luăm în considerare un alt exemplu: 1+2. Această expresie este interpretată ca (1).+(2). Rețineți că parantezele din jurul numerelor sunt necesare deoarece lexerul Scala descompune expresia în jetoane pe baza principiului celei mai lungi potriviri posibile. Astfel, expresia va fi 1.+(2)împărțită în tokens 1., +și 2, deoarece tokenul 1.este mai lung decât token 1-ul și primul argument de adunare va fi interpretat ca tip Double în loc de Int [7] .
Fiecare funcție este o valoare. Limbajul oferă o sintaxă ușoară pentru definirea funcțiilor anonime și curbate . Fiecare construct returnează o valoare. Potrivirea modelelor este aplicabilă în mod natural procesării XML cu expresii regulate .
Fiecare sistem de componente cu structuri puternice de abstractizare și compoziție se confruntă cu o provocare atunci când vine vorba de integrarea subsistemelor dezvoltate de diferite echipe în momente diferite. Problema este că interfața componentelor dezvoltate de un grup sau altul nu este adesea potrivită pentru clienții care intenționează să folosească această componentă.
Scala introduce un nou concept pentru rezolvarea problemei extensibilității externe - vederi ( vederi ). Ele permit extinderea clasei cu noi membri și trăsături . Vizualizările din Scala corespund în anumite moduri claselor de tip utilizate în Haskell , dar spre deosebire de clasele de tip, domeniul de vedere poate fi controlat, iar vederile paralele pot coexista în diferite părți ale programului.
Un program, ca în Java, este o clasă. Acesta este un exemplu de program de consolă care imprimă o linie de text pe ecran.
obiect HelloWorld { def main ( args : Array [ String ]) = println ( "Buna ziua LUMEA!" ) } // Versiunea mai scurtă a obiectului HelloWorld extinde aplicația { println ( „Hello WORLD!” ) }Următorul exemplu de program simplu este scris în Java , Scala și C# , arătând unele diferențe de sintaxă ( notație postfixă a tipurilor de variabile, fără sintaxă specială pentru accesarea matricelor ). Acest exemplu descrie un program de consolă care tipărește toate opțiunile transmise pe linia de comandă. Opțiunile încep cu un caracter „-” (minus).
// Java: class PrintOptions { public static void main ( String [] args ) { System . afară . println ( "Opțiuni selectate:" ); flux . de ( args ) . filtru ( arg -> arg . începe cu ( " - " ) ) . hartă ( arg -> arg . subșir ( 1 )) . forEach ( System.out :: println ) ; _ } } // Scala: obiect PrintOptions { def main ( args : Array [ String ]) { println ( "Opțiuni selectate:" ) for ( arg <- args if arg startsWith "-" ) { println ( " " + ( arg subșir 1 ) ) } } } // Stil Scala funcțional: obiect PrintOptions { def main ( args : Array [ String ]) = println ( "Opțiuni selectate:" +: ( args filter ( _ startsWith "-" ) map ( " " + _ . drop ( 1 ) ) )) mkString „\n” ) } // Stil C# funcțional: class PrintOptions { static void Main ( String [] args ) { Console . WriteLine ( "Opțiuni selectate:" + argumente . Unde ( x => x . StartsWith ( "-" )). Agregat (( r , x ) => r + " " + x . Subșir ( 1 ))); } } // Stil Java funcțional: class PrintOptions { public static void main ( String [] args ) { System . afară . println ( "Opțiuni selectate:\n" + Arrays . stream ( args ) . filter ( o -> o . startsWith ( "-" ) ) . map ( o -> " " + o . substring ( 1 )) . collect ( Colectionari.unirea ( " \ n" ))); } }Scala nu declară o clasă de obiect, ci imediat o instanță de obiect. Acesta este modul în care modelul de proiectare este implementat într-un mod natural, unde programul ar trebui să aibă o singură instanță a clasei („Singleton” - „Singleton”).
Un exemplu de program care însumează toate elementele unei liste care este trecută prin argumente:
obiect Main { def main ( args : Array [ String ]) { try { println ( "Suma argumentelor: " + args . map ( _ . toInt ). sum ) } catch { case e : NumberFormatException => println ( "Eroare în argumente .Ar trebui folosit astfel: scala Main <number1> <number2> ... " ) } } }În Java:
clasă publică principală { public static void main ( String [] args ) { try { System . afară . println ( "Suma argumentelor: " + Arrays . stream ( args ). mapToInt ( Integer :: parseInt ). sum ()); } catch ( NumberFormatException e ) { System . afară . println ( "Eroare în argumente. Ar trebui folosit astfel: java Main <number1> <number2> ... " ); } } }Metoda mapiterează peste toate argumentele. Toate acestea sunt convertite într-un număr întreg prin metodă Integer.parseIntși adăugate la listă (matrice) elems. Apoi, folosind metoda list fold foldRight , se calculează suma elementelor.
Scala poate interacționa cu codul scris în Java. Toate clasele din pachet java.langsunt deja incluse implicit, în timp ce altele trebuie incluse în mod explicit.
Principalele cadre web scrise în Scala sunt Play , Lift . Printre utilizatorii lor, se remarcă o serie de servicii mari, în special, Play folosește Gilt și Coursera [8] , iar Foursquare folosește Lift [9] .
Rețeaua de socializare LinkedIn folosește microframework-ul Scalatra pentru a-și susține Signal API [10] .
În aprilie 2009, Twitter a anunțat că a mutat o parte semnificativă a codului său de server de la Ruby la Scala și că va muta restul [11] . În aprilie 2011, versiunea online a The Guardian a fost migrată din Java către Scala [12] .
Proiectele fundației Apache: Apache Spark , Apache Kafka sunt scrise în primul rând în Scala.
Unul dintre utilizatorii activi ai limbii este și banca UBS [13] .
O parte importantă a cadrului de dezvoltare Scala, instrumentul de construcție automată Sbt , este, de asemenea, scrisă în Scala.
Limbaje de programare | |
---|---|
|