Swift 3.0.1 unter Ubuntu 16.04, zweiter Anlauf

Im Dezember 2015 habe ich Swift unter Linux erstmals ausprobiert, im März 2016 habe ich meine Experimente mit Beta-Versionen von Swift 3 und Ubuntu 16.04 wiederholt. Restlos begeistert war ich nicht. Heute habe ich einen neuen Versuch gestartet, wieder unter Ubuntu 16.04, und diesmal mit einem Swift 3.0.1 GM Candidate.

Nach wie vor steht Swift für Linux auf https://swift.org/download nur in Form von tar-Archiven zur Verfügung. Als Distributionen werden bis einschließlich Swift 3.0 nur die veralteten Ubuntu-Versionen 14.04 und 15.10 unterstützt. Einzig für Swift 3.0.1 gibt es seit ein paar Tagen nun endlich auch ein Archiv für Ubuntu 16.04.

Eine ordentliche Paketquelle, die unkompliziert Updates ermöglichen würde, fehlt weiterhin. Ebensowenig offizielle Unterstützung für andere Distributionen. Wer mit Debian, CentOS, Fedora etc. arbeitet, muss entweder ausprobieren, ob die für Ubuntu kompilierte Version auch auf seiner Distribution läuft, oder muss sich Swift eben aus den Quellen selbst kompilieren. Zusammengefasst: Viel Engagement von Apple, Swift für Linux in einer zeitgemäßen Form anzubieten, ist nicht zu erkennen.

Natürlich kann man argumentieren, dass ja die Distributoren diese Aufgabe übernehmen könnten — aber dazu wird es (wenn überhaupt) nur kommen, wenn Swift unter Linux eine nennenswerte Verbreitung findet. Das ist aktuell aber schwer vorstellbar. Und so gibt es im Internet aktuell ein Sammelsurium von inoffiziellen Swift-Paketen, Swift-Paketquellen und Swift-Installations-Scripts. Keiner weiß, wie lange diese Privatinitiativen gewartet werden.

Installation unter Ubuntu 16.04

Bleiben wir also bei Ubuntu … Dort ist die Installation immerhin mühelos: Sie installieren die Pakete clang und libicu-dev, laden das Swift-Archiv von https://swift.org/download herunter und packen es mit tar aus — für erste Tests am einfachsten im Home-Verzeichnis:

sudo apt install clang libicu-dev
cd
tar xzf Downloads/swift-<version>.tar.gz

Auf https://swift.org/download ist außerdem beschrieben, wie Sie vor der Installation die Signatur des tar-Archivs verifizieren können. Dieser Schritt ist optional. Er stellt sicher, dass das tar-Archiv wirklich von Apple zusammengestellt wurde.

Damit Sie den Swift-Compiler ausführen können, ohne jedesmal den ganzen Pfad anzugeben, erweitern Sie die PATH-Umgebungsvariable mit export. Dabei müssen Sie <login> und <version> durch die bei Ihrer Installation passenden Daten ersetzen.

export PATH="${PATH}":/home/<login>/swift-<version>/usr/bin

echo $PATH
  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
  /sbin:/bin:/usr/games:/usr/local/games:/snap/bin:
  /home/kofler/swift-3.0.1-GM-CANDIDATE-ubuntu16.04/usr/bin

swift -version
  Swift version 3.0.1 (swift-3.0.1-GM-CANDIDATE)
  Target: x86_64-unknown-linux-gnu

swiftc -version
  Swift version 3.0.1 (swift-3.0.1-GM-CANDIDATE)
  Target: x86_64-unknown-linux-gnu

Hello World!

Um den Compiler zu testen, speichern Sie den folgenden Hello-World-Einzeiler in der Datei hello-world.swift:

print("Hello World!")

Dieses Programm kompilieren Sie nun mit swiftc und führen es aus:

swiftc hello-world.swift -o hello-world
./hello-world
  Hello World!

Das Binary ist klein, aber es verweist auf eine Menge Bibliotheken. (Die ldd-Ausgabe ist neu formatiert und gekürzt.)

ls -l hello-world
  ... 14096 Okt 31 06:56 hello-world
ldd hello-world
  linux-vdso.so.1 =>  (0x00007ffffb8e1000)
  libswiftCore.so => /home/kofler/swift-<version>/usr/lib/swift/
                      linux/libswiftCore.so
  libswiftSwiftOnoneSupport.so => /home/kofler/swift-<version>/usr/
                       lib/swift/linux/libswiftSwiftOnoneSupport.so
  libstdc++.so.6   => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
  libm.so.6        => /lib/x86_64-linux-gnu/libm.so.6
  libgcc_s.so.1    => /lib/x86_64-linux-gnu/libgcc_s.so.1
  libc.so.6        => /lib/x86_64-linux-gnu/libc.so.6
  libpthread.so.0  => /lib/x86_64-linux-gnu/libpthread.so.0
  libdl.so.2       => /lib/x86_64-linux-gnu/libdl.so.2
  libicuuc.so.55   => /usr/lib/x86_64-linux-gnu/libicuuc.so.55
  libicui18n.so.55 => /usr/lib/x86_64-linux-gnu/libicui18n.so.55
                      /lib64/ld-linux-x86-64.so.2
  libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55

Hello Foundation!

Unter Linux steht Ihnen auch die Foundation-Bibliothek zur Verfügung.

// Datei hello-date.swift
import Foundation
let now = Date()
print(now)
swiftc hello-date.swift -o hello-date
./hello-date
  2016-10-31 07:13:49 +0000
ldd hello-date | grep -i found
    libFoundation.so => /home/kofler/swift-<version>/
                             usr/lib/swift/linux/libFoundation.so 

Hello GDC!

Mittlerweile wurde auch die Dispatch-Library (Grand Central Dispatch) für Linux portiert. Wenn Sie asynchronen Code entwickeln möchten, fügen Sie Ihre Swift-Datei einfach mit import Dispatch.

// Datei hello-dispatch.swift
import Foundation
import Dispatch

let myqueue = DispatchQueue(label: "myqueue")
print("Starte Hintergrundberechnung")
myqueue.async {
 for i in 1...1_000_000 {
   _ = sin(Double(i))
 }
 print("Hintergrundberechnung fertig")
}
sleep(10)
print("Programmende")
swiftc hello-dispatch.swift -o hello-dispatch
./hello-dispatch
  Starte Hintergrundberechnung
  Hintergrundberechnung fertig
  Programmende

Die Portierung der Dispatch-Bibliothek ist ein Teil der Core Libraries Initiative, die wichtige Apple-Basisbibliotheken auch auf anderen Plattformen verfügbar machen soll.

Server-side Swift

Nun ist Swift für Linux natürlich nicht dazu gedacht, um Hello-World-Apps zu programmieren. Das langfristige Ziel ist vielmehr, damit Server-Anwendungen zu programmieren — und zwar so, dass von Xcode aus eine Client-App und die dazugehörende Server-Infrastruktur zentral entwickelt werden kann (inklusive Fehlersuche).

Ansatzweise funktioniert das auch schon. Im vergangenen Jahr wurden diverse Swift-Bibliotheken (Frameworks) entwickelt, die dabei helfen, z.B. Kitura, Vapor und Perfect.

Besonders engagiert ist IBM. IBM hat nicht nur das Framework Kitura entwickelt, sondern bietet auch auf Swift abgestimmte Cloud-Lösungen an. Die macOS-App IBM Cloud Tools for Swift hilft beim Einrichten neuer Server-Projekte. Wie das funktioniert, zeigen zwei Videos, zu denen Sie am Ende dieses Beitrags Links finden.

All diesen Projekten und Initiativen zum Trotz steckt Swift auf dem Server noch in den Kinderschuhen. Momentan geht es eher darum, die Claims abzustecken, als robuste Lösungen anzubieten. Die Geschwindigkeit und Ernsthaftigkeit, mit der IBM, Apple sowie diverser anderer Firmen in diesem Umfeld agieren, lässt aber vermuten, dass Swift auf dem Server schon in naher Zukunft praxistauglich werden könnte. Da verwundert es nicht, dass Apple vorige Woche das Server APIs Project gegründet hat, um die Server-seitigen Aktivitäten besser zu koordinieren. Die dazugehörende Mailing-Liste hilft bei der Kommunikation zwischen diversen Server-Projekten.

Fazit

Die Perspektive von Server-side Swift ist mittlerweile in Konturen erkennbar. Das ändert aber nichts daran, dass der aktuelle Status Quo einen experimentellen und unausgegorenen Eindruck hinterlässt.

Quellen / Links / Weiterführende Informationen

Installation

Swift on Server