Umeå Universitet VT 14 18 februari 2014 Scala Programspråk Handledare: Jan-Erik Moström, Petter Ericson Namn: Johan Edeljung, Marcus Hellman Markus Sköld, Linus Öberg , Eric Sjögren CS-användare: oi11ejn, oi11hms , oi11msd , c11log , c08esn Scala Grupp 7 18 februari 2014 Innehåll 1 Inledning 2 2 Syntax 3 3 Om språket 6 4 Fördelar och nackdelar med Scala 8 4.1 Fördelar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 4.2 Nackdelar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 5 Referenser 10 1 Scala 1 Grupp 7 18 februari 2014 Inledning Scala är ett programmeringsspråk som förenar objektorienterad programmering med funktionell programmering. Namnet Scala är en kombination av ıScalableLanguage alltså skalbart språk vilket syftar till att språket är designat för att växa med användaren. Det kompileras till Java bytekod som sedan exekveras via Javas virtuella maskin, som förkortas JVM. Designen av Scala påbörjades 2001 i Schweiz av Martin Odersky, som är en tysk professor i programmeringsmetodik. Han hade sedan en lång tid tillbaka varit väldigt förtjust i funktionell programmering och dess elegans. När Odersky fick veta om att Java var på väg började han och en annan professor, Phil Wadler, att arbeta med ett annat programspråk, som de döpte till P izza. Detta språk skulle få in vissa inslag av funktionell programmering i Java-sfären. P izza innehöll tre delar av funktionell programmering nämligen generics, higher − orderf unctions och mnstermatchning. Språket kom ut ett år efter Java, det blev ingen större succé men visade att det gick att implementera funktionell programmering i JVM plattformen. De blev dock kontaktade av Sun, ursprungsutvecklarna av Java, eftersom de var intresserade av de generics som fanns i P izza. Odersky och Wadler, tillsammans med några från Sun, utvecklade då ett nytt språk som fick heta GenericJava som var en utbyggd version av Java men vilket även innehöll stöd för generics. Detta släpptes 1997/1998 och blev sex år senare tillsammans med ıwildcards en del av Java när version 5.0 släpptes. Sun insåg dock innan det att kompilatorn som Odersky byggt för GenericJava var mycket stabilare och hållbarare än deras kompilator. Sun lät därför Oderskys kompilator bli standarden för javac redan 2000 vilket den är än idag. Under hela tiden när Odersky utvecklade P izza och GenericJava så kände han sig låst av alla de begränsningar som Java innehöll, vilket gjorde att han inte kunde göra de saker han ville göra. Han hade hela tiden försökt göra Java till ett bättre språk, men bestämde sig för att han nu ville göra något nytt. Han ville börja från början och se om han kunde göra något som var bättre än Java. Han insåg att han inte kunde börja om helt från början utan han behövde någon grund att stå på. Därför bestämde han sig för att även om han ville göra något bättre än Java så skulle han alltid behöva använda sig av JVMen och Javas bibliotek. Han och en mindre grupp forskare började jobba på något som skulle bygga på den i hans ögon vackra modellen av parallellism som kallas ıjoincalculus. Resultatet blev då en objektorienterad version av ıjoincalculus som resulterade i språket F unnel. Detta språk var emellertid ett alldeles för ırent språk. Det var väldigt elegant men väldigt opraktiskt att använda. Eftersom allt som de flesta användare tar för givet inte var tillgängligt var man tvungen att programmera in det. På grund av detta så började de om igen och utvecklade då ett mellanting mellan det 2 Scala Grupp 7 18 februari 2014 rent akademiska språket F unnel och det begränsade språket GenericJava. De ville göra något som var lika praktiskt och användbart som Java men samtidigt skulle det var mer avancerat. De resulterade till slut i Scala som blev just det mellanting mellan objektorienterad- och funktionell programmering som Martin Odersky ville uppnå. Idag används Scala i ganska stor utsträckning. Det används bland annat av en del stora aktörer som exempelvis T witter och LinkedIn. Språket har på senare år fått mer uppmärksamhet och fick i början av 2011 ett stort forskningsanslag på över 2.3 miljoner dollar. Senare samma år investerade ett stort investeringsbolag tre miljoner dollar i Oderskys företag, T ypesaf eInc. De finns de som tror att Scala har en ljus framtid. Till exempel James Strachan, skaparen av Groovy, ska ha sagt att Scala är en möjlig efterföljare till Java[1] . 2 Syntax Syntaxen i Scala följer många av Javas principer, men det finns ofta skillnader. Det finns många syntaktiska ord i Scala som även finns i Java. Dessa likheter beror på att Scala kompileras till Java bytekod och körs på JVM. Syntaxen vi går igenom nedan är uttag från det viktigaste ur Vanligtvis brukar ett Scala-program kräva två tredjedelar av den kod som krävs för ett likadant program i Java. Denna minskning blir tydligare i större program och det beror mycket på nya funktioner som finns i Scala. Likt Java ska klassnamn börja med stor bokstav, metodnamn med liten bokstav och filnamn ska matcha objektnamn. I Scala är semikolon valbart för alla kommandon och “case sensitive” för alla variabler. Funktioner och variabler definieras på annat sätt än i java. Variabler kan definieras med var (var myVar : String = "Foo") så värdet kan ändras eller med val (val myVal : String = "Foo") så att värdet ej kan ändras. Scala kan även räkna ut vilken typ en variabel ska vara beroende på värdet som tilldelas till den. I Scala finns multiple assignment som gör att flera variabler kan bli tilldelade efter ett block eller en metod. 3 Scala Grupp 7 18 februari 2014 (val (myVar1: Int, myVar2: String) = Pair(40, "Foo")) Funktioner definieras med sin returtyp i slutet av uttrycket och ska börja med def . (def functionName ([list of parameters]) : [return type]) Aritmetiska-, relation-, logiska- och tilldelnings-operatorer är i princip likadana som i Java. Loopar och if-satser är likadana i Scala som i Java. I Scala finns det något som heter closures som är små funktioner där returvärdet beror på en eller flera variabler som har tilldelats utanför funktionen. val factor = 3; val multiplier = (i:Int) => i * factor multiplier(2) Variabeln f actor är alltså deklarerad innan multiplier blir kallad och returtypen blir då en int av värdet 6. Arrayer skapas med lite annan syntax var z:Array[String] = new Array[String](3) z blir då en array innehållandes tre strängar. I Scala finns det något som kallas trait. En trait inkapslar metoder och fält som implementeras inuti trait eller i en annan klass som använder extend på trait. Det kan liknas med abstrakta klasser i java. En klass kan använda flera trait:s. En trait kan definieras var som helst så att någon klass sedan kan använda extend på den. I exemplet nedan skapas en trait med namnet Equal och metoderna isEqual och isN otEqual. Metoden isEqual måste implementeras någon annanstans eftersom den endast deklareras i Equal medan isN otEqual blir fullt implementerad i Equal. trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) } När en variabel skapas som protected eller private går det att välja hur många block bakåt variabeln ska vara tillgänglig. 4 Scala Grupp 7 18 februari 2014 package society { package professional { class Executive { private[professional] var workDetails = null private[society] var friends = null private[this] var secrets = null def help(another : Executive) { println(another.workDetails) println(another.secrets) //ERROR } } } } I exemplet nedan visas hur mönstermatchning fungerar. Om x är 1 returneras one, om x är two returneras 2 och det tredje fallet matchar så att om x är en int så returneras scala.int. Det sista fallet är default, vad som ska hända om inget tidigare fall stämmer in. def matchTest(x: Any): Any = x match { case 1 => "one" case "two" => 2 case y: Int => "scala.Int" case _ => "many" } Hantering av Exception i Scala fungerar som i Java med skillnaden att istället för flera catch-satser kan man ha en catch-sats med flera olika cases för olika Exceptions. Det går att använda F inally för att uttrycka vad som ska göras i slutet av ett block oavsett hur det avslutas. import java.io.FileReader import java.io.FileNotFoundException import java.io.IOException object Test { def main(args: Array[String]) { try { val f = new FileReader("input.txt") } catch { case ex: FileNotFoundException =>{ println("Missing file exception") } 5 Scala Grupp 7 18 februari 2014 case ex: IOException => { println("IO Exception") } } } } 3 Om språket Scala är ett objekt-funktionellt och skriptspråk utvecklat för mjukvaruapplikationer, programspråket är designat för att ha en bra prestanda samt producera konsistent och elegant kod. Med detta menas att Scala agerar som ett vanligt objektorienterad språk så som Java där alla värden är objekt och alla operationer är metoder samt att det stöder funktionell programmering. Scala komplerar sin kod till JavaBytekod och körs sedan på Javasvirtuellamaskin(JV M ). Scala använder även ett statisk typ-system där kompilatorn kan hitta fel på typer vid komplilering som ofta ökar pålitligheten hos ett färdigt program. Den funktionella koden som skrivs i Scala kan blandas med den objektorienterade imperativa koden så som önskas för att skapa kompakt och effektiv kod, detta leder dock ofta till att koden blir svår att tyda. Eftersom att Scala har fått inspiration och i många sätt är en påbyggnad på det populära språket Java så kan man helt fritt blanda Java- och Scalaklasser i koden, vilket gör det lätt att övergå till Scala som van Java utvecklare. Språket har i och med sin starka koppling till Java på många plan, skapats för att kunna användas tillsammans med alla existerande Java bibliotek och vice versa. Anledning till att det är möjligt för språken att agera på detta sätt är på grund av att båda programspråken kompileras till så kallad JavaByteCode som är det som Körs på Javas V irtualM achine (JV M ). Tidiga versioner av Scala hade tidigare fullt stöd för att även köras på .N ET strukturen, men stödet har försvunnit i nyare versioner. Till skillnad från Java så gör inte Scala skillnad på primitivadatatyper och referenser till objekt, till exempel Integer eller Boolean. Alla datatyper i Scala ärver från Any − klassen vilket gör det möjligt för utvecklaren att skapa egna datatyper. En stor skillnad är hur Scala iterarar igenom listor, detta görs i Java med tillexempel en f or − each − loop, men i Scala används list − comprehension tagen från funktionell programmering (Se syntax). Scala gör inte heller skillnad på expressions och statemens till skillnad från Java där dessa särskiljs. En till styrka med Scala är förmågan att kunna 6 Scala Grupp 7 18 februari 2014 skapa anonyma funktioner med hjälp av stödet av funktionell programmering, detta görs enkelt utan att specificera varken parametrar eller resultat, detta görs på liknande sätt som i Haskell. Där ett exempel på hur detta kan skrivas i Scala är: $x => x < 2 $\\ detta kan även skrivas med definierad parameter och resultattyp. $(x: Int) => (x < 2): Boolean.$\\ Scala blir på grund av alla kopplingar med Java samt stödet för funktionell programmering ett mycket brett språk som kan användas till många olika applikationstyper, samt i projekt med de flesta storlekar och är redan idag ett språk som används mycket och är på uppgång. Några applikationstyper som Scala används till idag: • Webb • Transaktion / Handel • Finans • Simulation Figur 1: Företag som använder Scala[4] 7 Scala Grupp 7 18 februari 2014 Figur 2: Popularitet av Acala mätt på antal queries på StackOverF low.com samt antal projekt på GitHub 4 4.1 Fördelar och nackdelar med Scala Fördelar Scala är mycket mer tillåtande och tillåter användaren att kombinera olika uttryck på ett mer flexibelt sätt än i Java. För att sortera in personer i två arrayer beroende på deras ålder, behöver följande kod skrivas i Java: import java.util.ArrayList; ... Person[] people; Person[] minors; Person[] adults; { ArrayList<Person> minorsList = new ArrayList<Person>(); ArrayList<Person> adultsList = new ArrayList<Person>(); for (int i = 0; i < people.length; i++) (people[i].age < 18 ? minorsList : adultsList) .add(people[i]); minors = minorsList.toArray(people); adults = adultsList.toArray(people); } Medan i Scala räcker det med att göra följande: 8 Scala Grupp 7 18 februari 2014 val people: Array[Person] val (minors, adults) = people partition (_.age < 18) Att skriva kod i Scala ger en högre produktivitet då kod skriven i Scala blir ungefär 50-75% kortare än kod skriven i Java som utför samma sak. Då Scala har stöd för funktionell programmering blir i många fall koden kortare och har färre buggar. Ofta blir även det färdiga programmet snabbare med hjälp av funktionell programmering. Se figur 3. Figur 3: Jämförelse mellan hur snabbt quick sort exekveras i Scala samt med Java Scala har ett bibliotek som hanterar parallellism väldigt effektivt. 4.2 Nackdelar Eftersom Scala har få användare jämfört med Java finns det färre exempel och mindre hjälp från andra användare att hitta på internet. Eftersom Scala är en blandning av objektorienterad och funktionell programmering krävs det en utvecklare med större kompetens för att bemästra språket. Detta medför en längre upplärningsfas än exempelvis Java. 9 Scala Grupp 7 18 februari 2014 Då Scala även har en mer flexibel syntax är det många som har svårt för att lära sig språket som följd av detta. Scala är inte garanterat bakåtkompatibel vid större nya utgåvor vilket kan leda till att man måste “uppfinna hjulet” gång på gång. Vid programmering i grupp kan det lätt hända att det blir en hybrid av Java och Scala om inte alla i gruppen går över helt till Scala vilket kan skapa problem. 5 Referenser 1. W ikipedia. 2014. Scala (Programming language). http : //en.wikipedia.org/wiki/Scala( programmingl anguage). Hämtad 201402-18. 2 .Aritma developer. May 4, 2009. The origins of Scala. http : //www.artima.com/scalazine/articles/originso fs cala.html. Hämtad 2014-02-18. 3. Scala programming language http : //www.scala − lang.org/ Hämtad 2014-02-18. 4. Scala adoption by enterprises http : //www.slideshare.net/mslinn/scala − adoption − by − enterprises Hämtad 2014-02-18. 5. Scala Basic Syntax http : //www.tutorialspoint.com/scala/scalab asics yntax.htm Hämtad 201402-18. 10