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 ) |
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] .
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:
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] .
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.
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 .
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 .
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 .
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.
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.
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.
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.
Ohjelmointikielet | |
---|---|
|