• Home
  • Portfolio
  • Produkte
    • HandyBirthdays
    • BashSupport für IntelliJ®
  • Scala Newsletter
    • [Ausgabe 1] Boxing / Unboxing in Scala
    • [Ausgabe 2] Scala 101: Einführung
  • Referenzen
  • Kontakt
Joachim Ansorg IT-Services
This page in English

Scala 101: Einführung

von Joachim Ansorg (2009-04-16)

Zusammenfassung

Die Programmiersprache wird vorgestellt. Anhand von Beispielen wird ein Überblick über die wichtigsten Sprachelemente gegeben.

Die Programmiersprache "Scala"

Herzlich Willkommen zur zweiten Ausgabe des Scala Newsletters. Dies ist der erste Teil des Scala 101, einer Einführung in die Programmiersprache Scala.

Scala ist eine skalierbare Programmiersprache, die sich gut in die Java-Welt integriert. In den folgenden Abschnitten werden die wichtigsten Konzepte kurz angerissen. Detailierte Erklärungen werden in den nächsten Ausgaben der Reihe Scala 101 erscheinen.

Woher kommt Scala?

Scala wird an der Universität Lausanne entwickelt. Martin Odersky, ein Deutscher, ist hauptverantwortlich für die Weiterentwicklung der Sprache.

Beispielcode

Um Scala vorzustellen werden kleine Beispiele gezeigt. Ein kurzes, aber vollständiges Programm ist das typische "Hallo Welt":

Beispiel 1. "Hallo Welt" in Scala
package scala101_001

object HelloWorld {
  def main(args: Array[String]) : Unit = println("Hello World!")
}

Scala - kurz und knapp

Scala zeichnet sich durch einige Besonderheiten aus:

  • Integriert. Scalacode kann auf der Java VM ausgeführt werden. Mit Scala können bisheriger Java-Quellcode weiterverwendet werden. Statt das Rad neu zu erfinden setzt Scala auf etablierte Technologien auf.

  • Objektorientiert. Scala ist eine objektorientierte Programmiersprache. Die Möglichkeiten gehen jedoch über die von beispielsweise Java hinaus.

  • Funktional und Imperativ. Scala vereint Aspekte der funktionalen und imperativen Programmierung unter einem Dach. Der Programmierer kann je nach Aufgabe verschiedene Schwerpunkte in der Verwendung der Sprachmerkmale setzen.

  • Kompakt. Typischer Scala-Quellcode ist kürzer als der entsprechende Java-Quellcode. Dies erspart dem Programmierer Schreib- und Leseaufwand. Zum besseren Verständnis kann jedoch auch ausführlicherer Quellcode geschrieben werden; etwa in komplexen Programmteilen.

  • Erweiterbar. Scalas Syntax ist so entworfen worden, dass leicht Erweiterungen erstellt werden können, die sich in die Sprache integrieren. Mit der Sprache können Konstrukte erstellt werden, die den Schlüsselwörtern der Sprache ähneln. Scala eignet sich gut zur Erstellung von domänenspezifischen Sprachen (DSLs).

Was zeichnet Scala weiterhin aus?

Syntax

Scalas Syntax ist zum einen prägnant und zum anderen mächtig. Im Vergleich mit Java muss weniger Quellcode geschrieben werden, um die gleiche Idee zu verwirklichen.

Beispiel 2. Ausgabe der Primzahlen zwischen 1 und 100
object SyntaxDemo {
  def isPrime(n: Int) = (1 to n).toList.count(n % _ == 0) == 2

  def main(args: Array[String]): Unit =
        (1 to 100).filter(isPrime).foreach(println)
}
[Anmerkung]Anmerkung
Es gibt natürlich wesentlich bessere Mehoden zum Finden von Primzahlen als diese naive Implementierung. Das Beispiel soll zeigen, dass es möglich ist verständlichen und im Vergleich mit Java kürzeren Quellcode zu schreiben.

Scala ist eine typsichere Sprache. Das bedeutet, dass für Variable, Parameter, usw. Typen festgelegt werden müssen. Oft ist eine solche Angabe jedoch redundant und könnte weggelassen werden. In Scala brauchen Sie nur noch die nötigsten Typangaben, Scala vervollständigt die ausgelassenen Angaben automatisch selbst. Diese Eigenschaft wird als Typfolgerung (engl. type inference bezeichnet).

Beispiel 3. Scalas Typfolgerung
val v = "Hey, Scala knows that I'm a String"
println(v) 

Auf Wunsch können die optionalen Typangaben ausgeschrieben werden. Dies verbessert in komplizierten Programmteilen die Lesbarkeit. Außerdem hilft es dem Compiler die Typen komplexer Ausdrücke zu bestimmen.

Beispiel 4. Angabe des optionalen Typs
val v : String = "Hey, Scala knows that I'm a String"
println(v) 

Klassen, Module und Traits

In Java gibt es Klassen und Schnittstellen. In Scala gibt es Klassen, Module und Traits.

  • Klassen. Klassen in Scala sind Javas Klassen sehr ähnlich. Jedoch gibt es hier z.B. keine statischen Methoden oder Variablen.

  • Module. Scalas Module ähneln dem Entwurfsmuster "Singleton". Scalas Modulkonzept wird auch als Singleton object bezeichnet. Module werden in Scala durch das Schlüsselwort object gekennzeichnet. Zur Laufzeit gibt es immer nur eine Instanz eines Modules.

  • Traits. In Java gibt es kein Konzept, das Traits ähnelt. Traits erlauben es, Funktionalität wie Bausteine zu einem größeren Konstrukt zusammenzusetzen (d.h. zu einer Klasse oder zu einem Modul).

case class

Die sogenannte "case class" ist eine Vereinfachung bestimmter Anwendungsfälle von Klassen. Oft werden Klassen benötigt, die bestimmte Eigenschaften für den lesenden Zugriff zur Verfügung stellen und bestimmte Operationen für diese Daten anbieten.

Beispiel 5. Java Klasse
public class JavaPerson{
    private final String firstname;
    private final String lastname;

    public JavaPerson(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }

    public String getFirstname() {
        return firstname;
    }

    public String getLastname() {
        return lastname;
    }
} 

Die obige Java-Klasse kann in einem Scala-Programm durch eine einfache case class ersetzt werden. Die folgende Klasse hat die gleiche Funktionalität wie die obige Java-Klasse:

Beispiel 6. Gleichwertige Scala case class
case class ScalaPerson(firstname:String, lastname:String)
                        

Funktionen und Closures

In funktionalen Programmiersprachen spielen Funktionen eine zentrale Rolle. In imperativen Sprachen wie Java nehmen Daten diese Rolle ein. Scala verbindet beide Welten miteinander.

Scala erlaubt es, Funktionen zu referenzieren. Sie können beispielsweise als Parameter an andere Funktionen übergeben werden. Anonyme Funktionen sind ebenfalls möglich. Das folgende Beispiel demonstriert die Verwendung von Funktionen in Scala:

Beispiel 7. Funktionen in Scala
object FoodDemo {
  val food = "Bananas" :: "Bred" :: "Orange juice" :: Nil

  def main(args:Array[String]) = {
    food.foreach(thing => println("Please buy " + thing))
  }
}
                        

Das Konstrukt thing => println("Please buy " + thing) ist eine (anonyme) Funktion, die für jedes Element der Liste food aufgerufen wird. Die Ausgabe des Programms ist:

Please buy Bananas
Please buy Bred
Please buy Orange juice
                    

Actors

Scalas Standardbibliothek verfügt über ein elegantes Konzept zur parallelen Programmierung. Zwischen verschiedenen Akteueren werden Nachrichten hin- und hergeschickt. Die Nachrichten an einen Teilnehmer werden gesammelt und von diesem der Reihe nach abgarbeitet. Die Nachrichtenverarbeitung von zwei verschiedenen Akteueren kann parallel erfolgen.

Interessant ist, dass hier normalerweise keine Locks benötigt werden. Dies reduziert die Fehleranfälligkeit. Außerdem ist es so sehr einfach ein ereignisgesteuertes Programm zu erstellen.

Beispiel 8. Ein einfacher Scala actor
case class Add(n:Int)
case class Substract(n:Int)
case class Print()
case class Shutdown()

class CalculatingActor extends Actor {
  import Actor._

  var result : Int = 0

  def act() = loop{
    react{
      case Add(n:Int) => result = result + n
      case Substract(n:Int) =>  result = result - n
      case Print() => println(result)
      case Shutdown() => exit()
    }
  }
} 

Dieser simple actor zeigt, wie Scalas Akteurskonzept die Entwicklung von asynchronen, nachrichtenbasierten Systeme vereinfachen kann. Im Beispiel werden Rechenaufträge erteilt, die asynchron ausgeführt werden.

Weiterführende Informationen

Webseiten

Die folgenden Webseiten enthalten wichtige Informationen zum Thema Scala bzw. zu verwandten Themen.

  • Scalas Internetseiten. Die Internetseiten von Scala enthalten vielfältige Informationen zu allerlei Aspekten der Sprache. Im Bereich Dokumentation sind die meisten der Dokumente verklinkt.
    www.scala-lang.org

  • IBMs The busy Java developer's guide to Scala.  In IBM developerWorks ist die Artikelserie "The busy Java developer's guide to Scala" enthalten. Hier werden in verschiedene Themen der Skalaprogrammierung erläutert.
    IBMs The busy Java developer's guide to Scala

  • Lift. Lift ist ein sehr elegantes Framework zur Entwicklung von modernen Internetanwendungen.
    Lift - The Scala web framework.

Literatur

Dies ist eine Auflistung der Bücher, die zu Scala verfügbar sind. Einige der Bücher sind noch in der Entstehung. Sie werden jedoch bald verfügbar sein.

  • Programming in Scala. Martin Odersky, der Vater von Scala, hat an diesem Buch mitgearbeitet. Das Buch ist entsprechend tiefgehend und detailiert. Trotz der Dicke von über 700 Seiten ist das Buch aber lesenswert. Es ist allerdings weder für absolute Neulinge noch für das schnelle Lernen der Sprache zu empfehlen. Zum genauen Nachlesen und als Nachschlagwerk ist es jedoch hervorragend geeignet.
    Das Buch ist sowohl aus Druckausgabe als auch als eBook erhältlich. Webseite des Buches

  • Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine. Das Buch soll Anfang Mai erscheinen und behandelt augenscheinlich insbesondere die Programmierung von MultiCore-Anwendungen. Ob es hält, was es verspricht muss sich dann zeigen.
    Webseite des Buches.

  • Beginning Scala. Beginning Scala ist ein weiteres Buch über Scala, das noch im Enstehen ist. Autor ist David Pollak, u.a. bekannt durch sein Scala-basiertes Webframework Lift. Meines Erachtens ist hier ein sehr gutes und verständliches Buch zu erwarten.
    Webseite des Buches

Kostenlos abonnieren

Tragen sie sich ein - sie erhalten dann alle Ausgaben des Scala Newsletters per E-Mail. Kostenlos!

Zusammenfassung

Die Programmiersprache wird vorgestellt. Anhand von Beispielen wird ein Überblick über die wichtigsten Sprachelemente gegeben.

Inhaltsverzeichnis

Die Programmiersprache "Scala"
Woher kommt Scala?
Beispielcode
Scala - kurz und knapp
Was zeichnet Scala weiterhin aus?
Syntax
Klassen, Module und Traits
case class
Funktionen und Closures
Actors
Weiterführende Informationen
Webseiten
Literatur

Beispiele

1. "Hallo Welt" in Scala
2. Ausgabe der Primzahlen zwischen 1 und 100
3. Scalas Typfolgerung
4. Angabe des optionalen Typs
5. Java Klasse
6. Gleichwertige Scala case class
7. Funktionen in Scala
8. Ein einfacher Scala actor
  • Copyright © 2009, 2010 Joachim Ansorg IT-Services. All rights reserved.
  • Impressum