Analyse von Lambda-Ausdr��cken in Java

Autor: Fraller, Benjamin
Jazyk: němčina
Rok vydání: 2018
Předmět:
DOI: 10.34726/hss.2018.35552
Popis: 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.
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.
Databáze: OpenAIRE