Fraller, B. (2018). Analyse von Lambda-Ausdrücken in Java [Diploma Thesis, Technische Universität Wien]. reposiTUm. https://doi.org/10.34726/hss.2018.35552
Funktionale Konzepte sind wegen paralleler Programmierung und günstiger Mehrkernprozessoren sehr beliebt. Immer mehr objektorientierte Sprachen verwenden daher funktionale Konzepte. So wurden in Java 8 unter anderem Lambda-Ausdrücke und Streams hinzugefügt. Verhalten kann dabei in Form von Daten als Funktionen höherer Ordnung übergeben werden. Streams ermöglichen deklarativ eine sequenzielle und parallele Verarbeitung von Daten. In dieser Arbeit sollen Vorund Nachteile der Konzepte und die Umsetzung, über Dekompilierung in JVM-Bytecode analysiert und mit anderen Sprachen verglichen werden. Die Laufzeit-Performance alter und neuer Konzepte wird über Benchmarks verglichen. Es wird geklärt, wann parallele Streams verwendet werden sollen, ob die IBM J9 schneller als die HotSpot JVM ist und ob Java oder Scala parallel schneller ist. Über Haskell sollen fehlende funktionale Konzepte von Java aufgedeckt und Alternativen bereitgestellt werden. Lambda-Ausdrücke und Streams benötigen weniger Code und sind lesbarer und wartbarer. Dafür ist Exception-Handling und Debugging umständlicher. Lambdas werden in der JVM zur Laufzeit über invokedynamic umgesetzt. So werden keine class Dateien erzeugt und die Übersetzungsstrategie kann zukünftig trotz Rückwärtskompatibilität optimiert werden. Die durchgeführten Benchmarks zeigen, dass sequenzielle Streams etwas langsamer als Schleifen sind. Parallele Streams bieten meist einen Performance-Vorteil, sollten jedoch nur bei passenden Quellen, vielen Elementen und komplexen Operationen verwendet werden. Java ist durch Streams für primitive Datentypen wegen Boxing/Unboxing schneller als Scala Collections. Bei funktionalen Konzepten hat Java Nachholbedarf. Es gibt zwar Monaden und eine verzögerte Auswertung bei Streams. Jedoch treten bei Rekursion wegen fehlender Optimierungen Stackoverflows auf. Algebraische Datentypen und Pattern-Matching werden unzureichend unterstützt, können jedoch über Lambdas selbst umgesetzt werden.
de
Parallel programming and cheap multi core processors make functional concepts more popular. That is the reason why object oriented languages take over functional concepts. Hence Java 8 added lambda expressions and streams. Now it is possible to use behaviour as data in form of higher order functions. Streams make it possible to declaratively process data in a sequential or parallel manner. This work aims at showing advantages and disadvantages of these new concepts. With help of examples and decompilation into JVM byte code, we want to analyze the changes and see how other languages implement these concepts. We try to compare the runtime performance of old and new concepts via benchmarks using the tool JMH. There we will answer when to use parallel streams, if the IBM J9 is faster than the HotSpot JVM and if Java or Scala is faster in terms of parallel computations. In looking at the functional concepts of Haskell we want to find missing concepts in Java and present some alternatives. Lambda expressions and streams need less code and are more readable and maintainable. On the other side, exception handling and debugging is more complicated. Lambdas are translated at runtime with JVMs method call invokedynamic. No class files are generated and Java can optimize their translation strategy in future versions, although Java has backwards compatibility. Our benchmarks show that sequential streams are slightly slower than loops. Parallel streams can achieve performance improvements, but you should only use them with an appropriate stream source, enough elements and complex computations. Java is faster than Scala because it prevents boxing and unboxing with help of specialized streams for primitive data types. Java still needs to catch up on functional concepts. It has monads and supports lazy evaluation on streams. On the other side, support of algebraic data types and pattern matching is insufficient, but it is possible to simulate them via lambda expressions.
en
Additional information:
Abweichender Titel nach Übersetzung der Verfasserin/des Verfassers