Slightly off topic, but I was watching Bryan Lunduke make fun of the
beta COSMIC desktop environment, which is written in memory safe rust.
However, it seems to be using a lot of memory.
...
There seems to be some interesting (though no code yet) of Hurd
developers using Rust.
...
... Or is rust still not quite there yet?
I happened to have contributed to Neovide (a cross-platform GUI of
Neovim),
which is written with Rust.[1] The patch is to add Metal (Apple's D3D)
GPU-accelerate renderer on macOS.
Here are my humble opinions on memory-safe languages like Rust. The
ultimate rule
is nothing can be *unconditionally* memory-safe.
1. Rust has some conditions to be memory-safe, that is you never use
`unsafe`.
However, there are two common situations where `unsafe` is required.
- When you have to interact with C library, aka, some kind of fii,
you must use `unsafe`, which, of course, can never be avoided in
low-level
development. The reason of the requirement of `unsafe` here is Rust
can't
promise memory-safe of the external C library.
In my case, I have to interact with Apple's GUI and Metal api,
which is
actually in objective-c. So I must use `unsafe`.
- When something can not be expressed in Rust memory-safe semantics.
One
important case of this is you need to use "partial ownership",
which is not
allowed in `safe` Rust. Many std structs use this a lot internally
actually.
One typical case is to split a slice into 2 slices, via
`split_at`[2]. It
will finally call `split_at_unchecked`[3], which is `unsafe`. The
reason is
apparent. You need "partial" of the slice.
The Rust has already written an offical book for the `unsafe`
problem, which
is an essential material of Rust.[4]
2. Even if a programming language is memory-safe for its special
mechanism, like
Java, which has a JVM to do garbage collection, or Rust, which is
memory-
safe via its semantics, there is always one kind of "memory leak".
It's
a super simple logic.
If you create a global variable, it has a list, and you add a lot of
elements
to it, but you forget to delete them when you no longer use them,
they are
actually leaked. No language, whether has a VM or some other
mechanisms, can stop
you from this unless global variable is not used.
So how Rust helps us? The reason is actually simple, too. If you don't
interact
with low-level things, and what you need to do does not escape the range
of Rust
semantics, aka, you don't have to `unsafe` yourself, you can definitely
use Rust.
Without `unsafe`, its semantics will ensure you stay memory-safe, which
is
regulated by its compiler and the ownership checker in it. Std already
wraps most
`unsafe` things for you, so you don't have to `unsafe` yourself for
these fundamental
constructs. The typical use cases are, Web Service, GUI application,
even Web
Browser Engine[5], etc, with the help of various packages made by
community
contributors of Rust.
Oh, a lot of words. Please forgive me for being unable to control my
mouth on
this topic.
Hope it can help you a little! Feel free to discuss with me and point
out my
mistakes! :)
BTW, maybe I can put this in my blog later, hahaha!
[1] https://github.com/neovide/neovide/pull/2461
[2] https://doc.rust-lang.org/std/primitive.slice.html#method.split_at
[3]
https://doc.rust-lang.org/std/primitive.slice.html#method.split_at_unchecked
[4] https://doc.rust-lang.org/nomicon/index.html
[5] https://servo.org/
--
Yuqian Yang <crup...@crupest.life>