2025-10-13
:: Jimmy Hartzell
#programming
#computers
#rust
#traits
I stumbled across a … bug(?) … a limitation(?) … an
issue(!) with the Rust
compiler. Fortunately, I was able to find out what was going on in the
Rust programming language forum.
I thought this issue was interesting enough and subtle enough to try
to explain to my blog audience.
To be clear, this is an issue. This is a limitation in the Rust trait solver.
The maintainers of the Rust compiler didn’t make Rust work this way for a
principled reason. There’s no particularly strong theoretical reason Rust has to
have this limitation.
2025-07-19
:: Jimmy Hartzell
#programming
#computers
#Rust
#OOP
#Beyond OOP
#Rust Features
Programming language design, like API design, and computer UX design
(especially for technical tools like build systems and admin systems) is a
difficult form of engineering, bridging computer science and cognitive
science. Sometimes, it’s more art than science, because building systems
that other technical workers will use comes with nearly infinite trade-offs
and judgment calls.
The effort and quality matter too. Different programming languages have
different strengths and weaknesses. Some programming languages are hard to
use correctly, like C++. Some are easy to write, but hard to then read and
maintain, like Perl. Some programming languages are great for one-off
scripts where you’re the only user, like Python, and others enforce that you
follow reliable engineering principles, like Rust.
2024-02-05
:: Jimmy Hartzell
#programming
#computers
#Rust
#C++
#Java
#Haskell
Polymorphism is a powerful programming language feature. In polymorphism,
we have generic functions that don’t know exactly what type of data
they will be operating on. Often, the data types won’t even all have been
designed yet when the generic function is written. The generic function
provides the general outline of the work, but the details of some parts of
the work, some specific operations, must be tailored to the specific
types being used. The generic code needs some way of accessing these
specific operations, and the users of the generic code need some way
of specifying them.
2023-12-07
:: Jimmy Hartzell
#programming
#computers
#Rust
#OOP
#Beyond OOP
In this next post of my series explaining how Rust is better
off without Object-Oriented Programming, I discuss
the last and (in my opinion) the weirdest of OOP’s 3 traditional pillars.
It’s not encapsulation, a great idea which
exists in some form in every modern programming language, just OOP does
it oddly. It’s not polymorphism, also a
great idea that OOP puts too many restrictions on, and that Rust
borrows a better design for from Haskell (with syntax from C++).
2023-10-19
:: Jimmy Hartzell
#programming
#computers
#endianness
#C
#C++
#Rust
Endianness is a long-standing headache for many a computer science
student, and a thorn in the side of practitioners. I have already
written some about it in a different
context. Today, I’d like to talk more about how to deal with endianness
in programming languages and APIs, especially how to deal with it
in a principled, type-safe way.
Before we get to that, I want to make some preliminary clarifications
about endianness, which will help inform our API design.
2023-06-24
:: Jimmy Hartzell
#programming
#computers
#Rust
#walkthrough
Update: Arvid Norlander has
gone through the trouble of refactoring this code into a
crate and publishing it. Thank
you, Arvid!
Rust’s BTreeMap
and corresponding BTreeSet
are excellent,
B-tree-based sorted map and key types. The map implements
the ergonomic entry API, more flexible
than other map APIs, made possible by the borrow checker.
They are implemented with the more performant but more gnarly
B-Tree data structure, rather than
the more common AVL trees or
red-black trees.
All in all, they are an excellent piece of engineering, and an excellent
standard library feature.
2023-05-24
:: Jimmy Hartzell
#programming
#computers
#Rust vs C++
#Rust
I am no stranger to programming language controversy. I have a whole
category on my blog dedicated to explaining why Rust
is better than C++, and I’ve taken the extra step of organizing it into
an MDBook for everyone’s convenience. Most of them have
been argued about on Reddit, and a few even on Hacker News. Every single
one of them have been subject to critique, and in the process, I’ve been
exposed to every corner, every trope and tone and approach of programming
language debate religious war, from the polite and well-considered
to the tiresome and repetitive all the way to the rude and non-sensical.
2023-04-24
:: Jimmy Hartzell
#programming
#computers
#Rust
#Rust vs C++
Here it is, the Rust vs C++ mdbook.
I’ve wanted for a while to re-organize some of the
content on my blog into gardens. I got
the idea from the blog post “The Garden and the Stream: A
Technopastoral”.
Basically, some content is ill-suited to date-based, time-organized
systems like blogs. In fact, most of my content remains valid over a
long period of time, rather than participating in conversation (with
some exceptions), but
rapidly becomes less discoverable after I’ve written it, as it is
buried by newer posts.
2023-04-06
:: Jimmy Hartzell
#programming
#computers
#Rust vs C++
#Rust
#C++
I know I set the goal for myself of doing less
polemics and more education, but here I return for another Rust vs
C++ post. I did say I doubted I would be able to
get fully away from polemics, however, and I genuinely think this post
will help contextualize the general Rust vs. C++ debate and contribute
to the conversation. Besides, most of the outlining and thinking for
this post – which is the majority of the work of writing – was already
done when I set that goal. It also serves as a bit of conceptual glue,
structuring and contextualizing many of my existing posts. So please
bear with me as I say more on the topic of Rust and C++.
2023-03-28
:: John Ericson & Jimmy Hartzell
#programming
#Rust
#computers
#Beyond OOP
Does the choice of programming language matter?
For years, many programmers would answer “no”. There was an “OOP
consensus” across languages as different as C++ and Python. Choice
of programming language was just a matter of which syntax to use to
express the same OOP patterns, or what libraries were needed for the
application. Language features like type checking or closures were seen
as incidental, mere curiosities or distractions.
To the extent there was a spectrum of opinions, it was between OOP
denizens and those that didn’t really think software architecture mattered
at all — an feeble attempt of corporatization against true programmers
and their free-spirited ways. The office park versus the squatters. That’s
how we got the wave of so-called “scripting languages”.
2023-03-24
:: Jimmy Hartzell
#programming
#computers
#Rust
#Rust Tidbits
This is a collection of little Rust thoughts that weren’t complicated
enough for a full post. I saved them up until I had a few, and now I’m
posting the collection. I plan on continuing to do this again for
such little thoughts, thus the #1 in the title.
serde
flattening
What if you want to read a JSON file, process some of the fields, and
write it back out, without changing the other fields? Can you still use
serde
? Won’t it only keep fields that you know about in your data
structure?
2023-03-21
:: Jimmy Hartzell
#programming
#logging
#Rust
#computers
Intro programming classes will nag you to do all sorts of
programming chores: make sure your code actually compiles,
write unit tests, write comments, split the code into functions
(though sometimes the commenting and factoring advice is
bad). Today, however,
I want to talk about one little chore, one particular little habit, that
is just as essential as all of those things, but rarely covered in the
CS100 lectures or grading rubrics: logging.
2023-02-07
:: Jimmy Hartzell
#programming
#Rust
#OOP
#Beyond OOP
#computers
In this post, I continue my series on how Rust
differs from the traditional object-oriented programming paradigm by
discussing the second of the three traditional pillars of OOP:
polymorphism.
Polymorphism is an especially big topic in object-oriented programming,
perhaps the most important of its three pillars. Several books could be
(and have been) written on what polymorphism is, how various programming
languages have implemented it (both within the OOP world and outside of it
– yes, polymorphism exists outside of OOP), how to use it effectively,
and when not to use it. Books could be written on how to use the Rust
version of it alone.
2023-01-30
:: Jimmy Hartzell
#programming
#C++
#Rust
#Rust vs C++
#essays
#computers
The NSA recently published a Cybersecurity Information
Sheet
about the importance of memory safety, where they recommended
moving from memory-unsafe programming languages (like C and
C++) to memory-safe ones (like Rust). Dr. Bjarne Stroustrup, the
original creator of C++, has made some
waves
with his
response.
To be honest, I was disappointed. As a current die-hard Rustacean
and former die-hard C++ programmer, I have thought (and
blogged) quite a bit about the topic of Rust vs
C++. Unfortunately, I feel that in spite of the exhortation in his title
to “think seriously about safety,” Dr. Stroustrup was not in fact thinking
seriously himself. Instead of engaging conceptually with the article,
he seems to have reflexively thrown together some talking points –
some of them very stale – not realizing that they mostly are not even
relevant to the NSA’s Cybersecurity Information Sheet, let alone a
thoughtful rebuttal of it.
2023-01-11
:: Jimmy Hartzell
#programming
#Rust
#OOP
#Beyond OOP
#computers
Rust doesn’t support default parameters in function signatures.
And unlike in many languages, there’s no way to simulate them
with function overloading. This is frustrating for many new Rustaceans
coming from other programming languages, so I want to explain
why this is actually a good thing, and how to use the Default
trait
and struct update
syntax
to achieve similar results.
Default parameters (and function overloading) are not part of
object-oriented programming, but they are a common feature of a lot
of the programming languages new Rustaceans are coming from. This
post therefore fits in some ways with my on-going series on how Rust
is not object-oriented, and so it is tagged with
that series. It was also inspired by Reddit responses to my first OOP
post.
2022-12-12
:: Jimmy Hartzell
#programming
#Rust
#OOP
#Beyond OOP
#computers
Rust is not an object oriented programming language.
Rust may look like an object-oriented programming language: Types can be
associated with “methods,” either “intrinsic” or through “traits.” Methods
can often be invoked with C++ or Java-style OOP syntax: map.insert(key, value)
or foo.clone()
. Just like in an OOP language, this syntax
involves a “receiver” argument placed before a .
in the caller,
called self
in the callee.
But make no mistake: Though it may borrow some of the trappings, some of
the terminology and syntax, Rust is not an object-oriented programming
language. There are three pillars of object-oriented programming:
encapsulation, polymorphism, and inheritance. Of these, Rust nixes
inheritance entirely, so it can never be a “true” object-oriented
programming language. But even for encapsulation and polymorphism,
Rust implements them differently than OOP languages do – which we
will go into in more detail later.
2022-10-11
:: Jimmy Hartzell
#programming
#Rust
#Rust vs C++
#C++
#computers
I don’t want you to think of me as a hater of C++. In spite of the fact
that I’ve been writing a Rust vs C++ blog series
in Rust’s favor (in which this post is the latest installment), I am very
aware that Rust as it exists would never have been possible without C++.
Like all new technology and science, Rust stands on the shoulders of
giants, and many of those giants contributed to C++.
2022-09-15
:: Jimmy Hartzell
#rust
#programming
#computers
I’m a Rust programmer and in general a fan of strong typing over dynamic
or duck typing. But a lot of advocacy for strong typing doesn’t actually
give examples of the bugs it can prevent, or it gives overly simplistic
examples that don’t really ring true to actual experience.
Today, I have a longer-form example of where static typing can help
prevent bugs before they happen.
The Problem
Imagine you have a process that receives messages and must respond
to them. In fact, imagine you have potentially many such processes,
and want to write a framework to handle it.
2022-08-13
:: Jimmy Hartzell
#programming
#Rust
I came across a programming problem recently where I wanted to use
dynamic polymorphism with serde
. This turned out to be much easier
than I expected, and I thought it was an interesting enough case
study to share, especially for people who are learning Rust.
A Brief Discussion of Polymorphism in Rust
As most of you will know, Rust’s system for polymorphism – trait
s
– supports both static and dynamic polymorphism, with a bias towards
static polymorphism.
2022-08-08
:: Jimmy Hartzell
#programming
#rust
#async
#computers
Using async
in Rust can lead to bad surprises. I recently came across
a particularly gnarly one, and I thought it was interesting enough to
share a little discussion. I think that we are too used to the burden
of separating async
from blocking being on the programmer, and
Rust can and should do better, and so can operating system APIs,
especially in subtle situations like the one I describe here.
2022-07-14
:: Jimmy Hartzell
#programming
#Rust
#computers
UPDATE 2: I have made the title longer because people seem to be
insisting on misunderstanding me, giving examples where the only
reasonable thing to do is to escalate an Err
into a panic. Indeed,
such situations exist. I am not advocating for panic-free code.
I am advocating that expect
should be used for those functions,
and if a function is particularly prone to being called like that
(e.g. Mutex::lock
or regex compilation), there should be a panicking
version.
2022-06-16
:: Jimmy Hartzell
#programming
#computers
#Rust
It took me a long time to admit to myself that the venerable Unix
command line interface is stuck in the past and in need of a refresh,
but it was a formative moment in my development as a programmer when I
finally did. Coming from that perspective, I am very glad that there is a new
wave of enthusiasm (coming especially from the Rust community) to build
new tools that are fixing some of the problems with this very old and
established user-interface.
2022-06-06
:: Jon Gjengset
#Rust
#programming
#computers
Preface (by Jimmy Hartzell)
I am a huge fan of Jon Gjengset’s Rust for
Rustaceans,
an excellent book to bridge the gap between beginner
Rust programming skills and becoming a fully-functional
member of the Rust community. He’s famous for his YouTube
channel
as well; I’ve heard good things about it (watching video
instruction isn’t really my thing personally). I have also
greatly enjoyed his Twitter feed,
and especially have enjoyed the thread surrounding this
tweet:
2022-06-04
:: Jimmy Hartzell
#Rust
#programming
#computers
I just made a pull request
to reqwest. I thought this
particular one was interesting enough to be worth blogging about, so I am.
We know that many C++ family languages have a feature known as function
overloading, where two functions or methods can exist with the same name
but different argument types. It looks something like this:
void use_connector(ConnectorA conn) {
// IMPL
}
void use_connector(ConnectorB conn) {
// IMPL
}
The compiler then chooses which method to call, at compile-time, based
on the static type of the argument. In C++, this is part of compile-time
polymorphism, an easy “if
statement” in the template meta-language. In
Java and many other languages, it’s merely a convenience, for when an
ad-hoc group of types are possible for what an outsider sees as the
same operation, but which from the perspective of the library requires
different implementations.
2022-05-11
:: Jimmy Hartzell
#rust
#programming
#computers
#C++
#Rust vs C++
There’s more than one way to do it.
There should be one– and preferably only one –obvious way to do it.
When it comes to statically-typed systems programming languages, C++ is
the Perl, and Rust is the Python. In this post, the next installment of
my Rust vs C++ series, I will attempt to explain
why C++’s feature-set is problematic, and explain how Rust does better.
2022-03-12
:: Jimmy Hartzell
#programming
#Rust
#computers
#C++
#Rust vs C++
For my next entry in my series comparing Rust
to C++, I will be discussing a specific data structure API: the Rust
map API. Maps are often one of the more awkward parts of a collections
library, and the Rust map API is top-notch, especially its
entry API – I literally squealed
when I first learned about entries.
And as we shall discuss, this isn’t just because Rust made better choices
than other standard libraries when designing the maps API. Even more so,
it’s because the Rust programming language provides features that better
expresses the concepts involved in querying and mutating maps. Therefore,
this serves as a window into some deep differences between C++ and Rust
that show why Rust is better.
2022-02-25
:: Jimmy Hartzell
#Rust
#programming
#computers
What is “bad” Rust?
When we say that a snippet of code is “bad” Rust, it’s ambiguous.
We might on the one hand mean that it is “invalid” Rust, like the
following function (standing on its own in a module):
fn foo(bar: u32) -> u32 {
bar + baz // but baz is never declared...
}
In this situation, a rule of the programming language has been violated.
The compiler stops compiling and does not output a binary. In fact, it
has to stop compiling, because this is not a Rust program. It might resemble
one, but it in fact does not make any sense, because it is violating
one of the extra-syntactic constraints that text has to have to be a Rust
program.
2022-01-20
:: Jimmy Hartzell
#programming
#Rust
#Rust vs C++
#C++
#computers
For this next iteration in my series comparing
Rust to C++, I want to talk about something I’ve been avoiding so far:
memory safety. I’ve been avoiding this topic so far because I think it
is the most discussed difference between C++ and Rust, and therefore I
felt I’d have relatively little to add to the conversation. I’ve also
been avoiding it because I wanted to draw attention to all the other
little ways in which Rust is a better-designed programming language,
to say that even if you concede to the C++ people that Rust isn’t “truly
memory safe” or “memory safe enough,” Rust still wins.
2022-01-03
:: Jimmy Hartzell
#programming
#Rust
#computers
#async
Finally in 2019, Rust stabilized the async
feature, which supports
asynchronous operations in a way that doesn’t require multiple operating
system threads. This feature was so anticipated and hyped and in
demand that there was a website whose sole
purpose was to announce its stabilization.
async
was controversial from its inception; it’s still controversial
today; and in this post I am throwing my own 2 cents into this
controversy, in defense of the feature. I am only going to try to
counter one particular line of criticism here, and I don’t anticipate
I’ll cover all the nuance of it – this is a multifaceted issue, and
I have a day job. I am also going to assume for this
post that you have some understanding of how async
works, but if
you don’t, or just want a refresher I heartily recommend the Tokio
tutorial.
2021-11-21
:: Jimmy Hartzell
#programming
#Rust
#computers
I have been working on a serialization project recently that involves
endianness (also known as byte order), and it caused me to explore parts
of the Rust standard library that deals with endianness, and share my
thoughts about how endianness should be represented in a programming
language and its standard library, as I think this is also something
that Rust does better than C++, and also makes for a good case study to
talk about API design and polymorphism in Rust.
2021-11-03
:: Jimmy Hartzell
#programming
#Rust
#Rust vs C++
#C++
#computers
This post is part of my series
comparing C++ to Rust, which I introduced
with a discussion of C++ and Rust syntax. In
this post, I discuss move semantics. This post is framed around the
way moves are implemented in C++, and the fundamental problem with
that implementation, With that context, I shall then explain how Rust
implements the same feature. I know that move semantics in Rust are often
confusing to new Rustaceans – though not as confusing as move semantics
in C++ – and I think an exploration of how move semantics work in C++
can be helpful in understanding why Rust is designed the way it is,
and why Rust is a better alternative to C++.
2021-10-26
:: Jimmy Hartzell
#programming
#Rust
#Rust vs C++
#C++
#computers
This past May, I started a new job working in Rust. I was somewhat
skeptical of Rust for a while, but it turns out, it really is all it’s
cracked up to be. As a long-time C++ programmer, and C++ instructor,
I am convinced that Rust is better than C++ in all of C++’s application
space, that for any new programming project where C++ would make sense
as the programming language, Rust would make more sense.