Stand vom Vortrag
This commit is contained in:
parent
8973bb56a2
commit
ce90da9e8b
232
main.tex
232
main.tex
@ -1,24 +1,26 @@
|
|||||||
\documentclass{beamer}
|
\documentclass[aspectratio=43]{beamer}
|
||||||
\usepackage{lmodern} % Add the lmodern package to fix missing font shapes
|
\usepackage{lmodern} % Add the lmodern package to fix missing font shapes
|
||||||
\usepackage{beamerthemeDHBW} % Include the package
|
\usepackage{beamerthemeDHBW} % Include the package
|
||||||
\usepackage[overlay, absolute]{textpos}
|
\usepackage[overlay, absolute]{textpos}
|
||||||
\usepackage{bookmark}
|
\usepackage{bookmark}
|
||||||
\usepackage{pgfplots}
|
\usepackage{pgfplots}
|
||||||
|
\usepackage[ngerman]{babel}
|
||||||
\usepackage{tikz}
|
\usepackage{tikz}
|
||||||
\usepackage{amssymb} % Add the amssymb package to fix missing font shape
|
\usepackage{amssymb} % Add the amssymb package to fix missing font shape
|
||||||
\usepackage{listings}
|
\usepackage{listings}
|
||||||
|
\usepackage{tcolorbox}
|
||||||
\newcommand{\internetadresse}{https://www.dhbw-stuttgart.de}
|
\newcommand{\internetadresse}{https://www.dhbw-stuttgart.de}
|
||||||
\pgfplotsset{compat=1.18}
|
\pgfplotsset{compat=1.18}
|
||||||
|
|
||||||
\lstset{
|
\lstset{
|
||||||
basicstyle=\ttfamily\scriptsize,
|
basicstyle=\ttfamily\scriptsize,
|
||||||
keywordstyle=\color{blue},
|
keywordstyle=\bfseries,
|
||||||
commentstyle=\color{green!60!black},
|
commentstyle=\color{green!50!black},
|
||||||
escapeinside={(*@}{@*)},
|
escapeinside={(*@}{@*)},
|
||||||
numbers=left,
|
numbers=left,
|
||||||
numberstyle=\tiny\color{gray},
|
numberstyle=\tiny\color{gray},
|
||||||
frame=single,
|
frame=single,
|
||||||
backgroundcolor=\color{lightgray},
|
backgroundcolor=\color{lightgray!10},
|
||||||
showspaces=false,
|
showspaces=false,
|
||||||
showstringspaces=false,
|
showstringspaces=false,
|
||||||
showtabs=false,
|
showtabs=false,
|
||||||
@ -29,6 +31,7 @@
|
|||||||
|
|
||||||
%Information to be included in the title page:
|
%Information to be included in the title page:
|
||||||
\title{Java-TX Compiler in Java-TX}
|
\title{Java-TX Compiler in Java-TX}
|
||||||
|
\subtitle{Bad Honnef 2024}
|
||||||
\author{Julian Schmidt}
|
\author{Julian Schmidt}
|
||||||
\institute{DHBW Stuttgart}
|
\institute{DHBW Stuttgart}
|
||||||
\date{2024}
|
\date{2024}
|
||||||
@ -39,22 +42,6 @@
|
|||||||
|
|
||||||
\maketitle
|
\maketitle
|
||||||
|
|
||||||
\begin{frame}
|
|
||||||
\frametitle{Agenda}
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Motivation
|
|
||||||
\item Aufbau der Umgebung
|
|
||||||
\item Bugs/Probleme
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Überschreiben von Methoden
|
|
||||||
\item Kompatibilität mit funktionalen Interfaces
|
|
||||||
\end{enumerate}
|
|
||||||
\vspace*{-\baselineskip}
|
|
||||||
\item Fazit
|
|
||||||
|
|
||||||
\end{enumerate}
|
|
||||||
\end{frame}
|
|
||||||
|
|
||||||
\begin{frame}[fragile]
|
\begin{frame}[fragile]
|
||||||
\frametitle{Motivation I}
|
\frametitle{Motivation I}
|
||||||
|
|
||||||
@ -62,7 +49,7 @@
|
|||||||
\item Welche Features fehlen noch in Java-TX?
|
\item Welche Features fehlen noch in Java-TX?
|
||||||
\item Welche Bugs gibt es?
|
\item Welche Bugs gibt es?
|
||||||
\item Vorteile/Nachteile zu Java in der Praxis
|
\item Vorteile/Nachteile zu Java in der Praxis
|
||||||
\item Wie performant is Java-TX für größere Projekte?
|
\item Wie performant ist Java-TX für \glqq{}größere\grqq{} Projekte?
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\begin{visibleenv}<2>
|
\begin{visibleenv}<2>
|
||||||
\begin{table}
|
\begin{table}
|
||||||
@ -73,7 +60,7 @@
|
|||||||
ANTLR Grammar & 2 & 771 \\
|
ANTLR Grammar & 2 & 771 \\
|
||||||
\hline
|
\hline
|
||||||
SUM & 249 & 18729 \\
|
SUM & 249 & 18729 \\
|
||||||
\end{tabular*}
|
\end{tabular}
|
||||||
\end{table}
|
\end{table}
|
||||||
\end{visibleenv}
|
\end{visibleenv}
|
||||||
|
|
||||||
@ -95,15 +82,33 @@
|
|||||||
\end{center}
|
\end{center}
|
||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
\begin{frame}[fragile]{Vergleich Sourcecode}
|
\begin{frame}[fragile]
|
||||||
\begin{columns}
|
\frametitle{JavaTX}
|
||||||
\begin{onlyenv}<1->
|
\begin{itemize}
|
||||||
|
\item Programmiersprache basierend auf Java 8
|
||||||
|
\item Globale Typinferenz
|
||||||
|
\item Lambda-Ausdrücke sind getypt
|
||||||
|
\item Überladung von Funktionstypen
|
||||||
|
\item Automatisches Überladen von Funktionen
|
||||||
|
\item Automatisches generieren von Generics
|
||||||
|
\item Autoboxing von primitiven Datentypen
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}[fragile]{Vergleich Sourcecode Java - Java-TX}
|
||||||
|
\begin{columns}[T]
|
||||||
|
\begin{onlyenv}<0->
|
||||||
\begin{column}{0.5\textwidth}
|
\begin{column}{0.5\textwidth}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java]
|
||||||
public class FunNClass extends ClassOrInterface {
|
public class FunNClass extends ClassOrInterface {
|
||||||
private static GenericDeclarationList createGenerics(List<GenericRefType> funNParams) {
|
private static (*@\alert<2,4>{GenericDeclarationList}@*)
|
||||||
var generics = new ArrayList<GenericTypeVar>();
|
createGenerics(
|
||||||
for (GenericRefType param : funNParams) {
|
(*@\alert<2,4>{List<GenericRefType>}@*) funNParams) {
|
||||||
|
|
||||||
|
var generics =
|
||||||
|
new ArrayList<(*@\alert<2>{GenericTypeVar}@*)>();
|
||||||
|
|
||||||
|
for ((*@\alert<2>{GenericRefType}@*) param : funNParams) {
|
||||||
generics.add(...);
|
generics.add(...);
|
||||||
}
|
}
|
||||||
return new GenericDeclarationList(generics, new NullToken());
|
return new GenericDeclarationList(generics, new NullToken());
|
||||||
@ -112,53 +117,53 @@ public class FunNClass extends ClassOrInterface {
|
|||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\end{column}
|
\end{column}
|
||||||
\end{onlyenv}
|
\end{onlyenv}
|
||||||
\begin{onlyenv}<1>
|
|
||||||
\begin{column}{0.5\textwidth}
|
\begin{column}{0.5\textwidth}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{onlyenv}<-2>
|
||||||
|
\begin{lstlisting}[language=java, backgroundcolor=\color{red!10}]
|
||||||
public class FunNClass extends ClassOrInterface {
|
public class FunNClass extends ClassOrInterface {
|
||||||
private static createGenerics(funNParams) {
|
private static
|
||||||
|
createGenerics(
|
||||||
|
funNParams) {
|
||||||
|
|
||||||
|
var generics =
|
||||||
|
new ArrayList<>();
|
||||||
|
|
||||||
var generics = new ArrayList<GenericTypeVar>();
|
for (param : funNParams) {
|
||||||
for (GenericRefType param : funNParams) {
|
generics.add(...);
|
||||||
generics.add(...);
|
|
||||||
}
|
}
|
||||||
return new GenericDeclarationList(generics, new NullToken());
|
return new GenericDeclarationList(generics, new NullToken());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\end{column}
|
|
||||||
|
|
||||||
\end{onlyenv}
|
\end{onlyenv}
|
||||||
\begin{onlyenv}<2->
|
\begin{onlyenv}<3->
|
||||||
\begin{column}{0.5\textwidth}
|
\begin{lstlisting}[language=java, backgroundcolor=\color{green!10}]
|
||||||
\begin{lstlisting}[language=java]
|
|
||||||
public class FunNClass extends ClassOrInterface {
|
public class FunNClass extends ClassOrInterface {
|
||||||
private static GenericDeclarationList createGenerics(Iterable<? extends GenericRefType> var0) {
|
private static (*@\alert<4>{GenericDeclarationList}@*)
|
||||||
List var1 = null;
|
createGenerics(
|
||||||
var1 = (List)(new ArrayList());
|
(*@\alert<4>{Iterable<? extends GenericRefType>}@*) funNParams) {
|
||||||
Iterator var10000 = var0.iterator();
|
|
||||||
while(var10000.hasNext()) {
|
ArrayList<GenericTypeVar> generics =
|
||||||
GenericRefType var2 = (GenericRefType)var10000.next();
|
new ArrayList<GenericTypeVar>();
|
||||||
var1.add(...);
|
|
||||||
|
for (GenericRefType param : funNParams) {
|
||||||
|
generics.add(...);
|
||||||
}
|
}
|
||||||
return new GenericDeclarationList(var1, new NullToken());
|
return new GenericDeclarationList(generics, new NullToken());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
\end{onlyenv}
|
||||||
\end{column}
|
\end{column}
|
||||||
\end{onlyenv}
|
|
||||||
\end{columns}
|
\end{columns}
|
||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
\begin{frame}{Aufbau der Umgebung I}
|
\begin{frame}[fragile]{Aufbau der Umgebung I}
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Compiler soll sukzessive in Java-TX umgeschrieben werden
|
\item Compiler soll sukzessive in Java-TX umgeschrieben werden
|
||||||
\item Umgebung mit .java und .jav Dateien
|
\item Umgebung mit .java und .jav Dateien
|
||||||
\item Ziel: Auf JVM ausführbare .class Dateien
|
\item Ziel: Auf JVM ausführbare .class Dateien
|
||||||
\item Java-TX Compiler kann .java Dateien lesen \\
|
|
||||||
\(\rightarrow\) Abhängigkeiten zu Java Dateien möglich
|
|
||||||
\item Java-TX Compiler muss vor javac aufgerufen werden
|
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
@ -187,10 +192,10 @@ public class FunNClass extends ClassOrInterface {
|
|||||||
\begin{frame}[fragile]{Aufbau der Umgebung III}
|
\begin{frame}[fragile]{Aufbau der Umgebung III}
|
||||||
Probleme:
|
Probleme:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item javac compiliert und trackt Änderungen der Abhängigkeiten automatisch
|
\item javac compiliert und trackt Änderungen von Abhängigkeiten automatisch
|
||||||
\item javac ist sehr langsam wenn für jede Datei einzeln aufgerufen (viele mehrfache Compilierungen)
|
\item javac ist sehr langsam wenn für jede Datei einzeln aufgerufen (mehrfache Compilierungen + JVM overhead)
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
\begin{columns}
|
\begin{columns}[T]
|
||||||
\begin{column}{0.5\textwidth}
|
\begin{column}{0.5\textwidth}
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
javac src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java
|
javac src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java
|
||||||
@ -210,36 +215,43 @@ javac src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java src/main/jav
|
|||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
\begin{frame}[fragile]{Aufbau der Umgebung IV - compile script}
|
\begin{frame}[fragile]{Aufbau der Umgebung IV - compile script}
|
||||||
Gegeben: Quellverzeichnis, Zielverzeichnis
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Suche rekursiv alle .java und .jav Dateien im Quellverzeichnis und speichere sie jeweils in einer Liste
|
\item Lese alle Sourcecode Dateien (*.jav, *.java)
|
||||||
\item Überprüfe für jede Quelldatei, ob die zugehörige .class Datei im Zielverzeichnis existiert und ob die Zieldatei neuer als die Quelldatei ist
|
\item Filtere die Dateien, die neu compiliert werden müssen
|
||||||
\begin{itemize}
|
\item Rufe den Compiler einmal mit allen Sourcefiles als Argumente auf
|
||||||
\item Wenn ja, gehe weiter zur nächsten Datei
|
\lstinline!javac -d "$DESTDIR" -cp "$SRCDIR:$DESTDIR:target/dependencies/*" $JAVAC_FLAGS "${JAVA_CHANGED[@]}"!
|
||||||
\item Wenn nein, füge die Quelldatei zur Liste der zu kompilierenden Dateien hinzu
|
|
||||||
\end{itemize}
|
|
||||||
\vspace*{-\baselineskip}
|
|
||||||
\item Rufe den Java-TX Compiler mit allen Dateien in der jav-Liste als Argumente auf
|
|
||||||
\lstinline{java -jar $JAVATX_COMPILER_PATH -d $DESTDIR -cp "$SRCDIR:$DESTDIR:target/dependencies/" "${JAV_CHANGED[@]}"}
|
|
||||||
\item Rufe den javac Compiler mit allen Dateien in der java-Liste als Argumente auf
|
|
||||||
\lstinline{javac -d $DESTDIR -cp "$SRCDIR:$DESTDIR:target/dependencies/*" $JAVAC_FLAGS "${JAVA_CHANGED[@]}"}
|
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
|
% \begin{enumerate}
|
||||||
|
|
||||||
|
% \item Suche rekursiv alle .java und .jav Dateien im Quellverzeichnis und speichere sie jeweils in einer Liste
|
||||||
|
% \item Überprüfe für jede Quelldatei, ob die zugehörige .class Datei im Zielverzeichnis existiert und ob die Zieldatei neuer als die Quelldatei ist
|
||||||
|
% \begin{itemize}
|
||||||
|
% \item Wenn ja, gehe weiter zur nächsten Datei
|
||||||
|
% \item Wenn nein, füge die Quelldatei zur Liste der zu kompilierenden Dateien hinzu
|
||||||
|
% \end{itemize}
|
||||||
|
% \vspace*{-\baselineskip}
|
||||||
|
% \item Rufe den Java-TX Compiler mit allen Dateien in der jav-Liste als Argumente auf
|
||||||
|
% \lstinline{java -jar $JAVATX_COMPILER_PATH -d $DESTDIR -cp "$SRCDIR:$DESTDIR:target/dependencies/" ${JAV_CHANGED[@]}}
|
||||||
|
% \item Rufe den javac Compiler mit allen Dateien in der java-Liste als Argumente auf
|
||||||
|
% \lstinline{javac -d $DESTDIR -cp "$SRCDIR:$DESTDIR:target/dependencies/*" $JAVAC_FLAGS ${JAVA_CHANGED[@]}}
|
||||||
|
% \end{enumerate}
|
||||||
|
|
||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
\begin{frame}[fragile]{Bugübersicht}
|
% \begin{frame}[fragile]{Bugübersicht}
|
||||||
\begin{center}
|
% \begin{center}
|
||||||
\begin{tikzpicture} \begin{axis}[ ybar, enlargelimits=0.15, legend style={at={(0.
|
% \begin{tikzpicture} \begin{axis}[ ybar, enlargelimits=0.15, legend style={at={(0.
|
||||||
5,-0.3)}, anchor=north,legend columns=-1}, ylabel={amount}, symbolic x
|
% 5,-0.3)}, anchor=north,legend columns=-1}, ylabel={amount}, symbolic x
|
||||||
coords={open,closed}, xtick=data, nodes near coords, nodes near coords
|
% coords={open,closed}, xtick=data, nodes near coords, nodes near coords
|
||||||
align={vertical}, width=0.7\textwidth, height=10cm, bar width=2cm]
|
% align={vertical}, width=0.7\textwidth, height=10cm, bar width=2cm]
|
||||||
\addplot coordinates {(open,1) (closed,25) };
|
% \addplot coordinates {(open,1) (closed,25) };
|
||||||
\addplot coordinates {(open,3) (closed,18) };
|
% \addplot coordinates {(open,3) (closed,18) };
|
||||||
\legend{Bugs,Feature Requests}
|
% \legend{Bugs,Feature Requests}
|
||||||
\end{axis}
|
% \end{axis}
|
||||||
\end{tikzpicture}
|
% \end{tikzpicture}
|
||||||
\end{center}
|
% \end{center}
|
||||||
\end{frame}
|
% \end{frame}
|
||||||
|
|
||||||
\begin{frame}[fragile]{Primitive Typen in Java-TX}
|
\begin{frame}[fragile]{Primitive Typen in Java-TX}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@ -247,7 +259,7 @@ javac src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java src/main/jav
|
|||||||
\item Java-TX erlaubt primitive Datentypen zwar im Quellcode, wandelt diese aber in die korrespondierende Wrapperklasse um (Integer, Boolean, ...)
|
\item Java-TX erlaubt primitive Datentypen zwar im Quellcode, wandelt diese aber in die korrespondierende Wrapperklasse um (Integer, Boolean, ...)
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\begin{columns}
|
\begin{columns}[T]
|
||||||
\begin{column}{0.5\textwidth}
|
\begin{column}{0.5\textwidth}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java]
|
||||||
int a = 10;
|
int a = 10;
|
||||||
@ -256,7 +268,7 @@ float c = 10.0f;
|
|||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\end{column}
|
\end{column}
|
||||||
\begin{column}{0.5\textwidth}
|
\begin{column}{0.5\textwidth}
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}[language=java]
|
||||||
Integer var1 = null;
|
Integer var1 = null;
|
||||||
var1 = 10;
|
var1 = 10;
|
||||||
Boolean var2 = null;
|
Boolean var2 = null;
|
||||||
@ -268,9 +280,9 @@ var3 = 10.0F;
|
|||||||
\end{columns}
|
\end{columns}
|
||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
\begin{frame}[fragile]
|
\begin{frame}[fragile]{Überschreiben von Methoden II}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Generell in Java: Methoden nicht anhand von Rückgabewert überschreibbar
|
\item In Java: Methoden nicht anhand von Rückgabewert überschreibbar
|
||||||
\end{itemsize}
|
\end{itemsize}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java]
|
||||||
public class Bar {
|
public class Bar {
|
||||||
@ -301,10 +313,7 @@ Bar.java:3: Fehler: Methode foo(Object) ist bereits in Klasse Bar definiert
|
|||||||
public boolean equals(Object obj);
|
public boolean equals(Object obj);
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java, backgroundcolor=\color{red!10}]
|
||||||
//Java-TX Code
|
|
||||||
import java.lang.Object;
|
|
||||||
import java.lang.Boolean;
|
|
||||||
public class Foo {
|
public class Foo {
|
||||||
equals(Object o){
|
equals(Object o){
|
||||||
return false;
|
return false;
|
||||||
@ -312,7 +321,6 @@ public class Foo {
|
|||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java]
|
||||||
//Inferierte Typen
|
|
||||||
public class Foo {
|
public class Foo {
|
||||||
public Foo() {}
|
public Foo() {}
|
||||||
Boolean equals(Object var1) {
|
Boolean equals(Object var1) {
|
||||||
@ -326,10 +334,7 @@ public class Foo {
|
|||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Lösung: Wenn Methodensignatur eines Supertyps sich nur in primitiven-/Wrapper-Datentypen unterscheidet, werden Typen vom Supertyp in Subtyp substituiert
|
\item Lösung: Wenn Methodensignatur eines Supertyps sich nur in primitiven-/Wrapper-Datentypen unterscheidet, werden Typen vom Supertyp in Subtyp substituiert
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java, backgroundcolor=\color{red!10}]
|
||||||
import java.lang.Object;
|
|
||||||
import java.lang.Boolean;
|
|
||||||
|
|
||||||
public class Foo {
|
public class Foo {
|
||||||
equals(Object o){
|
equals(Object o){
|
||||||
return false;
|
return false;
|
||||||
@ -354,33 +359,28 @@ public class Foo {
|
|||||||
Function<Integer, Integer> func = x -> x*2;
|
Function<Integer, Integer> func = x -> x*2;
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\item Java-TX unterstützt echte Funktionstypen
|
\item Java-TX unterstützt echte Funktionstypen
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java, backgroundcolor=\color{red!10}]
|
||||||
var func = x -> x*2;
|
var func = x -> x*2;
|
||||||
func: Fun1$$Ljava$lang$Integer$_$Ljava$lang$Integer$_$
|
func: Fun1$$<Integer, Integer>
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\item Für Kompatibilität müssen Funktionstypen mit Target Typen integriert werden
|
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\end{frame}
|
\end{frame}
|
||||||
|
|
||||||
\begin{frame}[fragile]{Kompatibilität mit funktionalen Interfaces II}
|
\begin{frame}[fragile]{Kompatibilität mit funktionalen Interfaces II}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
|
\item Java ist nominal typisierte Sprache
|
||||||
\item Problem: Lambda Ausdrücke haben in Java-TX einen FunN\$\$ Typ (für N = \#Parameter)
|
\item Problem: Lambda Ausdrücke haben in Java-TX einen FunN\$\$ Typ (für N = \#Parameter)
|
||||||
\item Aber: Java Bibliotheken wie Stream erwarten verschiedene funktionale Interfaces
|
\item Aber: Java Bibliotheken wie Stream erwarten verschiedene funktionale Interfaces
|
||||||
\item Lösung: Lambda Ausdrücke müssen je nach Kontext erwartetes funktionales Interface als Target Typ haben
|
\item Daher: Lambda Ausdrücke müssen je nach Kontext erwartetes funktionales Interface als Target Typ haben
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Beispiel:
|
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java]
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.stream.Steam;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
main() {
|
main() {
|
||||||
List<Integer> list = new ArrayList<>(List.of(1,2,3,4,5));
|
List<Integer> list = new ArrayList<>(List.of(1,2,3,4,5));
|
||||||
return list.stream().map(x -> x*2).toList();
|
return list.stream().map(x -> x*2).toList();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
\end{frame}
|
\end{frame}
|
||||||
@ -397,8 +397,8 @@ public interface Function<T, R> {
|
|||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\vspace*{\baselineskip}
|
\vspace*{\baselineskip}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Eigentlich würde Java-TX Fun1\$\$\ $\langle{}Integer, Integer\rangle{}$ inferieren
|
\item Eigentlich würde Java-TX \lstinline[basicstyle=\normalsize]|Fun1$$<Integer, Integer>| inferieren
|
||||||
\item Aber: Stream.map erwartet $Function\langle{}? super T, ? extends R\rangle{}$
|
\item Aber: Stream.map erwartet \lstinline[basicstyle=\normalsize]|Function<? super T, ? extends R>|
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\begin{lstlisting}[language=java]
|
\begin{lstlisting}[language=java]
|
||||||
...
|
...
|
||||||
@ -429,11 +429,27 @@ public interface Function<T, R> {
|
|||||||
|
|
||||||
Nachteile:
|
Nachteile:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Alle verwendeten/berückstichtigten Typen müssen manuell importiert werden \\
|
\item (Alle verwendeten/berückstichtigten Typen müssen manuell importiert werden) \\
|
||||||
\(\rightarrow\) Der Programmierer muss schon wissen, welche Typen in Frage kommen
|
\(\rightarrow\) Der Programmierer muss schon wissen, welche Typen in Frage kommen
|
||||||
\item Es ist möglich, dass ein ungeschünschter Typ inferiert wird
|
\item Es ist möglich, dass ein ungewünschter Typ inferiert wird
|
||||||
\item Aktuell begrenzte Sprachfeatures \& vermutlich einige Bugs
|
\item Aktuell begrenzte Sprachfeatures \& vermutlich einige Bugs
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Fazit}
|
||||||
|
Weg ist noch weit ... \\
|
||||||
|
Aktuell $\sim{}3\%$ der Java Dateien in Java-TX übersetzt
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\begin{tikzpicture} \begin{axis}[ ybar, enlargelimits=0.15, legend style={at={(0.
|
||||||
|
5,-0.1)}, anchor=north,legend columns=-1}, ylabel={amount}, symbolic x
|
||||||
|
coords={open,closed}, xtick=data, nodes near coords, nodes near coords
|
||||||
|
align={vertical}, width=0.7\textwidth, height=10cm, bar width=2cm]
|
||||||
|
\addplot coordinates {(open,1) (closed,25) };
|
||||||
|
\addplot coordinates {(open,3) (closed,18) };
|
||||||
|
\legend{Bugs,Feature Requests}
|
||||||
|
\end{axis}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{center}
|
||||||
\end{frame}
|
\end{frame}
|
||||||
\end{document}
|
\end{document}
|
Loading…
Reference in New Issue
Block a user