Scala | |
---|---|
Jazyková třída | Multiparadigma : funkční , objektově orientované , imperativní |
Objevil se v | 20. ledna 2004 |
Autor | Oderski, Martin |
Vývojář | Laboratoř metod programování EPFL |
Přípona souboru | .scalanebo.sc |
Uvolnění | 3.1.3 [1] (21. června 2022 ) |
Typový systém | statický , přísný , typová inference , strukturální |
Byl ovlivněn | Java , Haskell , Erlang , Standard ML , Objective Caml , Smalltalk , Schéma , Algol68 , Lisp |
ovlivnil | Kotlin , Swift |
Licence | Licence BSD a Apache 2.0 [2] |
webová stránka | scala-lang.org _ |
Plošina | Java Virtual Machine , JavaScript [3] a nativní [4] |
Scala je multiparadigmatický programovací jazyk navržený tak, aby byl stručný a typově bezpečný pro snadné a rychlé vytváření komponentového softwaru , kombinující vlastnosti funkčního a objektově orientovaného programování .
První verze jazyka byly vytvořeny v roce 2003 týmem laboratoře programovacích metod Federální polytechnické školy v Lausanne pod vedením Martina Oderského , jazyk byl implementován pro platformy Java a JavaScript . Podle Jamese Strachana , tvůrce programovacího jazyka Groovy , by Scala mohla být nástupcem jazyka Java [5] .
Jazyk byl vytvořen v letech 2001-2004 v EPFL Programming Methods Laboratory . Byl výsledkem výzkumu zaměřeného na vývoj vylepšené jazykové podpory pro komponentní software. Jako základ pro vývoj jazyka byly vzaty dvě myšlenky:
Jazyk byl uvolněn pro obecné použití na platformě JVM v lednu 2004 a na platformě .NET v červnu 2004 a v roce 2016 byl vytvořen kompilátor LLVM (Scala Native) [6] .
Jazykový design byl ovlivněn mnoha jazyky a výzkumnými články.
Za prvé, jazyk absorboval značné množství konceptů Java a C# a syntaktických konvencí . Způsob, jakým jsou vlastnosti vyjádřeny, je z velké části převzat od Sathera . Koncept jednotného objektového modelu je převzat ze Smalltalku . Z BETA vzešel nápad, že vše, včetně tříd, by mělo umožňovat vnořování. Abstraktní typy ve Scale jsou velmi podobné abstraktním typům podpisů v SML a OCaml , zobecněné v kontextu plnohodnotných komponent.
V jistém smyslu je Scala pokračováním práce Pizza . Stejně jako Pizza se i Scala kompiluje do Java VM a přidává funkce vyššího řádu , porovnávání vzorů , konstrukce, které byly původně vytvořeny v komunitě funkčního programování . Zatímco Pizza je zpětně kompatibilní s Javou, cílem Scaly je pouze interoperabilita, takže má větší svobodu designu. Dalším cílem Scaly je poskytovat pokročilé konstrukce pro abstrakci a kompozici komponent, sdílené s několika nedávnými výzkumy.
Programy Scala jsou v mnoha ohledech podobné programům Java a mohou volně interagovat s kódem Java. Jazyk zahrnuje jednotný objektový model v tom smyslu, že jakákoli hodnota je objekt a jakákoli operace je voláním metody . Zároveň je to také funkční jazyk v tom smyslu, že funkce jsou plnohodnotnými hodnotami.
Scala obsahuje výkonné a konzistentní koncepty abstrakce pro typy i hodnoty. Konkrétně jazyk obsahuje flexibilní symetrické mixinové konstrukty pro složení tříd a vlastností . Možná vám umožňuje rozložit objekty porovnáním se vzorkem ; vzory a výrazy byly zobecněny, aby podporovaly přirozené zpracování dokumentů XML . Obecně tyto konstrukce usnadňují vyjádření samostatných komponent pomocí knihoven Scala bez použití speciálních jazykových konstrukcí.
Jazyk umožňuje rozšíření externích komponent pomocí pohledů . Vlastnosti generického programování jsou realizovány podporou generických funkcí ( generika ), včetně vyššího typu ( generika vyššího druhu ). Kromě různých klasických strukturních datových typů obsahuje jazyk podporu pro existenciální typy .
Jazyk používá čistě objektově orientovaný model podobný Smalltalku : každá hodnota je objekt a každá operace je zpráva. Například sčítání x+yje interpretováno jako x.+(y), to znamená jako volání metody +s argumentem ya xjako objekt příjemce.
Podívejme se na další příklad: 1+2. Tento výraz je interpretován jako (1).+(2). Všimněte si, že závorky kolem čísel jsou povinné, protože lexer Scala rozděluje výraz na tokeny na základě principu nejdelší možné shody. Výraz bude tedy 1.+(2)rozdělen na tokeny 1., +a 2, protože token 1.je delší než token 1a první argument sčítání bude interpretován jako typ Double namísto Int [7] .
Každá funkce je hodnota. Jazyk poskytuje lehkou syntaxi pro definování anonymních a curried funkcí. Každý konstrukt vrací hodnotu. Shoda vzorů je přirozeně použitelná pro zpracování XML s regulárními výrazy .
Každý komponentní systém se silnou abstrakcí a kompozičními konstrukcemi čelí výzvě, pokud jde o integraci subsystémů vyvinutých různými týmy v různých časech. Problém je v tom, že rozhraní komponent vyvinutých tou či onou skupinou často není vhodné pro klienty, kteří hodlají tuto komponentu používat.
Scala zavádí nový koncept řešení problému vnější rozšiřitelnosti - pohledy ( views ). Umožňují rozšířit třídu o nové členy a vlastnosti . Pohledy ve Scale v některých ohledech odpovídají typovým třídám používaným v Haskellu , ale na rozdíl od typových tříd lze rozsah pohledů řídit a paralelní pohledy mohou koexistovat v různých částech programu.
Program, jako v Javě, je třída. Toto je příklad konzolového programu, který vytiskne řádek textu na obrazovku.
object HelloWorld { def main ( args : Array [ String ]) = println ( "Ahoj SVĚT!" ) } // Objekt kratší verze HelloWorld extends App { println ( "Hello WORLD!" ) }Následující jednoduchý příklad programu je napsán v jazycích Java , Scala a C# , ukazuje některé rozdíly v syntaxi ( postfixová notace typů proměnných, žádná speciální syntaxe pro přístup k polím ). Tento příklad popisuje konzolový program, který vypíše všechny volby předané na příkazovém řádku. Možnosti začínají znakem „-“ (mínus).
// Java: class PrintOptions { public static void main ( String [] args ) { System . ven . println ( "Vybrané možnosti:" ); proud . z ( argumenty ) . filtr ( arg -> arg . začínáS ( "-" ) ) . mapa ( arg -> arg . dílčí řetězec ( 1 )) . forEach ( System.out :: println ) ; _ } } // Scala: object PrintOptions { def main ( args : Array [ Řetězec ]) { println ( "Vybrané možnosti:" ) for ( arg <- argumenty , pokud argument začínáS "-" ) { println ( " " + ( arg substring 1 ) ) } } } // Funkční styl Scala: objekt PrintOptions { def main ( args : Array [ String ]) = println ( "Vybrané možnosti:" +: ( filtr argumentů ( _ začínáS "-" ) map ( " " + _ . drop ( 1 ) )) mkString "\n" ) } // Funkční styl C#: class PrintOptions { static void Main ( String [] args ) { Console . WriteLine ( "Vybrané možnosti:" + argumenty . Kde ( x => x . ZačínáWith ( "-" )). Agregát (( r , x ) => r + " " + x . Podřetězec ( 1 ))); } } // Funkční styl Java: class PrintOptions { public static void main ( String [] args ) { System . ven . println ( "Vybrané možnosti:\n" + Pole . stream ( args ) . filtr ( o -> o . začínáWith ( "-" ) ) . mapa ( o -> " " + o . podřetězec ( 1 )) . sbírat ( Collectors.joining ( " \ n" ))); } }Scala nedeklaruje třídu objektů, ale okamžitě instanci objektu. Takto je návrhový vzor implementován přirozeným způsobem, kdy program by měl mít pouze jednu instanci třídy („Singleton“ - „Singleton“).
Příklad programu, který sčítá všechny prvky seznamu, který je předán argumenty:
object Main { def main ( args : Array [ String ]) { try { println ( " Součet argumentů: " + argumenty . map ( _ . toInt . sum ) } catch { case e : NumberFormatException => println ( "Chyba v argumenty .Mělo by být použito takto: scala Hlavní <číslo1> <číslo2> ... " ) } } }V Javě:
public class Hlavní { public static void main ( String [] args ) { try { System . ven . println ( "Součet argumentů: " + Pole . proud ( args ). mapToInt ( Integer :: parseInt ). součet ()); } catch ( NumberFormatException e ) { System . ven . println ( "Chyba v argumentech. Mělo by být použito takto: java Main <číslo1> <číslo2> ... " ); } } }Metoda mapiteruje přes všechny argumenty. Všechny jsou metodou převedeny na celé číslo Integer.parseInta přidány do seznamu (pole) elems. Poté se pomocí metody list fold foldRight vypočítá součet prvků.
Scala může komunikovat s kódem napsaným v Javě. Všechny třídy z balíčku java.langjsou již zahrnuty ve výchozím nastavení, zatímco ostatní musí být zahrnuty explicitně.
Hlavní webové rámce napsané ve Scale jsou Play , Lift . Mezi jejich uživateli je zaznamenána řada velkých služeb, zejména Play používá Gilt a Coursera [8] a Foursquare používá Lift [9] .
Sociální síť LinkedIn využívá k podpoře svého Signal API mikrorámec Scalatra [10] .
V dubnu 2009 Twitter oznámil, že přesunul významnou část svého serverového kódu z Ruby do Scaly a chystá se přesunout zbytek [11] . V dubnu 2011 byla online verze The Guardian migrována z Javy do Scaly [12] .
Projekty Apache Foundation: Apache Spark , Apache Kafka jsou psány primárně ve Scale.
Jedním z aktivních uživatelů jazyka je také banka UBS [13] .
Důležitá součást vývojového rámce Scaly, nástroj Sbt auto-build , je také napsán ve Scale.
Programovací jazyky | |
---|---|
|