SP03/17: Scala 2.13
Wir suchen einen Scala-Entwickler
Willst Du Scala endlich auch beruflich einsetzen? Dann komm zu uns. Für unser Berliner Team bei der Beta System IAM Software AG suchen wir einen Scala-Entwickler bzw. eine Scala-Entwicklerin. In einem sechsköpfigen Scrum-Team entwickelst Du unsere neue Web-Basierte IAM-Suite, vollständig in Scala.
Auch als Quereinsteiger aus der Java-Welt bist Du herzlich willkommen.
Bewirb Dich jetzt (gib bei der Bewerbung mit an, dass Du über die Scala Profis auf die Stelle aufmerksam geworden bist).
Feedback zur letzten Episode
- Boris hat ganz richtig angemerkt, dass HTTP 1 natürlich auch schon binäre Inhalte übertragen kann ohne diese Base64-encoden zu müssen.
- Benjamin hat uns informiert, dass Java-Enums entgegen unserer Aussage eine natürliche Ordnung haben.
Nachtrag zu SP02/17 und Contextual
In Episode SP02/17 hatte Benjamin bemängelt, dass der Contextual String-Interpolator ein Any
anstelle des gewünschten Typs zurückgibt und großspurig angekündigt dafür einen Pull-Request zu stellen.
Igor Mielientev war da schneller. Sein Pull-Request ist auch schon gemergt, allerdings gibt es noch kein neues Release in dem die Änderung enthalten ist.
Introducing the Scala Platform Process
Der Scala Platform Process soll die Implementierung, Pflege und Verwaltung von Modulen für die Scala Platform vereinfachen.
Zur Erinnerung: Scala soll weiter modularisiert werden. Die Standard Library soll nur die wichtigsten Komponenten enthalten, wie zum Beispiel die Collections. Alles was soll in extra Bibliotheken ausgelagert werden, wie das bei 2.11 zum Beispiel schon mit der XML Bibliothek passiert ist.
Der Scala Platform Process bietet:
- Infrastruktur
- SBT Plugin
- CI
- Release Manager
- Richtlinien
- für den Release-Prozess
- für ›Mitarbeiter‹
Links
Scala 2.13 Roadmap
Lightbend hat seine Pläne für die Scala-Roadmap 2017 inklusive eines Ausblicks auf Scala 2.13 veröffentlicht.
Scala 2.13
Scala 2.13 wird sich auf folgende Themen fokussieren:
- Compiler-Performance
- Vereinfachung der Collections: siehe unten
- Modularisierung der Standard-Library:
- Reduzierung auf die Collection-Typen und andere Standard-Typen wie
Option
,TupleN
,Either
undTry
- Andere Features werden in unabhängige Libraries ausgelagert, die eingebunden werden müssen und einen eigenständigen Release-Zyklus haben werden
- Reduzierung auf die Collection-Typen und andere Standard-Typen wie
- Benutzerfreundlichkeit. Derzeit umfasst das folgende Punkte:
- Konfigurierbares Error-Reporting: Z.B. Warnungen ignorieren oder zu Fehlern anheben
- Scalafix für automatische Migration
- Vereinheitlichung des SBT- und Scala-Launchers: Automatische Updates der Kommandozeilen-Tools und einheitliche Ein-/Ausgaben
- Verbesserte REPL: Z.B. Syntax Highlighting, Möglichkeiten zur Einbettung in Worksheets, Verbessertes Editieren für mehrzeilige Eingaben, etc.
An der Sprache wird sich in 2.13 also nichts ändern.
Zeitplan
- Im Vergleich zu 2.12 soll der Release-Zyklus verkürzt werden.
- Vierteljährliche Milestones für 2.13 in 2017
- Erster Release-Candidate Ende Q1 2018
- 2.12 erhält in 2017 regelmäßige Minor-Releases
- 2.11 erhält in Q1 2017 mit 2.11.9 sein letztes Release
Link
Scala 2.13 Collections Rework
Die Scala Collections sind zwar gut, sind aber durchaus auch ein bisschen überladen und zum Teil schwer zu verwenden und schwer zu implementieren.
Sie sollen deshalb für 2.13 mit den folgenden Zielen neu implementiert werden:
- Einfacher zu verwenden (viele Operationen ohne
CanBuildFrom
, vereinfachte Hierarchie) - Einfacher zu implementieren
- Schneller
- Soweit möglich kompatibel zu 2.12. Inkompatibilitäten sollten sich mit ScalaFix automatisch beheben lassen.
Links
Scala auf Platz 11 im RedMonk-Ranking
Im (verspäteten) Januar-Ergebnis des halbjährlich erscheinenden RadMonk-Programmiersprachen-Rankings konnte Scala gegenüber dem letzten Ergebnis drei Plätze gut machen und liegt jetzt, gleich auf mit Swift, auf Platz 11.
Die RedMonk-Analysten werten StackOverflow und GitHub aus, um einzuschätzen, wie stark welche Programmiersprachen in der Zukunft eingesetzt werden.
Hier die ersten zehn Plätze:
- JavaScript
- Java
- Python
- PHP
- C#
- C++
- CSS
- Ruby
- C
- Objective‑C
Link
Scala.js 0.6.15
- Vorbereitung auf Scala.js 1.0.0
- Neue Annotation
@JSExportStatic
um statische Members auf Scala.js-defined Classes zu definieren @JSExportTopLevel
kann jetzt auch auf Feldern und Top-Level Klassen/Objekten genutzt werden.- Unterstützung für ECMAScript 2015 symbols und Iterables/Iterators.
Bestehender Code erfordert einiges an Migrationsaufwand, der mittels scalafix teilweise automatisch durchgeführt werden kann.
Links
Scala Native v0.1 is here!
Scala Native v0.1 ist verfügbar.
Features
- Vollständiger Scala Support mit ein paar unerheblichen sematischen Unterschieden
- Einfache Interoperabilität mit Nativem Code
- Support für existierende Scala IDEs
- Integration mit SBT
- Cross-publishing für JVM, JS und Native
- Support für einen Teil der JDK core library
- Support für einen Teil der C Standard Library
Links
Android: Java 8 (und Scala)
Google hat sich entschieden die Jack-Toolchain (höre Episode SP004) zu verwerfen und Java 8 Features stattdessen direkt via javac
und dx
zu unterstützen. Laut eigener Aussage wollen sie damit erreichen, dass bestehende Tools, die auf dem Java-Bytecode-Format aufsetzen, auch im Android-Umfeld funktionieren.
Im März 2016 hatte Google angekündigt Java 8 Features über den neuen Jack-Compiler zu unterstützen, der keine .class
-Dateien mehr, sondern .jack
-Dateien generiert, die direkt DEX-Code enthalten sollten.
Mit der neuen Marschrichtung könnte Scala 2.12 für Android wieder realistisch werden.
Link
Java: Project Amber
Biran Goetz, Java Language Architect by Oracle, hat Project Amber angekündigt. Ziel ist es kleinere, produktive Sprach-Features zu evaluieren.
- Typ-Inferenz für lokale Variablen (
var url = new URL(...)
) - Generische Enums
- Lambda Leftovers: Ignorieren von Lambda-Parametern via Unterstrich
- Data Classes:
public class User(String firstName, String lastName, DateTime birthday) { }
-
Pattern Matching
String formatted = switch (constant) { case Integer i -> String.format("int %d", i); case Byte b: //... case Long l: // ... // ... default: formatted = "unknown" }
Verfügbarkeit: Vielleicht 2020?
Links
Kotlin 1.1
- JavaScript: Zur Verfügung stehen alle Sprach- und Library-Konstrukte, nicht aber das JDK.
- Coroutines:
- Library-Feature
- Leichtgewichtige, unterbrechbare/fortsetzbare Threads
- Aufrufer kann asynchron auf das Ergebnis warten
- Mit
yield
kann ein Ergebnis eines Streams zurückgegeben werden - Experimentell
- Sprach-Features
- Type aliases
- Destructuring für Lambda-Argumente
- Underscores für ungenutzte Lambda-Parameter
- Delegated Property Syntax für lokale Variablen:
lazy
- Kann jetzt Java 8 Bytecode generieren
Link
Titelsong basierend auf Wish You Were Here von THE.MADPIX.PROJECT lizensiert unter Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0).
Ed
| #
Tag!
Ich weiß nicht, wie Symbols in Scala funktionieren, aber in Scheme werden sie wie Strings benutzt mit der Eigenschaft, dass sie nur einmal erstellt werden.
z.B. (wenn ich Scheme mit Java-Syntax schreiben wuerde):
Symbol foo1 = new Symbol(»foo«);
Symbol foo2 = new Symbol(»foo«);
foo1==foo2; // true -> sie sind Zeiger zum selben Speicherplatz.
Demzufolge werden sie in Scheme wie enums benutzt, mit dem Vorteil, dass sie auch eine String-Darstellung haben.
Ich habe jetzt geschaut. In Scala funktioneren sie genauso.
Reply
Sven
| #
Du hast Recht, in Scala ist das genauso.
Wenn ich mich recht entsinne ging es in der Episode um Symbols in JavaScript. Die haben eine andere Bedeutung. Dort sind zwei Symbols vom gleichen Wert explizit nicht gleich. Laut MDN ist der primäre Zweck der anonyme Object-Properties zu erstellen.
Reply
Ed
| #
ah, Ok, sorry. Das habe ich mir falsch aufgeschnappt.
Ein weiterer Grund für diese komplizierte Definition von Symbols in JS könnte mit dem JIT-Compiler zu tun haben. Ich schätze, dass myObject[mySymbol] sich schneller finden lässt als myObject[myString] (oder noch gräßlicher: myObject[»my«+»String«]), womöglich ähnlich schnell wie myObject.myProperty.
Übrigens versteckt mitten in der Spec ist ein zweiter Symbol-Konstruktor:
assert.equal(Symbol.for(›foo‹), Symbol.for(›foo‹));
was nur für Verwirrung sorgen kann.
Reply