Scala (programozási nyelv)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2018. október 13-án felülvizsgált verziótól ; az ellenőrzések 27 szerkesztést igényelnek .
Scala
Nyelvóra Többparadigma : funkcionális , objektumorientált , kötelező
Megjelent 2004. január 20
Szerző Oderski, Martin
Fejlesztő Az EPFL Programozási Módszer Laboratóriuma
Fájlkiterjesztés _ .scalavagy.sc
Kiadás 3.1.3 [1]  (2022. június 21. ) ( 2022-06-21 )
Típusrendszer statikus , szigorú , típuskövetkeztetés , szerkezeti
Befolyásolva Java , Haskell , Erlang , Standard ML , Objective Caml , Smalltalk , Scheme , Algol68 , Lisp
befolyásolta Kotlin , Swift
Engedély BSD és Apache License 2.0 [2]
Weboldal scala-lang.org
Felület Java virtuális gép , JavaScript [3] és natív [4]

A Scala  egy többparadigmájú programozási nyelv , amelyet tömörnek és típusbiztosnak terveztek a komponensszoftverek egyszerű és gyors létrehozásához , kombinálva a funkcionális és az objektumorientált programozás jellemzőit .

A nyelv első verzióit 2003 -ban készítette el a Lausanne-i Szövetségi Politechnikai Iskola programozási módszerek laboratóriumának csapata Martin Odersky irányításával , a nyelvet Java és JavaScript platformokra implementálták . James Strachan , a Groovy programozási nyelv megalkotója szerint a Scala lehet a Java nyelv utódja [5] .

Történelem

A nyelvet 2001-2004 - ben hozták létre az EPFL Programozási Módszerek Laboratóriumában . Ez annak a kutatásnak az eredménye, amelynek célja az összetevő szoftverek jobb nyelvi támogatásának kifejlesztése volt. Két gondolatot vettek alapul a nyelv fejlesztéséhez:

  1. Egy komponens szoftver programozási nyelvnek skálázhatónak kell lennie abban az értelemben, hogy lehetővé kell tenni a kis és nagy részek leírását is ugyanazon fogalmak használatával. Ezért a figyelem az absztrakció , a kompozíció és a dekompozíció mechanizmusaira összpontosult , ahelyett, hogy nagyszámú primitívet vezetnénk be , amelyek csak egy nagyítási szinten lehetnek hasznosak.
  2. A méretezhető összetevők támogatását olyan programozási nyelv biztosítja, amely egyesíti és általánosítja az objektumorientált és funkcionális programozást . A Scala néhány fő műszaki újítása olyan koncepció, amely e programozási paradigmák fúziója . A statikusan tipizált nyelvekben, mint például a Scala, ezek a paradigmák eddig szinte teljesen elkülönültek egymástól.

A nyelvet 2004 januárjában adták ki általános használatra a JVM platformon és 2004 júniusában a .NET platformon, az LLVM fordító (Scala Native) pedig 2016 -ban készült el [6] .

A tervezés eredete

A nyelvi tervezést számos nyelv és kutatási cikk befolyásolta.

Először is, a nyelv jelentős számú Java és C# fogalmat és szintaktikai konvenciót vett fel . A tulajdonságok kifejezésének módja nagyrészt Sather -től származik . Az egységes objektummodell koncepciója a Smalltalk -ból származik . A BÉTA -ból jött az ötlet, hogy mindennek, beleértve az osztályokat is, lehetővé kell tennie a fészekrakást. A Scala absztrakt típusai nagyon hasonlóak az SML és OCaml absztrakt aláírástípusaihoz , a teljes értékű összetevők kontextusában általánosítva.

Bizonyos értelemben a Scala a Pizza munkájának folytatása . A Pizza-hoz hasonlóan a Scala is fordít a Java virtuális gépre, és magasabb rendű függvényeket , mintaillesztést és konstrukciókat ad hozzá, amelyeket eredetileg a funkcionális programozói közösségben hoztak létre . Míg a Pizza visszafelé kompatibilis a Java-val, a Scala célja csupán az interoperabilitás, így nagyobb a tervezési szabadsága. A Scala másik célja, hogy fejlett konstrukciókat biztosítson az összetevők absztrakciójához és kompozíciójához, amelyet számos közelmúltbeli kutatási fejlesztés is megoszt.

A nyelv legfontosabb szempontjai

A Scala programok sok tekintetben hasonlítanak a Java programokra , és szabadon kommunikálhatnak a Java kóddal. A nyelv egységes objektummodellt tartalmaz, abban az értelemben, hogy bármely érték objektum, és bármely művelet metódushívás . Ugyanakkor funkcionális nyelv is abban az értelemben, hogy a függvények teljes értékű értékek.

A Scala erőteljes és konzisztens absztrakciós koncepciókat tartalmaz mind a típusok, mind az értékek tekintetében. A nyelv különösen rugalmas szimmetrikus mixin konstrukciókat tartalmaz az osztályok és tulajdonságok összeállításához . Talán lehetővé teszi az objektumok bontását egy mintával való összehasonlítással ; A minták és kifejezések általánosításra kerültek az XML dokumentumok természetes feldolgozásának támogatására. Általánosságban elmondható, hogy ezek a konstrukciók egyszerűvé teszik az önálló komponensek Scala- könyvtárak segítségével történő kifejezését speciális nyelvi konstrukciók használata nélkül.

A nyelv lehetővé teszi a külső összetevők kiterjesztését nézetek használatával . Az általános programozási funkciók az általános függvények ( generics ) támogatásán keresztül valósulnak meg , beleértve a magasabb típust ( magasabb típusú generikusok ). A különféle klasszikus szerkezeti adattípusok mellett a nyelv támogatja az egzisztenciális típusokat .

Objektumorientált nyelv

A nyelv a Smalltalk - hoz hasonló tiszta objektum-orientált modellt használ : minden érték objektum , minden művelet pedig üzenet. Például az összeadást úgy értelmezzük , mint egy argumentumot tartalmazó metódushívást és vevőobjektumként. x+yx.+(y)+yx

Nézzünk egy másik példát: 1+2. Ezt a kifejezést a következőképpen értelmezzük (1).+(2). Vegye figyelembe, hogy a számok körüli zárójelek kötelezőek, mert a Scala lexer a lehető leghosszabb egyezés elve alapján tokenekre bontja a kifejezést. Így a kifejezés , és 1.+(2)tokenekre lesz felosztva , mivel a token hosszabb, mint a token , és az összeadás első argumentuma Double típusúként lesz értelmezve Int helyett [7] . 1.+21.1

Funkcionális nyelv

Minden függvény egy érték. A nyelv könnyű szintaxist biztosít az anonim és curryed függvények meghatározásához. Minden konstrukció egy értéket ad vissza. A mintaillesztés természetesen alkalmazható reguláris kifejezésekkel végzett XML -feldolgozásra .

Újrahasználat és adaptálás

Minden erőteljes absztrakciós és kompozíciós konstrukcióval rendelkező komponensrendszer kihívásokkal néz szembe, amikor a különböző csapatok által különböző időpontokban kifejlesztett alrendszereket integrálni kell. A probléma az, hogy az egyik vagy másik csoport által kifejlesztett komponensek felülete gyakran nem alkalmas azon ügyfelek számára, akik ezt a komponenst kívánják használni.

A Scala egy új koncepciót vezet be a külső bővíthetőség problémájának megoldására – nézetek ( nézetek ). Lehetővé teszik az osztály új tagokkal és tulajdonságokkal való bővítését . A Scala nézetei bizonyos tekintetben megfelelnek a Haskellben használt típusosztályoknak , de a típusosztályokkal ellentétben a nézetek hatóköre szabályozható, és párhuzamos nézetek is létezhetnek a program különböző részeiben.

Programpéldák

A program, akárcsak a Java-ban, egy osztály. Ez egy példa egy konzolprogramra, amely szövegsort nyomtat a képernyőre.

object HelloWorld { def main ( args : Array [ String ]) = println ( "Hello WORLD!" ) } // A rövidebb verzió objektum HelloWorld kiterjeszti az alkalmazást { println ( "Hello WORLD!" ) }

A következő egyszerű programpélda Java , Scala és C# nyelven íródott, és néhány szintaxisbeli különbséget mutat ( a változótípusok postfix jelölése , nincs speciális szintaxis a tömbök elérésére ). Ez a példa egy konzolprogramot ír le, amely kinyomtatja a parancssorban átadott összes beállítást. Az opciók "-" (mínusz) karakterrel kezdődnek.

// Java: class PrintOptions { public static void main ( String [] args ) { System . ki . println ( "Opciók kiválasztva:" ); patak . ( args ) . _ szűrő ( arg -> arg . startWith ( "-" ) ) . térkép ( arg -> arg . részkarakterlánc ( 1 )) . forEach ( System.out :: println ) ; _ } } // Scala: object PrintOptions { def main ( args : Array [ String ]) { println ( "Opciók kiválasztva:" ) for ( arg <- args if arg startsWith "-" ) { println ( " " + ( arg substring 1 ) ) } } } // Functional Scala style: object PrintOptions { def main ( args : Array [ String ]) = println ( "Opciók kiválasztva:" +: ( args filter ( _ startsWith "-" ) ) map ( " " + _ . drop ( 1 ) )) mkString "\n" ) } // Funkcionális C# stílus: class PrintOptions { static void Main ( String [] args ) { Console . WriteLine ( "Opciók kiválasztva:" + args . Ahol ( x => x . Kezdődik ( "-" )). Összesítés (( r , x ) => r + " " + x . Alkarakterlánc ( 1 ))); } } // Funkcionális Java stílus: class PrintOptions { public static void main ( String [] args ) { System . ki . println ( "Opciók kiválasztva:\n" + Tömbök . folyam ( args ) . filter ( o -> o . startWith ( "-" ) ) . map ( o -> " " + o . alkarakterlánc ( 1 )) . collection ( Collectors.joining ( " \ n" ))); } }

A Scala nem objektumosztályt deklarál, hanem azonnal objektumpéldányt. Így valósul meg a tervezési minta természetes módon, ahol a programnak csak egy példánya kell, hogy legyen az osztályból ("Singleton" - "Singleton").

Példa egy olyan programra, amely egy argumentumokon keresztül átadott lista összes elemét összegzi:

object Main { def main ( args : Array [ String ]) { try { println ( "Argumentumok összege: " + args . map ( _ . toInt ). sum ) } catch { case e : NumberFormatException => println ( "Hiba argumentumok .A következőképpen kell használni: scala Main <szám1> <szám2> ... " ) } } }

Java nyelven:

public class { public static void main ( String [ ] args ) { try { System . ki . println ( "Argumentumok összege: " + Tömbök . folyam ( args ). mapToInt ( Integer :: parseInt ). sum ()); } catch ( NumberFormatException e ) { System . ki . println ( "Hiba az argumentumokban. A következőképpen kell használni: java Main <szám1> <szám2> ... " ); } } }

A metódus mapismétlődik az összes argumentum felett. A metódus mindegyikét egész számmá alakítja, Integer.parseIntés hozzáadja a listához (tömbhöz) elems. Ezután a listahajtás foldRight módszerével kiszámítjuk az elemek összegét.

Java integráció

A Scala képes együttműködni a Java nyelven írt kóddal. A csomag összes osztálya java.langmár alapértelmezés szerint benne van, míg a többit kifejezetten tartalmaznia kell.

Használat

A Scalában írt fő webes keretrendszerek a Play , Lift . Felhasználóik közül számos nagy szolgáltatást említenek, különösen a Play a Gilt és a Coursera [8] , a Foursquare pedig a  Lift [9] szolgáltatást használja .

A LinkedIn közösségi hálózat a Scalatra mikrokeretet használja a Signal API támogatására [10] .

2009 áprilisában a Twitter bejelentette, hogy szerverkódjának jelentős részét Rubyról a Scalába helyezte át, a többit pedig áthelyezi [11] . 2011 áprilisában a The Guardian online verziója Java-ról Scalára került [12] .

Apache Foundation projektek: Apache Spark , Apache Kafka elsősorban Scalában íródnak.

A nyelv egyik aktív használója a bank UBS is [13] .

A Scala fejlesztői keretrendszer egyik fontos része, az Sbt auto-build tool  szintén Scalában van megírva.

Jegyzetek

  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 a java/javac hosszú távú helyettesítője? (2009. július 6.). Letöltve: 2012. január 7. Az eredetiből archiválva : 2012. február 10.
  6. Paul Crill. A Scala nyelve közelebb kerül a csupasz fémhez . Infoworld (2016. május 11.). Hozzáférés időpontja: 2016. december 4. Az eredetiből archiválva : 2016. november 27.
  7. Archivált másolat (a hivatkozás nem elérhető) . Letöltve: 2010. november 7. Az eredetiből archiválva : 2010. július 5.. 
  8. Miért szeretjük a Scalát a Courserában ? Hozzáférés időpontja: 2014. október 26. Az eredetiből archiválva : 2014. április 1..
  9. Scala, Lift és a jövő . Letöltve: 2014. október 26. Az eredetiből archiválva : 2016. január 13..
  10. Synodinos, Dionysios G. LinkedIn Signal: A Case Scala, JRuby és Voldemort esettanulmánya . InfoQ (2010. október 11.). Letöltve: 2014. október 26. Az eredetiből archiválva : 2014. október 26..
  11. Greene, Kate A Twitter növekedésének titka, Hogyan segít egy új webes programozási nyelv a vállalatnak kezelni növekvő népszerűségét. . Technológiai Szemle . MIT (2009. április 1.). Letöltve: 2009. április 6. Az eredetiből archiválva : 2012. április 17..
  12. A Guardian átvált Java-ról Scalára . Heise Online (2011. április 5.). Letöltve: 2011. április 5. Az eredetiből archiválva : 2011. április 9..
  13. Binstock, Andrew. Interjú a Scala munkatársával, Martin Oderskyvel . Dr. Dobb's Journal (2011. július 14.). Letöltve: 2012. február 10. Az eredetiből archiválva : 2012. február 20..

Irodalom

angolul beszélő

oroszul beszélő

  • Horstman K. Scala a türelmetleneknek. - DMK sajtó , 2013. - 408 p. - ISBN 978-5-94074-920-2 , 978-0-321-77409-5.
  • Odersky M., Spoon L., Wenners B. Scala. Professzionális programozás = Programozás a Scalában: Frissítve a Scala 2.12-hez. - Péter , 2018. - 688 p. - ISBN 978-5-496-02951-3 .
  • Prokopets A. Versenyképes programozás a SCALA-n. - DMK sajtó , 2017. - 342 p. - ISBN 978-5-97060-572-1 .
  • Scala példa szerint, Martin Odersky útmutatójának wikikönyves fordítása
  • Scala Iskola! és Hatékony Scala  – nyílt oktatóanyagok orosz verziói a Twitterről
  • A Scala Guide: cikksorozat az IBM developerWorksről

Linkek