Scala (limbaj de programare)

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 13 octombrie 2018; verificările necesită 27 de modificări .
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 ) ( 21.06.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] .

Istorie

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:

  1. Un limbaj de programare software pentru componente ar trebui să fie scalabil în sensul că ar trebui să fie posibil să se descrie atât părțile mici, cât și cele mari folosind aceleași concepte. Prin urmare, atenția sa concentrat asupra mecanismelor de abstractizare , compoziție și descompunere , în loc să se introducă un număr mare de primitive care pot fi utile doar la orice nivel de zoom.
  2. Suportul pentru componente scalabil poate fi furnizat de un limbaj de programare care unifică și generalizează programarea orientată pe obiecte și funcțională . Unele dintre inovațiile tehnice majore ale Scala sunt concepte care sunt o fuziune a acestor paradigme de programare . În limbile tipizate static , cum ar fi Scala, aceste paradigme au fost aproape complet separate până acum.

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] .

Originile designului

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.

Aspecte cheie ale limbii

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 orientat pe obiecte

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] .

Limbaj funcțional

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 .

Reutilizare și adaptare

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.

Exemple de programe

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.

Integrare Java

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.

Utilizare

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.

Note

  1. 3.1.3 .
  2. https://www.scala-lang.org/news/2.12.8
  3. http://www.scala-js.org/
  4. http://www.scala-native.org/
  5. Strachan, James Scala ca înlocuitor pe termen lung pentru java/javac? (6 iulie 2009). Consultat la 7 ianuarie 2012. Arhivat din original pe 10 februarie 2012.
  6. Paul Crill. Limbajul Scala se apropie de bare metal . Infoworld (11 mai 2016). Data accesului: 4 decembrie 2016. Arhivat din original pe 27 noiembrie 2016.
  7. Copie arhivată (link nu este disponibil) . Consultat la 7 noiembrie 2010. Arhivat din original la 5 iulie 2010. 
  8. De ce iubim Scala la Coursera . Data accesului: 26 octombrie 2014. Arhivat din original la 1 aprilie 2014.
  9. Scala, Lift și viitorul . Consultat la 26 octombrie 2014. Arhivat din original la 13 ianuarie 2016.
  10. Synodinos, Dionysios G. LinkedIn Signal: A Case Study for Scala, JRuby and Voldemort . InfoQ (11 octombrie 2010). Consultat la 26 octombrie 2014. Arhivat din original pe 26 octombrie 2014.
  11. Greene, Kate Secretul din spatele creșterii Twitter, Cum un nou limbaj de programare web ajută compania să gestioneze popularitatea în creștere. . Analiza tehnologiei . MIT (1 aprilie 2009). Consultat la 6 aprilie 2009. Arhivat din original pe 17 aprilie 2012.
  12. Guardian trece de la Java la Scala . Heise Online (5 aprilie 2011). Consultat la 5 aprilie 2011. Arhivat din original pe 9 aprilie 2011.
  13. Binstock, Andrew. Interviu cu Martin Odersky de la Scala . Dr. Jurnalul lui Dobb (14 iulie 2011). Consultat la 10 februarie 2012. Arhivat din original pe 20 februarie 2012.

Literatură

vorbitor de engleză

vorbitor de limba rusă

  • Horstman K. Scala pentru nerăbdători. - DMK press , 2013. - 408 p. - ISBN 978-5-94074-920-2 , 978-0-321-77409-5.
  • Odersky M., Spoon L., Wenners B. Scala. Programare profesională = Programare în Scala: Actualizat pentru Scala 2.12. - Peter , 2018. - 688 p. - ISBN 978-5-496-02951-3 .
  • Prokopets A. Programare competitivă pe SCALA. - DMK press , 2017. - 342 p. - ISBN 978-5-97060-572-1 .
  • Scala by Example , traducere wikibook a ghidului lui Martin Odersky
  • Scoala Scala! și Scala efectivă  - versiuni rusești ale tutorialelor deschise de pe Twitter
  • Ghidul Scala: serie de articole despre IBM developerWorks

Link -uri