Day 1 – Next 5 year
Download
Report
Transcript Day 1 – Next 5 year
Scala
or
”The Free Lunch is Over”
Andreas Enbohm
Capgemini Sverige AB
Why Scala
The free lunch is over...
Today – 2 Cores
2010 maybe 12 (AMD), in 5 years maybe 16
Difficult to utilize several CPUs with Java
Huge API in current Java – some argue it may collape due to its own weight
Scala = ScalableLanguage
Designed to fit todays and some of tomorrows programming paradigms
Actors – Easier to utilize than memory synchronization (more about this later)
Nice (less boiler plate code) syntax and ’type safe duck typing’
And much more...
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Scala - Features
OO and functional language
”a general purpose programming language designed to express common programming patterns in a concise,
elegant, and type-safe way”
Functional language – (often) no side effect, avoids state and mutable data, i.e functions can run independently and
without knowlegde of eachother
def sum(a:Int,b:Int) = a+b
Open Source
Compact code, ca 50 % less code than Java
Static typed language (but with ’kind of’ duck typing, more about this later)
Pattern matching, singel inheritance, immutable collections (like Java Strings), XML as FCC
SUnit, Lift (web framework), Support for Maven, Ant, Plugins for Eclipse, Netbeans, IntelliJ
Why not Ruby, Groovy, F#?
- Fully interoperable with Java (call Java classes whenever you want)
- Refactoring (static typed)
- runs on world’s best VM!
- very simple to inherit from Java classes
- Javas annotations, threads, for each, it all works
- Very fast (600x faster than groovy, lift 6x faster than Rails?)
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Scala – Compared to Java
Defining a class
public class Person
{
private String firstName;
private String lastName;
class Person(var firstName: String, var lastName: String) {
}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
}
Everything in Scala is an Object! This also includes functions
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Scala – Compared to Java
Defining variables - ; and type can often be omitted
val myInt: Int = 1;
val anotherInt = 2
Creating objects
val anObject = Object //Omit () if you want just ’cluttering’ your code
val aList = List(”John Doe”, ”Jane Doe”, ”Baby Doe”)
List is of type List[String] by default
List<String> aList = new ArrayList<String>(); //Java syntax for creating a list-object
val aList = List //Scala syntax for creating corresponding list
val aList = List[String]
//Also works, notice just ONE generic definiton
List objects in Scala contains several useful functions to access elements in the List
println("Hi, " +aList.tail.head) //Prints “Hi, Jane Doe”
Ommiting some dots…
import java.util.{Date,Locale}
import java.text.DateFormat
import java.text.DateFormat._
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println( df format now) //same as df.format(now)
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Scala – Compared to Java
Exceptions
- Scala has no checked exception (unlike Java but like C#)
- If used with Java, use annotation @throws(classOf[IOException])
try { doSomething(params) }
catch {
case ex: IOException => println("Oops! Some file is probably missing")
case ex: NullPointerException => println(“Dohh!! Must initialize the variable ")
}
Using pattern matching and functions
object MatchTest1 extends Application {
def matchTest(x: Int): String =
x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
println(matchTest(1)) //Prints “one”
println(matchTest(99)) //Prints “many”
}
Scala uses ’traits’ which can be compared to interfaces. Can have implementations (but no state)
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Duck Typing in Scala
”If it walks like a duck and quacks like a duck, then I would call it a duck.” – Wise Guy
class Duck {
public void quack() {
print(”Duck Quacking!”)
}
class Person {
public void quack() {
print(”Person Quacking!”)
}
}
Duck d = new Duck();
Person p = new Person();
testQuack(d);
testQucak(p);
testQuack(duckableObject) {
duckableObject.quack();
//Lets hope this work!!!
}
Statically typed language don’t offer this flexibility (Java, C#)
- i.e. no ’Duck Typing’
Downside – what happens if object does not have a ’quack’-method -> RuntimeException!
In Java, we must add an interface with method ’quack()’ – impossible to add an interface without changing the class!
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Duck Typing in Scala
However Scala offers ’Structual Typing’ – a.k.a. Type safe duck typing
Consider following example (Scala syntax)
class File(name: String) {
def getName(): String = name
def open() { /*..*/ }
def close() { println("close file") }
}
def testPrintName(aFileObject: { def getName(): String }) {
println(aFileObject.getName)
}
testPrintName(new File("test.txt"))
testPrintName(new java.io.File("test.txt"))
Scala offers structual typing, i.e. def getName() in test
The structual type ’getName()’ checks at compile time that ’aFileObject’ has a getName() method if not – compile
error
If getName() is needed more than one, use traits.
trait HasName {
def getName() : String
}
def testPrintName(HasName f) = { println(f.getName) }
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Actors
”Don't bring the grape juice into the living room“ – Brian Goetz
Java threads
- shared memory, i.e. only one thread can operate on a shared resource concurrently
- expensive to create, i.e. every thread has a high memory consumption
- context switch. i.e a Java thread maps to a OS thread (limited numbers ~3K)
- context switch make page faults - > slow due to thread needs to re-read data from RAM
- difficult to use, i.e. deadlocks, raise conditions, live locks, NASA Mars explorer experied live lock
- synchronize, i.e. not just a a monitor/lock but also write to main memory (no registers) ~100 slower!
- Java was designed for single processors, not multi-cores!
Actor based concurrency
- concurrenct processes communicates by exchanging messages
- asynchronous message passing
- ’share-nothing’-model
- Erlang early to implement this style of concurrency
- Erlang based web server ~80000 clients, Apache ~4000 clients
Two flavours in Scala;
- Thread based actors – high level abstraction of threads which replaces error-prone shared memory access
- Thread less actors – offers enourmous scalability. Lightweight processes are used as actors with much less overhead than a usual thread.
’Piggy-backs’ on calling threads stack trace (continuation closure)
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Downsides
”With great power comes great complexity” – James Gosling
New languages difficult to introduce to organisations
Not ready for prime time?
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm
Questions?
http://www.scala-lang.org/
© 2004 Capgemini - All rights reserved
2008, July – Andreas Enbohm