-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Description
Over the past few years, Rust has proven to be an incredibly stable and accessible option for those wishing to write native extensions for Ruby. Rust is particularly well-suited for Ruby for a few reasons:
- Integration is straight-forward, since it is easy to expose a C compatible API using
extern C. - Rust is a bit more high-level, and approachable for Ruby developers since it prevents many of the classic C footguns (use-after-free, etc)
- The landing page can explain the benefits better than me. Check out https://www.rust-lang.org/ if you aren't fully convinced.
One of the biggest pain points of creating a Gem with a Rust extension is integrating with Gem::Ext::Builder. There are currently a couple of solutions, and the rely on the RakeBulider interface. I have personally used https://github.com/malept/thermite, which is a very good solution, but still requires and external dependency and does not integrate as well as native builders at the moment.
Currently, Gem::Ext::Builder supports four builder types: ExtConfBuilder, ConfigureBuilder, RakeBuilder, and CmakeBuilder. I propose we add a new builder, CargoBuilder, which will detect a Cargo.toml file and build the gem native extensions using cargo. This ease the burden of developing and publishing Rust extensions for Ruby users.
Potential Problems
-
If the user does not have cargo installed, building the extension will not work.
This is an issue, but is also an issue for theCmakeBuilder. One way to mitigate this issue would be to make it easier to build static binaries for Rust extensions. -
The lack of a standard ruby interface for Rust extensions might cause pain for developers.
Currently, many folks use https://github.com/steveklabnik/ruby-sys to interface with the C ruby API. It might make sense to make this "officially" supported at some point, but I don't think it has to be done immediately.
Please let me know your thoughts. I would be very excited to see Ruby take this step. I don't think I know enough about the Ruby extension building process or the Rust compilation process to actually implement this, so hopefully we could find a volunteer to step up. Thanks for reading :)
Notable Gems using Rust
- https://github.com/danielpclark/faster_path
- https://github.com/ianks/fast_woothee -- shameless plug
- https://github.com/tildeio/helix -- a framework for building Rust extensions
- https://github.com/danielpclark/rutie -- ruby/rust glue
- https://github.com/steveklabnik/ruby-sys -- low level bindings for ruby
- https://github.com/malept/rusty_blank -- String#blank? with rust