[HN Gopher] C2rust: Transpile C to Rust ___________________________________________________________________ C2rust: Transpile C to Rust Author : juancampa Score : 33 points Date : 2022-02-01 21:06 UTC (1 hours ago) (HTM) web link (c2rust.com) (TXT) w3m dump (c2rust.com) | acomjean wrote: | We used to call fortran transpired into ada: adatran. | | Adatran was terrible. Hard to impossible to edit if something | needed fixing. Used none of the features that made Ada a decent | language. The very limited code they did this to did work | however. This was a huge project and included C and ada code. | | What do we call C code transpiled to Rust. Crust? | pcwalton wrote: | > What do we call C code transpiled to Rust. Crust? | | Fun fact: in ancient Rust, what we now call extern "C" | functions were called "crust" functions, pronounced like the | word. | detaro wrote: | Have their been any large projects that used this as a starting | point for a port? I would be curious how it works out in | practice. | steveklabnik wrote: | What I am most curious about is the final paragraph of | https://github.com/immunant/c2rust#acknowledgements-and-lice... | | There was a while there where they were trying to test this out | on the cvs codebase, IIRC. It's a good candidate: upstream | doesn't exactly move quickly, but is very much a real-world | codebase, still in use. | neopallium wrote: | I just started using c2rust on openjpeg [0] (jpeg 2000 | encoder/decoder) today and already have it working as a drop in | replacement for the C libopenjp2.so on Linux. Still has a lot | of unsafe code, but it does work. Which will be a big help with | testing during refactoring to idiomatic safe Rust. | | c2rust also has a refactor command that helps with refactoring | the generated Rust code. | | [0] https://github.com/Neopallium/openjpeg/tree/c2rust | pornel wrote: | I've used my homebrew c2rust converter[1] to translate lodepng | and pngquant[2] libraries to Rust. My two key takeaways are: | | Good test coverage is _essential_ for this. Count how many bugs | you 've written when you were writing this code for the first | time. Even if your bug-rate is 99% better during the rewrite, | that may still be a significant number. Fine-grained tests | aren't necessary, but end-to-end tests that touch every feature | are crucial to catch regressions. | | Once the rough conversion is done, it is necessary to refactor | the code to take advantage of Rust's idioms to get safety | benefits. Just 1:1 conversion is underwhelming, and it feels | like replacing gcc with rustc. I did not realize just how | recklessly pointer-heavy C tends to be until I saw it through | Rusty lens. | | The lodepng conversion was "meh". It's a good C code, but its | structure was very different from what you'd do in Rust (e.g. | Rust prefers generics over pointer casts, iterators over | indexing or pointer arithmetic, has interfaces for steaming | processing that C lacks). I don't know how far I can refactor | the code to Rusty idioms and still call it lodepng :) | | OTOH the pngquant codebase was mine, and I'm happy with the | results. When converting I took advantage of Rust idioms, and | the Rust version is nicer to maintain and even a bit faster. | | [1]: https://lib.rs/crates/citrus [2]: | https://pngquant.org/rust.html | billconan wrote: | But what about borrow checking? Will the transpiled code be | runnable. | [deleted] | qw3rty01 wrote: | it doesn't convert pointers to references, it just uses | pointers, so the borrow checker isn't invoked. | TheMagicHorsey wrote: | For the non-Rust programmers here, does that mean you don't | get Rust's memory safety with this transpiler? | [deleted] | qw3rty01 wrote: | Correct, although it looks like converting some parts to | safe code may be a future goal | steveklabnik wrote: | What they've stated previously is that they plan to go | with the approach of "compile C to unsafe Rust" and | "compile unsafe Rust to safe Rust" as two separate things | that could be chained together. I don't remember if it's | meant to be literally another tool or just the general | approach, but seems very interesting and sensible to me! | necubi wrote: | That's correct. There's no way to translate arbitrary C | to memory safe code. | jacquesm wrote: | If you could, you wouldn't need Rust in the first place. | estebank wrote: | The transpiled code will use pointers, it will not transform | C-isms that could map to Rust-isms (like borrowing instead of | pointers, or iterators instead of pointer arithmetic). This | is meant to be only the first step in a Rust refactor. | | https://galois.com/blog/2018/08/c2rust/ | | https://github.com/immunant/c2rust/wiki/Known-Limitations- | of... ___________________________________________________________________ (page generated 2022-02-01 23:00 UTC)