Remix.run Logo
viktorcode 12 hours ago

> We previously explored Swift, but the C++ interop never quite got there

But Rust doesn't have C++ interop at all?

nicoburns 12 hours ago | parent | next [-]

You can do it via the C ABI, and use opaque pointers to represent higher-level Rust/C++ concepts if you want to.

Firefox is a mixed C++ / Rust codebase with a relatively close coupling between Rust and C++ components in places (layout/dom/script are in C++ while style is in Rust, and a mix of WebRender (Rust) and Skia (C++) are used for rendering with C++ glue code)

wavemode 9 hours ago | parent [-]

> You can do it via the C ABI, and use opaque pointers to represent higher-level Rust/C++ concepts

Yeah but, you can do the same in Swift

nicoburns 9 hours ago | parent [-]

My understanding from a brief read of the Swift issue is that they kept running into bugs in the Swift compiler which, in practice, prevented them from doing the things that they ought to be do in theory. This went on for long enough, that they got fed up and abandoned Swift.

The Rust compiler is incredibly solid (across all target platforms), and while it's C/C++ interop is relatively simplistic, what does exist is extensively battle tested in production codebases.

tonyedgecombe 12 hours ago | parent | prev | next [-]

>But Rust doesn't have C++ interop at all?

It also doesn't have the disadvantages of Swift. Once the promise of Swift/C++ interop is gone there isn't enough left to recommend it.

skavi 11 hours ago | parent [-]

I’m curious what issues people were running into with Swift’s built in C++ interop? I haven’t had the chance to use it myself, but it seemed reasonable to me at a surface level.

stratos123 11 hours ago | parent [-]

There's a list of unsolved problems in this Ladybird issue, now closed because they dropped Swift: https://github.com/LadybirdBrowser/ladybird/issues/933

for example: "Swift fails to import clang modules with #include <math.h> with libstdc++-15 installed. Workaround: None (!!)"

woadwarrior01 11 hours ago | parent | prev | next [-]

Yeah, that part doesn't make much sense to me. IMO, Swift has reasonably good C++ interop[1] and Swift's C interop has also significantly improved[2] since Swift 6.2.

[1]: https://www.swift.org/documentation/cxx-interop/

[2]: https://www.swift.org/blog/improving-usability-of-c-librarie...

azornathogron 11 hours ago | parent | prev | next [-]

It may have in the future. Crubit is one effort in this direction: https://crubit.rs/

matthewkosarek 11 hours ago | parent | prev | next [-]

There is also cxx.rs, which is quite nice, albeit you have to struggle sending `std` types back and forth a bit

nicoburns 10 hours ago | parent [-]

> albeit you have to struggle sending `std` types back and forth a bit

Firefox solves this partly by not using `std` types.

For example, https://github.com/mozilla/thin-vec exists in large part because it's compatible with Firefox's existing C++ Vec/Array implementation (with the bonus that it's only 8 bytes on the stack compared to 24 for the std Vec).

nickorlow 10 hours ago | parent [-]

Luckily, ladybird also does not use `std` types

the_mitsuhiko 9 hours ago | parent | prev | next [-]

Rust has cxx which I would argue is "good enough" for most use cases. At least all C++ use cases I have. Not perfect, but pretty damn reasonable.

k33n 12 hours ago | parent | prev [-]

It's technically Rust -> C -> C++ as it stands right now