<feed xmlns="http://www.w3.org/2005/Atom" xmlns:hypergraph="https://hypergraph.network/xmlns">
	<title>Blog</title>
	<id>https://joonastuomi.fi/blog</id>
	<link rel="alternate" href="https://joonastuomi.fi/blog" type="text/html"></link>
	<link rel="self" href="https://joonastuomi.fi/blogatom.xml" type="application/atom+xml"></link>
	<entry>
		<title>Why I prefer Rust</title>
		<id>https://joonastuomi.fi/blog/prefer-rust</id>
		<link rel="alternate" href="https://joonastuomi.fi/blog/prefer-rust" type="text/html"></link>
		<link rel="via" href="https://joonastuomi.fi/blog/prefer-rust" type="text/html"></link>
		<link rel="related" href="https://joonastuomi.fi/blog/prefer-rust" type="text/html"></link>
		<published>2026-05-23T15:16:00+03:00</published>
		<updated>2026-05-23T15:16:00+03:00</updated>
		<author>
			<name>Joonas Tuomi</name>
			<uri>https://joonastuomi.fi/</uri>
			<hypergraph:favicon>https://joonastuomi.fi/favicon.png</hypergraph:favicon>
		</author>
		<summary type="html">&lt;p&gt;Having spent substantial time writing code in various environments, I&#39;ve used everything from systems languages like C and C++ to modern languages like Go and TypeScript. Each has its strengths, but Rust has become my language of choice. Here are the core reasons why I prefer Rust, contrasting it with my experiences in other languages.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Expression-Based Semicolons&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;In C, a semicolon simply terminates a statement. In Rust, however, the presence or absence of a semicolon has a semantic meaning. Because Rust is an expression-oriented language, blocks evaluate to their last expression. By omitting the semicolon from the final line of a block or function, it implicitly returns that value. This removes the need for typing the return keyword in almost all standard function ends, making the code cleaner and emphasizing data flow:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt; &lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// No semicolon, implicit return!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Everything is an Expression&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Go lacks a ternary operator (like a ? b : c), requiring verbose, multi-line if/else statements even for simple assignments. While some languages abuse ternaries to the point of unreadability, Rust solves this beautifully: everything is an expression. In Rust, you don&#39;t need a ternary operator because if/else blocks and match statements return values directly. This keeps syntax clean and readable without the boilerplate of pre-declaring mutable variables:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;authenticated&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Welcome&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Access Denied&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Result Types and the ? Operator&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;C++ relies heavily on exceptions and try/catch blocks, which can make control flow hard to follow and introduce overhead. Rust takes a completely different path with its monadic Result&amp;lt;T, E&amp;gt; and Option&lt;T&gt; types. Rather than throwing exceptions, errors are just normal values returned by functions. Combining this with the ? operator allows you to bubble up errors in a single character, providing error handling that is both explicit and incredibly clean, without the cognitive load of exception tracking:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fetch_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt; &lt;span class=&#34;nb&#34;&gt;Result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;make_request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//Returns an error incase of failure&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;Truly Statically Typed&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;TypeScript is a great developer experience, but it is ultimately a wrapper around JavaScript. Its types are erased at compile time, meaning they provide no runtime safety. Moreover, the ease of escaping to any or dealing with loose typing can lead to hidden runtime bugs. Rust is a truly statically typed language. Its types exist at compile time, are strictly enforced at runtime, and compiled directly to machine code (using monomorphization). When a compiler guarantees that a value is of a certain type, you can be 100% confident it holds true at runtime.&lt;/p&gt;&#xA;&lt;p&gt;Ultimately, &lt;a href=&#34;https://rust-lang.org&#34;&gt;Rust&lt;/a&gt; feels like a language where the designers looked at the ergonomics of high-level languages and the control of low-level systems languages, and fused them into a coherent, safe, and expressive toolset.&lt;/p&gt;&#xA;&lt;!-- Links --&gt;&#xA;</summary>
		<content type="html">&lt;p&gt;Having spent substantial time writing code in various environments, I&#39;ve used everything from systems languages like C and C++ to modern languages like Go and TypeScript. Each has its strengths, but Rust has become my language of choice. Here are the core reasons why I prefer Rust, contrasting it with my experiences in other languages.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Expression-Based Semicolons&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;In C, a semicolon simply terminates a statement. In Rust, however, the presence or absence of a semicolon has a semantic meaning. Because Rust is an expression-oriented language, blocks evaluate to their last expression. By omitting the semicolon from the final line of a block or function, it implicitly returns that value. This removes the need for typing the return keyword in almost all standard function ends, making the code cleaner and emphasizing data flow:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt; &lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// No semicolon, implicit return!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Everything is an Expression&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Go lacks a ternary operator (like a ? b : c), requiring verbose, multi-line if/else statements even for simple assignments. While some languages abuse ternaries to the point of unreadability, Rust solves this beautifully: everything is an expression. In Rust, you don&#39;t need a ternary operator because if/else blocks and match statements return values directly. This keeps syntax clean and readable without the boilerplate of pre-declaring mutable variables:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;authenticated&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Welcome&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Access Denied&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Result Types and the ? Operator&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;C++ relies heavily on exceptions and try/catch blocks, which can make control flow hard to follow and introduce overhead. Rust takes a completely different path with its monadic Result&amp;lt;T, E&amp;gt; and Option&lt;T&gt; types. Rather than throwing exceptions, errors are just normal values returned by functions. Combining this with the ? operator allows you to bubble up errors in a single character, providing error handling that is both explicit and incredibly clean, without the cognitive load of exception tracking:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fetch_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt; &lt;span class=&#34;nb&#34;&gt;Result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;make_request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//Returns an error incase of failure&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;Truly Statically Typed&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;TypeScript is a great developer experience, but it is ultimately a wrapper around JavaScript. Its types are erased at compile time, meaning they provide no runtime safety. Moreover, the ease of escaping to any or dealing with loose typing can lead to hidden runtime bugs. Rust is a truly statically typed language. Its types exist at compile time, are strictly enforced at runtime, and compiled directly to machine code (using monomorphization). When a compiler guarantees that a value is of a certain type, you can be 100% confident it holds true at runtime.&lt;/p&gt;&#xA;&lt;p&gt;Ultimately, &lt;a href=&#34;https://rust-lang.org&#34;&gt;Rust&lt;/a&gt; feels like a language where the designers looked at the ergonomics of high-level languages and the control of low-level systems languages, and fused them into a coherent, safe, and expressive toolset.&lt;/p&gt;&#xA;&lt;!-- Links --&gt;&#xA;</content>
	</entry>
	<entry>
		<title>Moving blog to HyperTemplate</title>
		<id>https://joonastuomi.fi/blog/first-post</id>
		<link rel="alternate" href="https://joonastuomi.fi/blog/first-post" type="text/html"></link>
		<link rel="via" href="https://joonastuomi.fi/blog/first-post" type="text/html"></link>
		<link rel="related" href="https://joonastuomi.fi/blog/first-post" type="text/html"></link>
		<published>2025-05-23T15:00:00-07:00</published>
		<updated>2025-05-23T15:00:00-07:00</updated>
		<author>
			<name>Joonas Tuomi</name>
			<uri>https://joonastuomi.fi/</uri>
			<hypergraph:favicon>https://joonastuomi.fi/favicon.png</hypergraph:favicon>
		</author>
		<summary type="html">&lt;p&gt;This incarnation of my blog uses &lt;a href=&#34;https://preview.hypertemplates.net&#34;&gt;HyperTemplates&lt;/a&gt;.&lt;/p&gt;&#xA;</summary>
		<content type="html">&lt;p&gt;This incarnation of my blog uses &lt;a href=&#34;https://preview.hypertemplates.net&#34;&gt;HyperTemplates&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;!--more--&gt;&#xA;&lt;p&gt;It really seems straight enough to understand for someone like me coming from HTLM3 and a much more simplistic time in web architecture. Yet it utilizes most of the new modern things. Learning most of it realistically takes only an evening.&lt;/p&gt;&#xA;&lt;!-- Links --&gt;&#xA;</content>
	</entry>
	<updated>2026-05-23T15:16:00+03:00</updated>
</feed>