scalatutorial.de

Stufe 1Einstieg · Lektion 3 von 34

Hello world!

Aktualisiert am 24. September 20263 Min. LesezeitSchritt 3/5 dieser Stufe

Jede Sprache beginnt mit „Hello world“. In Scala 3 besteht es aus einer einzigen Zeile. An ihr lässt sich gut zeigen, wie ein Programm aufgebaut ist, wie Sie es starten und was der Compiler daraus macht.

Die kürzeste Fassung

Legen Sie eine Datei hallo.scala an und schreiben Sie hinein:

hallo.scalaScala 3
@main def hallo(): Unit = println("Hallo, Welt!")

Starten Sie das Programm im selben Ordner:

 Terminal
$ scala run hallo.scala
Hallo, Welt!

Beim ersten Aufruf dauert es einige Sekunden, weil der Compiler startet und das Ergebnis zwischenspeichert. Weitere Aufrufe ohne Änderung sind deutlich schneller.

Zeile für Zeile

Mehrere Zeilen und Einrückung

Sobald der Rumpf mehr als eine Zeile hat, rücken Sie ihn ein. Scala 3 erkennt Blöcke an der Einrückung, ähnlich wie Python:

hallo.scalaScala 3
@main def hallo(): Unit =
  val name = "Welt"
  val gruss = s"Hallo, $name!"
  println(gruss)
  println(s"Der Gruß hat ${gruss.length} Zeichen.")

Das s vor den Anführungszeichen schaltet die String-Interpolation ein: $name setzt den Wert der Variable ein, ${…} einen beliebigen Ausdruck. Mehr dazu in der Lektion über Strings. Geschweifte Klammern sind weiterhin erlaubt; beide Schreibweisen lassen sich sogar mischen. Welche Form üblich ist, beschreibt die Lektion über Konventionen.

Argumente von der Kommandozeile

Parameter der @main-Methode werden automatisch aus den Kommandozeilenargumenten gelesen – samt Umwandlung in den passenden Typ:

gruss.scalaScala 3
@main def gruss(name: String, anzahl: Int): Unit =
  for i <- 1 to anzahl do
    println(s"$i. Hallo, $name!")
 Terminal
$ scala run gruss.scala -- Ada 3
1. Hallo, Ada!
2. Hallo, Ada!
3. Hallo, Ada!

Die zwei Striche -- trennen die Optionen des scala-Befehls von den Argumenten Ihres Programms. Übergeben Sie für anzahl keinen Zahlwert, bricht das Programm mit einer verständlichen Fehlermeldung ab – die Umwandlung prüft Scala für Sie.

So sah es in Scala 2 aus

In älteren Anleitungen begegnet Ihnen diese Form:

Scala 2Scala 3
object Hallo {
  def main(args: Array[String]): Unit = {
    println("Hallo, Welt!")
  }
}

Sie funktioniert auch in Scala 3 noch. Ein object ist ein Singleton – eine Klasse mit genau einer Instanz –, und die Methode main mit einem Array[String] ist der klassische Einstiegspunkt der JVM. Die Variante object Hallo extends App { … } war in Scala 2 ebenfalls verbreitet. Sie läuft in Scala 3 zwar noch, wird aber nicht mehr empfohlen, weil der Mechanismus dahinter (DelayedInit) aus der Sprache entfernt wurde.

Was der Compiler erzeugt

Hinter den Kulissen übersetzt der Compiler die Datei in JVM-Bytecode (.class-Dateien) und zusätzlich in .tasty-Dateien. TASTy ist ein Zwischenformat von Scala 3, das die vollständigen Typinformationen enthält und zum Beispiel Bibliotheken zwischen Compiler-Versionen austauschbar macht. Für @main def hallo legt der Compiler automatisch eine Klasse hallo mit einer passenden main-Methode an.

Vom Scala-Quelltext über den Compiler zu JVM, Browser oder nativer DateiHallo.scalaQuelltextscalacCompiler.class + .tastyBytecode.js / nativScala.js / NativeJVMJava 17/21 …Browseroder Binärdatei
Vom Quelltext zum laufenden Programm.

Kommentare

Zum Abschluss noch etwas, das Sie ab jetzt in jedem Beispiel sehen:

 Scala 3
// einzeiliger Kommentar

/* mehrzeiliger
   Kommentar */

/** Scaladoc-Kommentar: beschreibt die folgende Definition
  * und erscheint in der erzeugten Dokumentation. */
def flaeche(breite: Double, hoehe: Double): Double = breite * hoehe

Passt dazu