[Update 2.3.2016: Aktualisiert mit Ubuntu 16.04 Beta und einem aktuellen Swift-3.0-Snapshot.]
Swift steht für Ubuntu als tar
-Archiv unter https://swift.org/download/ zum Download zur Verfügung. Die Installation ist einfach:
sudo apt-get install clang libicu-dev
wget https://swift.org/builds/development/ubuntu1510/swift-DEVELOPMENT-SNAPSHOT-2016-03-01-a/swift-DEVELOPMENT-SNAPSHOT-2016-03-01-a-ubuntu15.10.tar.gz
tar xzf swift-DEV*.tar.gz
export PATH=$(pwd)/swift-DEVELOPMENT-SNAPSHOT-2016-03-01-a/usr/bin/:"${PATH}"
swift -version
Swift version 3.0-dev (LLVM b361b0fc05, Clang 11493b0f62, Swift 24a0c3de75)
Target: x86_64-unknown-linux-gnu
Der exakte Name des Download-Links und der Verzeichnisse ändert sich natürlich mit jedem neuen Swift-Snapshot!
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
ls -l hello-world
-rwxrwxr-x 1 kofler kofler 10112 Dez 12 16:11 hello-world
./hello-world
Hello World!
Core Libraries nutzen
Grundsätzlich stehen die von OS X oder iOS bekannten Bibliotheken unter Linux nicht zur Verfügung. Apple arbeitet aber an einer Sammlung von Basisklassen, die in den Core Libraries) gebündelt werden. Diese Bibliotheken sollen Klassen aus der Foundation
, sowie aus libdispatch
und XCTest
enthalten. Diese Bibliothek wird selbst in Swift entwickelt und steht bereits in einer ersten, sehr frühen und unvollständigen Version bereits als Open-Source-Code zur Verfügung. Wie weit die Arbeiten vorangeschritten sind, geht aus dieser Status-Seite hervor.
Wenn Sie Swift wie oben beschrieben installiert haben, stehen Ihnen die Core Libraries bereits zur Verfügung. Einen ersten Test können Sie mit diesem Mini-Programm durchführen. Es erzeugt ein NSDate
-Objekt mit dem aktuellen Datum, extrahiert daraus Jahr, Monat und Tag und zeigt diese Daten an.
// Datei hello-core.swift
import Foundation
let now = NSDate()
let cal = NSCalendar.currentCalendar()
let comps = cal.components(
[.Day, .Month, .Year], fromDate: now)
print("Jahr: \(comps!.year) Monat: \(comps!.month) Tag: \(comps!.day)")
Hinweis: Die Klassennamen der Core Libraries sollen in naher Zukunft den Prefix NS
verlieren. Das obige Beispiel muss dann entsprechend angepasst werden.
So kompilieren Sie das Programm und führen es aus:
swiftc hello-core.swift -o hello-core && ./hello-core
Jahr: 2015 Monat: 12 Tag: 12
Das Kompilat ist klein, greift aber auf diverse Bibliotheken zurück:
ls -l hello-core
-rwxrwxr-x 1 kofler kofler 15896 Mär 2 13:18 hello-core
ldd hello-core
linux-vdso.so.1 => (0x00007ffd20bb4000)
libswiftCore.so => [swift-path]/usr/lib/swift/linux/libswiftCore.so (0x00...)
libFoundation.so => [swift-path]/usr/lib/swift/linux/libFoundation.so (0x00...)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00...)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00...)
libswiftGlibc.so => [swift-path]/usr/lib/swift/linux/libswiftGlibc.so (0x00...)
libswiftSwiftOnoneSupport.so => [swift-path]/usr/lib/swift/linux/libswiftSwiftOnoneSupport.so (0x00...)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00...)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00...)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00...)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00...)
libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00...)
libicui18n.so.55 => /usr/lib/x86_64-linux-gnu/libicui18n.so.55 (0x00...)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00...)
/lib64/ld-linux-x86-64.so.2 (0x00...)
libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00...)
libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00...)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00...)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00...)
REPL-Modus
Swift kann auch interativ ausgeführt werden, um Kommandos auszuprobieren (REPL = Read Eval Print Loop, siehe auch meinen schon älteren Blogbeitrag Swift-Scripts, Compiler und REPL). Dazu führen Sie einfach das Kommando swift
in einem Terminal aus. Besonders praktisch: Mit der Tabultator-Taste können Sie Klassen- und Methodennamen vervollständigen, wobei die zur Auswahl stehenden Schlüsselwörter angezeigt werden.
Swift ohne Installation ausprobieren
Wer keine Lust hat, Swift herunterzuladen und zu installieren, kann Swift auch im Webbrowser ausprobieren. IBM stellt eine Sandbox zur Verfügung, in der Sie Swift-Code samt Vervollständigung von Schlüsselwörtern und Syntax-Highlighting eingeben und ausprobieren können:
http://swiftlang.ng.bluemix.net/#/repl
Ich muss nicht extra erwähnen, dass diese Sandbox unter Linux löuft, oder?
Leseempfehlungen
Sobald Sie Bibliotheken von Linux verwenden möchten, wird die Programmierung deutlich komplizierter: Sie müssen sich mit dem Package Manager anfreunden und ein Package definieren, das gewissermaßen die Schnittstelle zur externen Bibliothek herstellt. (Für die glibc ist ein derartiges Package bereits vorinstalliert.) Die Vorgehensweise ist beispielsweise auf den folgenden Seiten beschrieben:
- https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md (Grundlagen, Beispiel für JPEG-Bibliothek)
- http://ericasadun.com/2015/12/16/a-little-gift-for-my-linux-friends-reading-and-writing-strings-from-and-to-files/ (glibc-Beispiel)
- http://appventure.me/2015/12/08/swift-ubuntu-x11-window-app/ (X11-Beispiel)
Schöner Artikel!
Wie siehst du generell Swift und Linux und dessen Chance zur Akzeptanz ausserhalb des Apple-Ökosystems?
Traust du Apple zu, dass es dieses Projekt über Jahre hinweg so pushed oder das so bald der Medienrummel nachlässt auch dieses Projekt stiefmütterlich behandelt wird?
Grüße, Tobias
Das ist schwer zu beantworten. Ich habe ja in meinem Blog schon argumentiert, dass Apple vielleicht ein Interesse daran haben könnte, dass Swift unter Linux erfolgreich wird. Wenn das wirklich so ist (ich kann ja auch nur spekulieren), dann könnte ich mir schon vorstellen, dass Apple längerfristig viel Energie in Swift als Open-Source-Sprache auch und ganz speziell unter Linux investiert.
https://kofler.info/braucht-linux-swift-oder-braucht-apple-linux/
Sollten meine Spekulationen aber nicht zutreffen, dann bezweifle ich, dass sich Apple wahnsinnig viel Mühe bei der langfristigen Pflege von Swift unter Linux geben wird.
Warten wir es ab. In der aktuellen Form ist Swift unter Linux zwar interessant, aber nicht praktisch verwendbar. In einem Jahr sind wir alle schlauer …
Hallo, haben Sie den Quelltext so wie oben geschrieben kompiliert bekommen? Ich habe nach langer Suche gefunden, dass ich den Fehler „error: use of unresolved identifier ’now'“ nur weg bekomme, in dem ich darüber die Zeile ‚let now = NSDate()‘ einfüge.
Als Lernsprache ist Swift gut. Sehr schön ist der interaktive Modus, der die verfügbaren Komplettierungen anzeigt. So habe ich finden können, dass z.B. keine Methode ’now‘ in der Kalender-Klasse existiert (sagt man das so ? :-). Ich bleibe jedenfalls dran, auch wenn ich keinen Mac kaufe und keine Apps programmiere.
Sorry, da hab‘ ich beim Kopieren eine Zeile vergessen. Das Listing ist jetzt korrigiert. Auf den REPL-Modus weise ich jetzt auch hin.
Hallo,
Ich habe das Snapshot „swift-2.2-SNAPSHOT-2016-03-01-a-ubuntu14.04.tar.gz“
entpackt die PATH Variable angepasst.
Hello World wir übersetzt und tut was es soll.
Wenn ich Hello-core übsersetzen will erhalte ich aber folgenden Fehler:
“ error: no such module ‚Foundation‘
import Foundation
“
Muss man das Foundation Modul noch zusätzlich downloaden?
Mit besten Grüßen
Marcel Geppert
Habe gerade nochmals einen aktuellen Swift-Snapshot unter Ubuntu 16.04 ausprobiert. Funktioniert bei mir problemlos wie im Beitrag beschrieben.