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