A Dicembre 2015 Apple ha reso open source il suo nuovo linguaggio di programmazione, Swift, introducendo la novità sul sito ufficiale:
Swift è un linguaggio di programmazione solido e intuitivo, creato da Apple per facilitare lo sviluppo di app per iOS, Mac, Apple TV e Apple Watch, e progettato per offrire agli sviluppatori una libertà mai vista prima. È semplice da usare ed è anche open source: basta avere un’idea per trasformarla subito in qualcosa di straordinario.
Dal momento in cui è diventato open source e cross-platform, molti team si sono dedicati a rendere Swift non solo un linguaggio per sviluppare in maniera nativa su mobile (iOS e presto anche Android), ma anche il prossimo linguaggio Full Stack per il web.
Infatti sono nati diversi framework che permettono di sviluppare un intero backend utilizzando Swift, quali Perfect, Vapor o Kitura.
Se comparato a linguaggi più popolari lato web come Python, Ruby o Javascript, Swift è molto più veloce e permette di incorrere in meno errori. E’ un linguaggio fortemente tipizzato, che utilizza gli optional ed un compilatore che permette di creare applicazioni che presentano meno crash.
Swift inoltre è un linguaggio molto espressivo, che lo rende più produttivo durante lo sviluppo dando la possibilità di creare applicazioni molto rapidamente come si usa fare con Javascript.
Swift ha un ulteriore grande vantaggio che spesso viene sottovalutato: utilizzandolo sia su server che su mobile è possibile sfruttare gli stessi modelli per la parte di networking, senza necessariamente doverli riscrivere da linguaggio a linguaggio.
I contributi open source della community hanno permesso che Swift divenisse in poco tempo uno dei linguaggi più amati e utilizzati, come dimostrano i sondaggi di Stackoverflow.
Per il secondo anno di fila Rust, Swift e GO sono tra i linguaggi più amati dagli sviluppatori. Questi dati sono basati sulla percentuale di sviluppatori che li sta attualmente utilizzando e che ha espresso la preferenza e l’interesse nel voler continuare a sviluppare con essi.
Sono 3 i principali framework con cui è possibile iniziare a lavorare con Swift lato server.
Perfect è stato il primo framework e attualmente è il repository con il maggior numero di star (oltre 7000). Il progetto è partito in Canada ed è portato avanti da PerfectlySoft, che ha recentemente raccolto 1.2 milioni di dollari per rendere Perfect il Rails della situazione nel mondo Swift.
Perfect è in grado di girare sia su macOS che su Linux e dà la possibilità di sviluppare a 360° gradi per il web, realizzando anche il proprio servizio REST API con Swift, garantendo ottime performance e un engine completamente asincrono per le richieste di networking, così da renderlo scalabile.
Perfect supporta SSL ed utilizzando Swift Package Manager è possibile importare nei progetti componenti scritti ad hoc che ne ampliano le funzionalità, come WebSocket e Push Notification.
Ogni web framework che si rispetti però ha anche bisogno di un database a cui appoggiarsi, ed è qui che Perfect è avanti rispetto ai diretti concorrenti: non tutti infatti dispongono di connettori per i database più comuni, mentre Perfect può vantare connettori per SQLite, PostgreSQL, MongoDB, MySQL, Redis.
Per una lista completa dei moduli “nativi” messi a disposizione da PerfectlySoft, vi rimandiamo alla lista dei repository su github.
Un altro framework molto interessante è Kitura, realizzato da IBM, che per mettere in atto il progetto ha iniziato a spostare sviluppatori da Strongloop (il maggior manutentore di Express.js) dopo l’acquisizione.
Kitura è arrivato alla fine di Febbraio e anche Apple ha iniziato a sostenerlo dedicandogli un talk tutto suo alla WWDC 2016. Anche Kitura come Perfect dispone di un gran numero di moduli esterni per l’utilizzo di SSL, Redis, autenticazione con i social, Socket, e così via.
Per la lista completa vi rimandiamo alla relativa lista dei repository di progetto su Github.
Vapor è un framework ispirato a Laravel, il cui progetto è manutenuto principalmente da due sviluppatori che sono retribuiti per portare avanti unicamente questo framework.
Anche Vapor presenta connettori per database ed SSL, ma il numero di moduli disponibile in confronto a Perfect e Kitura è più ridotto. Inoltre, essendo manutenuto da un team più piccolo, lo sviluppo è più lento.
Nonostante ciò, ci sono molti sviluppatori estimatori del progetto che contribuiscono attivamente con delle pull request.
Vedremo ora come è possibile configurare sulla propria macchina locale (o su un server remoto linux basato su Ubuntu) un piccolo web service con Swift. In particolar modo, utilizzeremo Perfect per far girare un semplice “Hello World”, ma nessuno vi impedisce di sviluppare qualcosa di ben più complesso.
Perfect, così come Kitura e Vapor, utilizza Swift 3, l’ultima versione di Swift che è tutt’ora in versione beta e che sarà rilasciata in versione definitiva in autunno. Quindi, nonostante ci siano progetti attivi e in produzione, è consigliabile attendere il rilascio definitivo di Swift 3.
Chi ha installato Xcode 8 (beta), avrà avuto modo di provare Swift 3 in anteprima, ma essendo il linguaggio open source è possibile vedere le continue evolutive che vengono apportate e scaricare così i singoli snapshot, ovvero versioni prebuild create direttamente dai branch in fase di sviluppo. Utilizzeremo proprio una di queste per poter testare Perfect.
Se siete sviluppatori iOS, potreste avere la necessità di avere più versioni di Swift installate contemporaneamente sulla vostra macchina. Inoltre il fatto che gli snapshot vengano rilasciati con frequenze regolari significa dover aggiornare continuamente ed è per questo motivo che consigliamo l’utilizzo di swiftenv.
Grazie a swiftenv, alias Swift Version Manager, possiamo installare in maniera semplice più versioni di Swift e switchare tra loro a livello globale sul sistema o sul singolo progetto. L’installazione è molto semplice, ci basterà clonare il progetto tramite git lanciando questo comando sul terminale:
$ git clone https://github.com/kylef/swiftenv.git ~/.swiftenv
a seguire invocare uno dopo l’altro questi tre comandi:
$ echo 'export SWIFTENV_ROOT="$HOME/.swiftenv"' >> ~/.bash_profile $ echo 'export PATH="$SWIFTENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(swiftenv init -)"' >> ~/.bash_profile
Riavviate quindi il terminale. In alternativa potete installarlo su OS X tramite Homebrew, seguendo la procedura descritta sulla documentazione nel repository.
Tramite Swift Version Manager possiamo verificare la versione di Swift attualmente in uso, tutte le versioni che abbiamo installato su mac e ovviamente avere la possibilità di installare nuove versioni di Swift.
Potete visionare l’ultima versione di Swift richiesta dal template base di Perfect che andremo ad utilizzare direttamente sul suo repository. Nel momento in cui scrivo, Perfect richiede lo snapshot DEVELOPMENT-SNAPSHOT-2016-06-20-a.
Invochiamo quindi sul terminale
$ swiftenv install DEVELOPMENT-SNAPSHOT-2016-06-20-a
Cloniamo sul nostro filesystem il progetto di esempio, il Perfect Template, invocando i seguenti comandi:
$ git clone https://github.com/PerfectlySoft/PerfectTemplate.git $ cd PerfectTemplate
Ora che siamo posizionati sulla cartella di PerfectTemplate, modifichiamo la versione di Swift attualmente in uso dal progetto:
$ swiftenv local DEVELOPMENT-SNAPSHOT-2016-06-20-a $ swiftenv local
L’ultimo comando vi dovrà restituire lo stesso nome dello snapshot appena configurato. Avrete quindi la certezza di aver effettuato correttamente lo switch di versione di Swift sul progetto.
Prima di mandare in esecuzione il template di prova su OS X avremo bisogno di installare OpenSSL. Possiamo effettuare la procedura di installazione tramite Home Brew lanciando il seguente comando:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
e dopo installare OpenSSL lanciando:
$ brew install openssl $ brew link openssl --force
Proviamo ora a compilare e a mandare in running il progetto:
$ swift build $ .build/debug/PerfectTemplate
Avrete il seguente output
Starting HTTP server on 0.0.0.0:8181 with document root ./webroot
Ciò significa che il server è up & running e che recandovi sul browser all’indirizzo http://0.0.0.0:8181/ potrete vedere che tutto è correttamente funzionante: avrete infatti sul browser il testo “Hello World”.
Sul terminale premendo Ctrl+C terminerete il processo.
Se avete installato Xcode 8 beta, dopo il build potrebbe esservi apparso un errore nel caso in cui la build di Swift non combaciasse. In tal caso potete risolvere modificando il toolchain e modificando il Command Line Tools impostando Xcode 8.
Se vogliamo utilizzare un buon IDE e avere la possibilità di utilizzare breaktpoint e tutto ciò che ci offre Xcode per il debug del codice (assicurandoci di essere posizionati sulla cartella di progetto) possiamo utilizzare il comando
$ swift package generate-xcodeproj
che creerà il file con estensione .xcodeproj. In questo modo possiamo aprire il progetto in Xcode e avere persino la possibilità di compilarlo direttamente dall’IDE.
Fantastico, non è vero? 🙂
In questo caso ci servirà una macchina con un’installazione di Ubuntu 14.04.4 x64 che abbia accesso ssh.
Perfect in tal caso necessita di alcune librerie come OpenSSL, proprio come su Mac.
Possiamo installare tutto il necessario lanciando questi due comandi:
$ sudo apt-get install clang libicu-dev $ sudo apt-get install openssl libssl-dev uuid-dev
Ultimata l’installazione la procedura da seguire sarà identica a quella seguita su mac e sarà possibile utilizzare anche swiftenv per gestire le varie versioni di Swift, che in tal caso utilizzeranno degli snapshot creati ad hoc da Apple per Ubuntu.
Probabilmente i più smaliziati ed esperti si staranno chiedendo se è possibile usufruire di tutte le funzionalità offerte dal framework Foundation di Apple, che fornisce un set di classi essenziali per garantire la stessa esperienza che troviamo durante lo sviluppo su iOS.
All’interno del framework si trova anche la classe NSURLSession, che rende possibile effettuare connessioni remote (immaginiamo di voler scaricare informazioni da un’api remota, elaborare queste informazioni e girarle su un endpoint creato tramite Perfect).
La risposta è sì, è possibile utilizzare Foundation sia su Mac che su Linux, ma con una importante differenza. Su OS X, Swift 3 utilizza l’ultima release di Foundation, che è stata adattata alle nuove linee guida del linguaggio. In tal caso NSURLSession si chiamerà solo URLSession. Su Linux invece Swift 3 utilizza una versione precedente di Foundation, quindi sarà necessario utilizzare il vecchio naming per classe e variabili. Questa differenza sparirà non appena Swift 3 uscirà dalla fase beta, in quanto l’idea di Apple è di unificare i branch di Foundation per Linux e OS X, che attualmente viaggiano separati.
Secondo il nostro parere la risposta è “non ancora”. Sarà infatti necessario attendere questo autunno (Settembre-Ottobre) per veder uscire contemporaneamente Swift e Perfect dalla fase beta. Da allora, si potrà pensare di passare tutti i servizi in produzione. Chiaramente nulla vieta di iniziare a sviluppare il proprio web service e di renderlo disponibile non appena ultimato (vi sono già servizi che utilizzano Perfect in produzione).
Se desiderate saperne di più su Perfect potete visitare il suo sito web dove è possibile trovare le immagini docker, esempi di come far girare il framework su AWS o Heroku, e molto altro.