<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Compiler Theory (Programmiersprachen und Übersetzer) on Johannes Karl Arnold</title><link>https://johannes.arnold.onl/page/notes/compiler-theory/</link><description>Recent content in Compiler Theory (Programmiersprachen und Übersetzer) on Johannes Karl Arnold</description><generator>Hugo</generator><language>en-US</language><copyright>&amp;copy; Johannes Arnold.</copyright><lastBuildDate>Tue, 22 Jul 2025 08:47:49 +0200</lastBuildDate><atom:link href="https://johannes.arnold.onl/page/notes/compiler-theory/index.xml" rel="self" type="application/rss+xml"/><item><title>SML Example</title><link>https://johannes.arnold.onl/page/notes/compiler-theory/sml/</link><pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate><guid>https://johannes.arnold.onl/page/notes/compiler-theory/sml/</guid><description>&lt;p&gt;Following Code contains solutions in part to the excercises (&lt;code&gt;traverse&lt;/code&gt;) and the exam from the Summersemester 2022 (&lt;code&gt;print&lt;/code&gt;). It is meant to serve as a small guide to SML syntax and data types.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sml" data-lang="sml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;(* Helper function to recursively concatenate a list*)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt; list1 list2 = foldr (&lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; (head, tail) =&amp;gt; head::tail) list1 list2;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;(* Define the tree datatype *)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;datatype&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;tree&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;empty&lt;/span&gt; | &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; * &lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; tree * &lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; tree;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;(* Declare a tree for demonstration purporses *)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; t = node(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,node(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,node(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,empty,node(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,empty,empty)),empty),node(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,empty,empty));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;(* Recursively count nodes of a tree *)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt; (empty) = &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt; (node (_, t1, t2)) = &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; + nodes t1 + nodes t2;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;(* Recursively traverse a tree, appending values to the list *)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;traverse&lt;/span&gt; (empty) = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | &lt;span style="color:#a6e22e"&gt;traverse&lt;/span&gt; (node (v, t1, t2)) = concat (concat (traverse t2) (traverse t1)) [v];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;(* Recurse the tree, printing nodes in a human-readable form *)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;print&lt;/span&gt; (empty) = &lt;span style="color:#e6db74"&gt;&amp;#34;_&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | &lt;span style="color:#a6e22e"&gt;print&lt;/span&gt; (node (v, t1, t2)) = &lt;span style="color:#e6db74"&gt;&amp;#34;(&amp;#34;&lt;/span&gt; ^ (print t1) ^ &lt;span style="color:#e6db74"&gt;&amp;#34;, &amp;#34;&lt;/span&gt; ^ (Int.toString v) ^ &lt;span style="color:#e6db74"&gt;&amp;#34;, &amp;#34;&lt;/span&gt; ^ (print t2) ^ &lt;span style="color:#e6db74"&gt;&amp;#34;)&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;traverse t;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print t;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The outputs of &lt;code&gt;traverse t;&lt;/code&gt; and &lt;code&gt;print t;&lt;/code&gt; respectively yield&lt;/p&gt;</description></item><item><title>Types</title><link>https://johannes.arnold.onl/page/notes/compiler-theory/types/</link><pubDate>Fri, 12 May 2023 00:00:00 +0000</pubDate><guid>https://johannes.arnold.onl/page/notes/compiler-theory/types/</guid><description>&lt;p&gt;Type systems help to apply and check for a syntactically consistent interpretation. They rule out programs that do not make any sense and allow certain operations while disallowing others.&lt;/p&gt;
&lt;h1 id="typing-relations" class="relative group"&gt;Typing Relations &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#typing-relations" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;The Typing Relation for arithmetic expressions is the smallest binary relation between terms and types satisfying all instances of the typing rules.&lt;/p&gt;
&lt;p&gt;A term \(t\) is &lt;strong&gt;typable&lt;/strong&gt; or &lt;strong&gt;well-typed&lt;/strong&gt; if there is some \(T\) such that \(t:T\).&lt;/p&gt;</description></item><item><title>Lambda Calculus</title><link>https://johannes.arnold.onl/page/notes/compiler-theory/lambdacalculus/</link><pubDate>Thu, 27 Apr 2023 00:00:00 +0000</pubDate><guid>https://johannes.arnold.onl/page/notes/compiler-theory/lambdacalculus/</guid><description>&lt;p&gt;Formal system introduced by Alonzo Church in 1930. One of the two approaches that lead to the notion of an Algorithm, the other being the Turing Machine.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Variable&lt;/dt&gt;
&lt;dd&gt;\(x\)&lt;/dd&gt;
&lt;dt&gt;Abstraction&lt;/dt&gt;
&lt;dd&gt;\(\lambda x . t\)&lt;/dd&gt;
&lt;dt&gt;Application&lt;/dt&gt;
&lt;dd&gt;\(t~t\)&lt;/dd&gt;
&lt;/dl&gt;
&lt;h1 id="currying" class="relative group"&gt;Currying &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#currying" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Lambda calculus permits only functions with a single argument.
\begin{align}
f:(X \times Y) \mapsto Z &amp;amp;&amp;amp; \text{curry}(f): X \mapsto Y \mapsto Z
\end{align}
Currying &lt;strong&gt;allows for Partial Application,&lt;/strong&gt; which fixes the number of arguments of a function, yielding a new function with smaller arity. Example for \(f(x, y) = \lambda x . \lambda y . (x * y)\):
\begin{align}
(\lambda x . \lambda y . (x * y))~2 &amp;amp;= \lambda y . (2 * y)
\end{align}
By only applying one argument, to a multiplication function, you receive a function that performs a constant operation on one argument.&lt;/p&gt;</description></item></channel></rss>