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. ) |
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] .
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:
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 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 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 .
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
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 .
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.
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 Fő { 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.
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.
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.
Programozási nyelvek | |
---|---|
|