Why Rust Isn’t Ready for Engineering Software (Yet)
I wanted to develop a feature-rich, open-source CAE application in Rust. Easy memory safety and performance a tier above garbage-collected languages? Sign me up. Finally, a way to escape the data races and the tyranny of C++ compilers that think "segmentation fault"
is an acceptable personality trait.
I was ready to go all in — maybe even color my hair blue before writing my first lines in Rust. Rust seemed like my ticket to a modern, sane, productive development experience. Sure, I expected a few bumps along the way, but hey, Rust is supposed to make large projects easy, right? No big deal.
Then I started looking for Rust packages and libraries to actually build my software… and the cracks appeared fast. The options were mostly half-finished "work in progress"
crates or abandoned passion projects that haven’t seen a commit since the end of COVID-19 lock down.
Need a CAD kernel like OpenCascade? Nope. A meshing library like Gmsh? Try again. A robust GUI toolkit like Qt? Not unless you’re ready to wrap it yourself and pray it compiles.
And then there’s integration with C++ or Fortran code — the stuff where decades of CAE development already live. What’s the point of jumping through hoops for Rust’s memory safety if you have to bind it to massive, battle-scarred codebases that don’t provide that safety?
It didn’t take long to realize my “options” in Rust were:
- Write every single library I need from scratch.
- Use
unsafe
bindings to the C++/Fortran libraries — completely defeating the whole point of using Rust in the first place.
So instead of reinventing the wheel, I grabbed my trusty C++ toolkit and got back to writing actual code — because at least there, I can get work done without pretending my build system is a research project.
Here’s why.
1. Interoperability With C++ and Fortran is a Minefield
Rust’s FFI
works fine for plain C, but CAE libraries don’t live in a happy little C-shaped world. They live in C++ (templates, overloaded operators, inheritance) or Fortran (fresh hell arrays, anyone?).
Wrapping these in Rust means:
- Writing hundreds of lines of
unsafe
glue code - Losing half the API because the C++ parts are too complex to map
- Debugging segfaults that magically ignore Rust’s advertised memory safety
Examples:
- Wrapping OpenCascade for geometry modeling? Weeks of header wrangling.
- Calling PETSc or Trilinos from Rust? Back to the C API — less functionality, worse performance.
At that point, why not just write in C++ or Fortran?
2. MPI and HPC Support: Still Stuck in Hobby Mode
Most CAE solvers run on clusters — MPI isn’t optional. Rust has rsmpi, a thin wrapper over the C API, but:
- No idiomatic integration with Rust’s
async
model - Spotty support for MPI-3 features like remote memory access and non-blocking collectives
- Minimal adoption on vendor-tuned compilers (Intel MPI, Cray MPI)
Technically possible, practically painful.
3. GPU Acceleration: Brace Yourself
Modern CAE codes rely heavily on GPUs. CUDA, OpenGL, DirectX, Vulkan — GPU integration in Rust is still “aspirational.”
- CUDA bindings (rust-cuda) are incomplete or lag NVIDIA releases
- HIP and SYCL support? Almost nonexistent
- Vendor math libraries like cuBLAS, cuSPARSE, cuFFT have no idiomatic Rust wrappers
You can write GPU kernels in Rust — if you want to reinvent half the CUDA driver API in unsafe
. At that point, C++ is simpler.
4. Missing Mature Geometry, Meshing, and Visualization Libraries
CAE software is geometry and meshes. Rust’s ecosystem is sparse:
- No Rust-native equivalents to OpenCascade, Gmsh, or CGAL
- No production-ready bindings for VTK or ParaView
Want cutting planes, mesh overlays, stress maps? Either code them yourself in wgpu or wrap a C++ library — back in unsafe
land.
5. Large-Scale Build & Tooling Woes
CAE projects combine Fortran solvers, C++ kernels, and potentially Rust. Cargo
is great, but:
- Poor integration with CMake, Bazel, and other multi-language systems
- Debugging mixed Rust/C++ stacks is awkward with gdb or lldb
- Profiling tools like Intel VTune or Arm MAP have weaker Rust support
When your workflow is “fight the build system” instead of “write features,” productivity suffers.
6. Long-Term Stability and Industry Risk
CAE software often lasts 10–20 years. Rust’s ecosystem moves fast:
- Crates can break between releases
- No guarantee today’s “best” bindings will exist in five years
Conservative CAE companies avoid constant rewrites. Stability matters more than novelty.
7. A Hopeful Future
Rust is growing. Rust still doesn’t have the production ready plug and play engineering libraries but it has seen rapid development in tools for building those libraries such as:
- Graphics: wgpu, ash, vulkano
- Linear algebra: nalgebra, ndarray
- Parallel computation: rayon, crossbeam
- C API interop: bindgen, cxx
The community is actively building engineering capabilities — much like Python’s growth in scientific computing. Python succeeded for ease of use but faltered in runtime performance, which is why C++ and Fortran still dominate CAE backends but Python has taken over a large chunk of the less intensive frontends and data processing APIs. But Rust could challenge or even upend C++ and Fortran in the coming decades thanks to its combination of safety and high performance.
There are still some promising Rust projects that I am watching out for:
Challenges remain in engineering-focused meshing libraries and Rust-native MPI support.
Conclusion
Rust is exciting, safe, modern, and fun. But for CAE — where performance, interoperability, and mature ecosystems matter — it’s not ready.
Today, serious CAE projects thrive in C++/Fortran. Rust may eventually become a viable alternative, but for now, the tooling and ecosystem aren’t there yet.
Enjoy Reading This Article?
Here are some more articles you might like to read next: