% !TEX encoding = UTF-8
% !TEX spellcheck = en_GB
% !TEX root = paper.tex
\documentclass[a4paper,twoside]{report}

\usepackage[spanish,catalan,english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{algorithm}
\usepackage{algorithmic}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\usepackage{amsthm}
\usepackage{amssymb}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\newtheorem{example}{Example}
\newtheorem{problem}{Problem}
\usepackage{hyperref}
\usepackage{graphics}
\usepackage{title/mitssTitle}

\newcommand{\ctrldep}{\rightarrow^{ctrl}}
\newcommand{\datadep}{\rightarrow^{data}}

\usepackage{todonotes}
\usepackage{marginnote}

\newif\ifpaperVersion
\paperVersiontrue
%\paperVersionfalse
\ifpaperVersion
	% Paper version
	\newcommand{\ignore}[1]{}
	\newcommand{\deleted}[1]{}
	\newcommand{\added}[1]{#1}
	\newcommand{\pending}[1]{}
	\newcommand{\done}[1]{}
	\newcommand{\doubt}[1]{}
	\newcommand{\josep}[1]{}
	\newcommand{\carlos}[1]{}
	\newcommand{\sergio}[1]{}
\else
	% Working
	\definecolor{ignoreColor}{rgb}{1,0.5,0}
	\definecolor{pendingColor}{rgb}{0.2,0.7,0.2}
	\definecolor{doneColor}{rgb}{0.7,0.2,0.7}
	\definecolor{doubtColor}{rgb}{0.6,0.6,0.4}
	\definecolor{josepColor}{rgb}{0.2,0.6,0.6}
	\definecolor{carlosColor}{rgb}{0.6,0.2,0.6}
	\definecolor{sergioColor}{rgb}{1.0,0.5,0.0}

	\newcommand{\ignore}[1]{\textcolor{ignoreColor}{\#Ignored: #1}}
	\newcommand{\deleted}[1]{\textcolor{red}{\#Deleted: #1}}
	\newcommand{\added}[1]{\textcolor{blue}{\#Added: #1}}
	\newcommand{\pending}[1]{\textcolor{pendingColor}{\#Pending: #1}}
	\newcommand{\done}[1]{\textcolor{doneColor}{\#Done: #1}}
	\newcommand{\doubt}[1]{\textcolor{doubtColor}{\#Doubt: #1}}
	\newcommand{\josep}[1]{\textcolor{josepColor}{\#JJJ: #1}}
	\newcommand{\carlos}[1]{\textcolor{carlosColor}{\#CCC: #1}}
	\newcommand{\sergio}[1]{\textcolor{sergioColor}{\#SSS: #1}}
\fi

\title{Fragmentación de programas con excepciones}
%\title{Program slicing with exceptions}
\author{Carlos S. Galindo Jiménez}
\date{diciembre de 2019}
\supervisor{Josep Francesc Silva Galiana}
\curso{2019-2020}

\begin{document}
\algsetup{linenodelimiter=.}
\include{listings-config}
\maketitle

\cleardoublepage

\begin{abstract}
	Program slicing is an analysis technique that can be applied to practically all programming languages. However, in the presence of exception handling, current program slicing software has a precision problem. This project tackles the problem of program slicing with exception handling, analysing the problem from a general perspective (for any kind of exception system), but focusing our efforts in the object-oriented paradigm, specifically the Java language.
	
	In this thesis, we study the currently available solutions to the problem, and we propose a generalization that includes at least the \texttt{try-catch} and \texttt{throw} statements. We provide detailed descriptions, generalizations and solutions for two problems that increase the size of slices and one problem that greatly reduces the precision of slices.
	The solutions we propose produce slices that guarantee completeness and are as correct as possible, given the restrictions set by the exception handling system.
	
	The analysis performed and solutions proposed are specific for the Java programming language, but are general enough that they can be ported effortlessly to other programming languages with similar exception handling capabilities. They are also specific for static backward slicing, but are likewise compatible with other variants of program slicing.
\end{abstract}

\selectlanguage{spanish}
\begin{abstract}
	La fragmentación de programas es una técnica de análisis de programas que puede ser aplicada prácticamente a todos los lenguajes de programación. Sin embargo, en presencia de excepciones, los fragmentadores de programas tienen un problema de precisión. Este proyecto aborda el problema de la fragmentación de programas en presencia de excepciones, analizando el problema desde una perspectiva general (para cualquier tipo de sistema de excepciones), pero concentrando nuestros esfuerzos en el paradigma de la orientación a objetos, más específicamente en el lenguaje Java.

	En esta tesis, estudiamos las soluciones existentes al problema planteado, y proponemos una generalización que incluye por lo menos las instrucciones \texttt{try-catch} y \texttt{throw}. Damos descripciones detalladas, generalizaciones y soluciones a dos problemas que aumentan innecesariamente el tamaño de los fragmentos de programa y un problema que reduce bastante la precisión.
	Las soluciones que proponemos producen fragmentos que garantizan la completitud y son tan correctos como es posible, dadas las restricciones marcadas por el sistema de manejo de excepciones.

	El análisis realizado y las soluciones propuestas son específicas para el lenguaje de programación Java y su sistema de manejo de excepciones, pero también son lo suficientemente generales como para poder ser empleadas en otros lenguajes de programación que posean un sistema de excepciones. También son específicas para la fragmentación estática hacia atrás, pero, del mismo modo, son compatibles con otras variantes en la fragmentación de programas.
\end{abstract}

\selectlanguage{catalan}
\begin{abstract}
	La fragmentaci\'o de programes es una t\`ecnica que pot ser aplicada practicament a qualsevol llenguatge de programaci\'o. No obstant aix\`o, en pres\`encia de tractament d'excepcions, el software actual de fragmentaci\'o de programes presenta problemes de precisi\'o. Aquest projecte aborda el problema de fracmentaci\'o de programes amb tractament d'excepcions, analitzant el problem des d'una perspectiva general (per a qualsevol tipus de sistema d'excepcions), per\`o centrant els nostres esforços en un paradigma orientat a objectes, specificament per al llenguatge de programaci\'o Java. Tot i aix\'i, la soluci\'o es encara suficientment general com per a aplicarla a altres paradigmes i llenguatges de programaci\'o.
	
	En aquesta tesi, estudiem les actuals solucions disponibles per al problema, i proposem una generalitzaci\'o que inclueix al menys les instruccions \texttt{try-catch} i \texttt{throw}. Proveïm descripcions detallades, generalitzacions i solucions per a dos problemes que incrementen el tamany dels fragments de programa obtinguts i un problema que redueix enormement la precisi\'o dels fragments calculats.
	Les solucions que proposem produeixen fragments de programa que garanteixen completitut i que con el mes correctes posibles, donat el conjunt de restriccions del sistema de tractament d'excepcions.

	Els an\`alisis realitzats i les solucions proposades son espec\'ifiques per al llenguatge de programaci\'o Java, pero son suficientment generals per a ser exportades sense esforç a altres llenguatges de programaci\'o ambs un sistema de tractament d'excepcions similar. Les solucions tamb\'e son espec\'ifiques per a fragmentaci\'o de programes est\`atica cap arrare, pero son igualment compatibles amb altres variantes de la fragmentaci\'o de programes.
\end{abstract}

\selectlanguage{english}

\tableofcontents

\include{Secciones/motivation}
\include{Secciones/background}
\include{Secciones/incremental_slicing}
\include{Secciones/problem_solution}
\include{Secciones/state_of_the_art}
\include{Secciones/conclusion}

% \chapter{TODO}

% \begin{itemize}
% 	\item \carlos{} Decide whether to use dependency or \textbf{dependence} (I suspect the plural form would also change: dependencies vs. dependences). DONE
% 	\item \carlos{} Ver si hay espacios antes/despues de los m-dash. Josep ha visto que no hay espacios. DONE
% 	\item \carlos{} Cambiar criterio de slicing de (line n, variable x) a $\langle n, x \rangle$. DONE
% 	\item \carlos{} Figure, Example, Definition always uppercase. DONE
% 	\item \carlos{} w.r.t. always without spaces. DONE
% 	\item \carlos{} Do not use the same number for different methods.
% 	\item \carlos{} Use et al. for multiple authors.
% 	\item \carlos{} All instructions are statements, even \texttt{catch}, \texttt{try} and \texttt{finally}.
% 	\item \carlos{} i.e. (es decir), e.g. (por ejemplo)
% \end{itemize}

\bibliographystyle{plain}
\bibliography{../../../../../../Biblio/biblio.bib}
\end{document}

% vim: set noexpandtab:ts=2:sw=2:wrap
