Scala (ohjelmointikieli)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 13. lokakuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 27 muokkausta .
Scala
Kieliluokka Moniparadigma : toiminnallinen , oliosuuntautunut , pakollinen
Esiintyi 20. tammikuuta 2004
Tekijä Oderski, Martin
Kehittäjä EPFL :n ohjelmointimenetelmien laboratorio
Tiedostotunniste _ .scalatai.sc
Vapauta 3.1.3 [1]  (21. kesäkuuta 2022 ) ( 21.06.2022 )
Tyyppijärjestelmä staattinen , tiukka , tyyppipäätelmä , rakenteellinen
Vaikutettu Java , Haskell , Erlang , Standard ML , Objective Caml , Smalltalk , Scheme , Algol68 , Lisp
vaikutti Kotlin , Swift
Lisenssi BSD ja Apache License 2.0 [2]
Verkkosivusto scala-lang.org
Alusta Java-virtuaalikone , JavaScript [3] ja alkuperäinen [4]

Scala  on moniparadigma ohjelmointikieli , joka on suunniteltu tiiviiksi ja tyyppiturvalliseksi komponenttiohjelmistojen helppoon ja nopeaan luomiseen yhdistäen toiminnallisen ja olioohjelmoinnin ominaisuudet .

Ensimmäiset versiot kielestä loi vuonna 2003 Lausannen liittovaltion ammattikorkeakoulun ohjelmointimenetelmien laboratorion tiimi Martin Oderskyn johdolla , kieli toteutettiin Java- ja JavaScript -alustoille . Groovy -ohjelmointikielen luojan James Strachan mukaan Scala voisi olla Java-kielen seuraaja [5] .

Historia

Kieli luotiin vuosina 2001-2004 EPFL Programming Methods Laboratoryssa . Se oli tulos tutkimuksesta, jonka tavoitteena oli kehittää parannettu kielituki komponenttiohjelmistoille. Kielen kehittämisen perustaksi otettiin kaksi ajatusta:

  1. Komponenttiohjelmiston ohjelmointikielen tulee olla skaalautuva siinä mielessä , että sen tulee olla mahdollista kuvata sekä pieniä että suuria osia samoilla käsitteillä. Siksi huomio on keskittynyt abstraktion , koostumuksen ja hajotuksen mekanismeihin sen sijaan, että esitettäisiin suuri määrä primitiivisiä , jotka voivat olla hyödyllisiä vain yhdellä zoomaustasolla.
  2. Skaalautuvan komponentin tuki voidaan tarjota ohjelmointikielellä, joka yhdistää ja yleistää olio- ja toiminnallisen ohjelmoinnin . Jotkut Scalan tärkeimmistä teknisistä innovaatioista ovat konsepteja, jotka ovat näiden ohjelmointiparadigmien fuusio . Staattisesti kirjoitetuissa kielissä, kuten Scalassa, nämä paradigmat ovat tähän asti olleet lähes täysin erillään toisistaan.

Kieli julkaistiin yleiseen käyttöön JVM -alustalla tammikuussa 2004 ja .NET -alustalla kesäkuussa 2004, ja LLVM - kääntäjä (Scala Native) luotiin vuonna 2016 [6] .

Suunnittelun alkuperä

Kielisuunnitteluun ovat vaikuttaneet monet kielet ja tutkimuspaperit.

Ensinnäkin kieli on imenyt huomattavan määrän Java- ja C# -käsitteitä ja syntaktisia käytäntöjä . Ominaisuuksien ilmaisutapa on suurelta osin lainattu Satherilta . Yhtenäisen objektimallin käsite on otettu Smalltalkista . BETA : sta syntyi ajatus, että kaiken, mukaan lukien luokat, pitäisi sallia sisäkkäin. Scalan abstraktit tyypit ovat hyvin samankaltaisia ​​kuin abstraktit allekirjoitustyypit SML :ssä ja OCamlissa , yleistettynä täysimittaisten komponenttien yhteydessä.

Tietyssä mielessä Scala on jatkoa Pizzan työlle . Kuten Pizza, Scala kääntää Java-virtuaalikoneeseen lisäämällä korkeamman asteen toimintoja , kuvioiden yhteensovittamista , rakenteita, jotka on alun perin luotu toiminnallisessa ohjelmointiyhteisössä . Vaikka Pizza on taaksepäin yhteensopiva Javan kanssa, Scalan tavoitteena on vain yhteentoimivuus, joten siinä on enemmän suunnitteluvapautta. Toinen Scalan tavoite on tarjota edistyneitä rakenteita komponenttien abstraktioon ja koostumukseen, jotka ovat yhteisiä useiden viimeaikaisten tutkimusten kanssa.

Kielen keskeiset näkökohdat

Scala-ohjelmat ovat monin tavoin samanlaisia ​​​​kuin Java -ohjelmat , ja ne voivat olla vapaasti vuorovaikutuksessa Java-koodin kanssa. Kieli sisältää yhtenäisen objektimallin siinä mielessä, että mikä tahansa arvo on objekti ja mikä tahansa operaatio menetelmäkutsu . Samalla se on myös toiminnallinen kieli siinä mielessä, että funktiot ovat täysiarvoisia arvoja.

Scala sisältää tehokkaat ja johdonmukaiset abstraktiokonseptit sekä tyypeille että arvoille. Erityisesti kieli sisältää joustavia symmetrisiä mixin - rakenteita luokkien ja ominaisuuksien koostumukseen . Ehkä voit hajottaa objekteja vertaamalla niitä näytteeseen ; malleja ja lausekkeita on yleistetty tukemaan XML - dokumenttien luonnollista käsittelyä. Yleensä näiden konstruktien avulla on helppoa ilmaista itsenäisiä komponentteja käyttämällä Scala- kirjastoja ilman erityisiä kielirakenteita.

Kieli sallii ulkoisten komponenttien laajennukset näkymien avulla . Yleiset ohjelmointiominaisuudet toteutetaan tukemalla yleisiä toimintoja ( generics ), mukaan lukien korkeampi tyyppi ( korkeamman tyyppiset geneeriset toiminnot ). Erilaisten klassisten rakennetietotyyppien lisäksi kieli sisältää tuen eksistentiaalisille tyypeille .

Olio kieli

Kieli käyttää puhdasta oliomallia , joka on samanlainen kuin Smalltalkin : jokainen arvo on objekti ja jokainen operaatio on viesti. Esimerkiksi summaus x+ytulkitaan x.+(y), eli menetelmäkutsuksi +argumentilla yja xvastaanotinobjektiksi.

Tarkastellaanpa toista esimerkkiä: 1+2. Tämä ilmaus tulkitaan (1).+(2). Huomaa, että sulut numeroiden ympärillä ovat pakollisia, koska Scala lexer jakaa lausekkeen tokeneiksi pisimmän mahdollisen vastaavuuden periaatteen mukaisesti. Siten lauseke 1.+(2)jaetaan tokeneihin 1., +ja 2, koska merkki 1.on pidempi kuin merkki 1ja ensimmäinen lisäargumentti tulkitaan tyypiksi Double Int [7] sijaan .

Toiminnallinen kieli

Jokainen funktio on arvo. Kieli tarjoaa kevyen syntaksin anonyymien ja curry - funktioiden määrittämiseen . Jokainen rakennelma palauttaa arvon. Kuvioiden sovitus soveltuu luonnollisesti XML - käsittelyyn säännöllisillä lausekkeilla .

Uudelleenkäyttö ja mukauttaminen

Jokainen komponenttijärjestelmä, jossa on voimakkaita abstraktio- ja sommittelurakenteita, kohtaa haasteen eri tiimien eri aikoina kehittämien alijärjestelmien integroinnissa. Ongelmana on, että yhden tai toisen ryhmän kehittämien komponenttien käyttöliittymä ei useinkaan sovi asiakkaille, jotka aikovat käyttää tätä komponenttia.

Scala esittelee uuden konseptin ulkoisen laajennettavuuden ongelman ratkaisemiseksi - näkymät ( näkymät ). Niiden avulla luokkaa voidaan laajentaa uusilla jäsenillä ja piirteillä . Scalan näkymät vastaavat jollain tapaa Haskellin tyyppiluokkia , mutta toisin kuin tyyppiluokissa, näkymien laajuutta voidaan hallita ja rinnakkaiset näkymät voivat olla rinnakkain ohjelman eri osissa.

Ohjelmaesimerkkejä

Ohjelma, kuten Java, on luokka. Tämä on esimerkki konsoliohjelmasta, joka tulostaa tekstirivin näytölle.

object HelloWorld { def main ( args : Array [ String ]) = println ( "Hello WORLD!" ) } // Lyhyempi versioobjekti HelloWorld laajentaa App { println ( "Hello WORLD!" ) }

Seuraava yksinkertainen ohjelmaesimerkki on kirjoitettu Java- , Scala- ja C# -kielellä , ja siinä näkyy joitain eroja syntaksissa ( muuttujatyyppien postfix-merkintä , ei erityistä syntaksia taulukoiden käyttämiseen ). Tämä esimerkki kuvaa konsoliohjelmaa, joka tulostaa kaikki komentorivillä välitetyt asetukset. Vaihtoehdot alkavat "-" (miinus) -symbolilla.

// Java: class PrintOptions { public static void main ( String [] args ) { System . ulos . println ( "Vaihtoehdot valittu:" ); virta . / ( args ) . suodatin ( arg -> arg . alkaaWith ( "-" ) ) . kartta ( arg -> arg . osamerkkijono ( 1 )) . forEach ( System.out :: println ) ; _ } } // Scala: object PrintOptions { def main ( args : Array [ String ]) { println ( "Vaihtoehdot valittu:" ) for ( arg <- args if arg startsWith "-" ) { println ( " " + ( arg alimerkkijono 1 ) ) } } } // Functional Scala style: object PrintOptions { def main ( args : Array [ String ]) = println ( "Asetukset valittu:" +: ( args filter ( _ startsWith "-" ) map ( " " + _ . drop ( 1 ) )) mkString "\n" ) } // Funktionaalinen C#-tyyli: class PrintOptions { static void Main ( String [] args ) { Console . WriteLine ( "Vaihtoehdot valittu:" + args . Missä ( x => x . Alkaa ( "-" )). Aggregate (( r , x ) => r + " " + x . Alimerkkijono ( 1 ))); } } // Toiminnallinen Java-tyyli: class PrintOptions { public static void main ( String [] args ) { System . ulos . println ( "Vaihtoehdot valittu:\n" + Arrays . stream ( args ) . filter ( o -> o . startsWith ( "-" ) ) . map ( o -> " " + o . alimerkkijono ( 1 )) . kerätä ( Keräilijät.liittyvät ( " \ n" ))); } }

Scala ei määritä objektiluokkaa, vaan välittömästi objektiinstanssia. Näin suunnittelumalli toteutetaan luonnollisella tavalla, jossa ohjelmassa tulee olla vain yksi luokan esiintymä ("Singleton" - "Singleton").

Esimerkki ohjelmasta, joka summaa kaikki argumenttien kautta välitetyn luettelon elementit:

object Main { def main ( args : Array [ String ]) { try { println ( "Argumenttien summa: " + args . map ( _ . toInt ). summa ) } catch { case e : NumberFormatException => println ( "Virhe argumentit . Sitä tulee käyttää näin: scala Main <numero1> <numero2> ... " ) } } }

Javassa:

public class Main { public static void main ( Merkkijono [ ] args ) { kokeile { Järjestelmä . ulos . println ( "Argumenttien summa: " + Arrays . stream ( args ). mapToInt ( Integer :: parseInt ). summa ()); } catch ( NumberFormatException e ) { System . ulos . println ( "Virhe argumenteissa. Pitäisi käyttää näin: java Main <numero1> <numero2> ... " ); } } }

Menetelmä maptoistuu kaikkien argumenttien yli. Ne kaikki muunnetaan kokonaisluvuiksi menetelmällä Integer.parseIntja lisätään luetteloon (taulukkoon) elems. Sitten lasketaan listataittomenetelmällä foldRight elementtien summa.

Java-integraatio

Scala voi olla vuorovaikutuksessa Javalla kirjoitetun koodin kanssa. Kaikki paketin luokat java.langsisältyvät jo oletusarvoisesti, kun taas muut on sisällytettävä eksplisiittisesti.

Käyttö

Tärkeimmät Scalassa kirjoitetut verkkokehykset ovat Play , Lift . Käyttäjiensä joukossa on huomattava joukko suuria palveluita, erityisesti Play käyttää Giltiä ja Courseraa [8] ja Foursquare  Liftiä [9] .

Sosiaalinen verkosto LinkedIn käyttää Scalatra-mikrokehystä tukeakseen Signal API:ta [10] .

Huhtikuussa 2009 Twitter ilmoitti siirtäneensä huomattavan osan palvelinkoodistaan ​​Rubysta Scalaan ja aikoo siirtää loput [11] . Huhtikuussa 2011 The Guardianin verkkoversio siirrettiin Javasta Scalaan [12] .

Apache Foundation -projektit: Apache Spark , Apache Kafka on kirjoitettu pääasiassa Scalassa.

Yksi kielen aktiivisista käyttäjistä on myös pankki UBS [13] .

Tärkeä osa Scala-kehityskehystä, Sbt auto-build -työkalu  , on myös kirjoitettu Scalassa.

Muistiinpanot

  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 pitkällä aikavälillä javan/javacin korvaajaksi? (6. heinäkuuta 2009). Haettu 7. tammikuuta 2012. Arkistoitu alkuperäisestä 10. helmikuuta 2012.
  6. Paul Crill. Scalan kieli siirtyy lähemmäksi paljasmetallia . Infoworld (11. toukokuuta 2016). Käyttöpäivä: 4. joulukuuta 2016. Arkistoitu alkuperäisestä 27. marraskuuta 2016.
  7. Arkistoitu kopio (linkki ei saatavilla) . Haettu 7. marraskuuta 2010. Arkistoitu alkuperäisestä 5. heinäkuuta 2010. 
  8. Miksi rakastamme Scalaa Courserassa . Käyttöpäivä: 26. lokakuuta 2014. Arkistoitu alkuperäisestä 1. huhtikuuta 2014.
  9. Scala, Lift ja tulevaisuus . Haettu 26. lokakuuta 2014. Arkistoitu alkuperäisestä 13. tammikuuta 2016.
  10. Synodinos, Dionysios G. LinkedIn Signal: Case Scala, JRuby ja Voldemort . InfoQ (11. lokakuuta 2010). Haettu 26. lokakuuta 2014. Arkistoitu alkuperäisestä 26. lokakuuta 2014.
  11. Greene, Kate Twitterin kasvun salaisuus, kuinka uusi web-ohjelmointikieli auttaa yritystä hallitsemaan kasvavaa suosiotaan. . Teknologiakatsaus . MIT (1. huhtikuuta 2009). Haettu 6. huhtikuuta 2009. Arkistoitu alkuperäisestä 17. huhtikuuta 2012.
  12. Guardian siirtyy Javasta Scalaan . Heise Online (5. huhtikuuta 2011). Haettu 5. huhtikuuta 2011. Arkistoitu alkuperäisestä 9. huhtikuuta 2011.
  13. Binstock, Andrew. Scalan Martin Oderskyn haastattelu . DR. Dobb's Journal (14. heinäkuuta 2011). Haettu 10. helmikuuta 2012. Arkistoitu alkuperäisestä 20. helmikuuta 2012.

Kirjallisuus

Englantia puhuva

Venäjänkielinen

Linkit