Stand vom Vortrag

This commit is contained in:
i21023 2024-05-20 23:32:06 +02:00
parent 8973bb56a2
commit ce90da9e8b
3 changed files with 125 additions and 109 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
main.pdf

Binary file not shown.

234
main.tex
View File

@ -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}