\documentclass{beamer} \usepackage{tikz} %\usepackage{minted} \usetikzlibrary{positioning} \usetheme{Darmstadt} \begin{document} \section{Structure of the compiler} \begin{frame}{Main ideas} \begin{figure} \begin{tikzpicture} \node (sf) {Source file}; \node[right =2cm of sf] (ast) {Typed AST}; \node[right =2cm of ast] (C) {C program}; \draw (sf) edge[->] node[above] {parser} (ast) (ast) edge[->] node[above] {compiler} (C); \end{tikzpicture} \caption{Structure of the compiler} \end{figure} \end{frame} \begin{frame}{Testing} \begin{block}{Passes} The passes can be split into: \begin{itemize} \item those checking the program validity \item those modifying the AST of the program \end{itemize} \end{block} \end{frame} \section{Typed AST} \subsection{First attempt using GADTs} \begin{frame} \begin{block}{Main idea} Using GADTs to represent nodes and expressions allows to ensure the well-typedness of a program. \end{block} \begin{figure} \centering \includegraphics[width=.75\textwidth]{imgs/gadt.png} \end{figure} %type _ t_var = % | BVar: ident -> bool t_var % | IVar: ident -> int t_var % | RVar: ident -> real t_var % %type _ t_expression = % | EVar: 'a t_var -> 'a t_expression % | EMonOp: monop * 'a t_expression -> 'a t_expression % | EBinOp: binop * 'a t_expression * 'a t_expression -> 'a t_expression % | ETriOp: triop * bool t_expression * 'a t_expression * 'a t_expression -> 'a t_expression % | EComp: compop * 'a t_expression * 'a t_expression -> bool t_expression % | EConst: 'a const -> 'a t_expression % | ETuple: 'a t_expression * 'b t_expression -> ('a * 'b) t_expression % | EApp: (('a -> 'b) t_node) * 'a t_expression -> 'b t_expression % %and _ t_varlist = % | NVar: 'a t_varlist % | CVar: 'a t_var * 'b t_varlist -> ('a * 'b) t_varlist % %and 'a t_equation = 'a t_varlist * 'a t_expression % %and _ t_eqlist = % | NEql: unit t_eqlist % | CEql: 'a t_equation * 'b t_eqlist -> ('a * 'b) t_eqlist % %and _ t_node = % | MakeNode: % ident % * 'i t_varlist * 'o t_varlist % * 'l t_varlist * 'e t_eqlist % -> ('i -> 'o) t_node % %type _ t_nodelist = % | NNode: unit t_nodelist % | CNode: ('a -> 'b) t_node * 'c t_nodelist -> (('a -> 'b) * 'c) t_nodelist % \end{minted} \end{frame} \begin{frame} \begin{block}{Pros of using GADTs} \begin{itemize} \item Any term of the GADT represents a well-typed program \item Extending the language to support more types consists of adding constructors to variables and constants \item The types are easy to read and understand \end{itemize} \end {block} \begin{block}{Cons of using GADTs} \begin{itemize} \item They cannot be dynamically generated (hence it is impossible to implement a parser that gives back a GADT) \item One should think about the isomorphism between \texttt{a $\ast$ (b $\ast$ c)} and \texttt{(a $\ast$ b) $\ast$ c}. \end{itemize} \end{block} \end{frame} \subsection{Second attempt: using explicit types in the variables, expressions, \dots{} constructors} \begin{frame} \begin{block}{Idea} Explicitly collect typing information while parsing. \end{block} \begin{figure} \centering \includegraphics[width=.6\textwidth]{imgs/explicit_types.png} \end{figure} \end{frame} \begin{frame} \begin{block}{Pros of using explicit types} \begin{itemize} \item Programs can be built dynamically, hence a parser can be written \item While parsing, the parser has all the required information on the sub-variables/nodes/expressions to check the well-typedness \end{itemize} \end{block} \begin{block}{Cons of these definitions} \begin{itemize} \item The typing information on terms is very redundant. \item The rejection of ill-typed programs depends on the correctness of the parser \end{itemize} \end{block} \end{frame} \section{Passes} \begin{frame}{Passes} \begin{block} The passes of our compiler are functions of taking a program and either: \begin{itemize} \item returning a program if the pass succeeded \item returns nothing otherwise \end{itemize} We only have one language in our compiler: no intermediary language. \end{block} \end{frame} \subsection{Check} \begin{frame} \begin{block}{Passes} The passes can be split into: \begin{itemize} \item those checking the program validity \item those modifying the AST of the program \end{itemize} \end{block} \end{frame} \begin{frame}{Implemented passes} \begin{block}{\texttt{pre}-propagation to leaves} \end{block} \begin{block}{Check: unique initialization for variables} \end{block} \begin{block}{Linearization of the equations} \end{block} \end{frame} \end{document}