Confirmed users
523
edits
Nnethercote (talk | contribs) |
No edit summary |
||
(25 intermediate revisions by 8 users not shown) | |||
Line 22: | Line 22: | ||
* Nimbleness. The safety enables significant changes to existing code to be made quickly and with confidence. | * Nimbleness. The safety enables significant changes to existing code to be made quickly and with confidence. | ||
* Expressiveness. It is powerful and pleasant to use, particularly once a moderate level of experience has been reached. | * Expressiveness. It is powerful and pleasant to use, particularly once a moderate level of experience has been reached. | ||
* Excellent package management and an extensive ecosystem. | |||
* Excellent compiler error messages. | * Excellent compiler error messages. | ||
* Excellent documentation. | * Excellent documentation. | ||
Line 73: | Line 74: | ||
== Rust in Firefox == | == Rust in Firefox == | ||
Policy | |||
* [[Rust_Update_Policy_for_Firefox|Rust Update Policy for Firefox]] | * [[Rust_Update_Policy_for_Firefox|Rust Update Policy for Firefox]] | ||
* [https://docs. | |||
* [https:// | Rust in Firefox docs | ||
* The Rust Matrix | * [https://firefox-source-docs.mozilla.org/build/buildsystem/rust.html Adding Rust code] | ||
* [https://firefox-source-docs.mozilla.org/writing-rust-code/index.html Writing Rust code] | |||
* [https://firefox-source-docs.mozilla.org/testing-rust-code/index.html Testing & debugging Rust code] | |||
Getting extra help | |||
* The Rust channel on [https://wiki.mozilla.org/Matrix Mozilla's Matrix network] contains lots of people who know about both Rust and Gecko. | |||
* Are you new to Rust and not sure if your Rust code could be improved? The following people can review Rust patches for Firefox from an "is this good Rust code?" point of view. | * Are you new to Rust and not sure if your Rust code could be improved? The following people can review Rust patches for Firefox from an "is this good Rust code?" point of view. | ||
** Alexis Beingessner (:Gankra) | ** Alexis Beingessner (:Gankra) | ||
Line 87: | Line 92: | ||
** Cameron McCormack (:heycam) | ** Cameron McCormack (:heycam) | ||
= | = Rust Components = | ||
== Within Firefox == | |||
=== Statistics === | |||
* [https://docs.google.com/spreadsheets/d/1flUGg6Ut4bjtyWdyH_9emD9EAN01ljTAVft2S4Dq620/edit#gid=885787479 Lines of compiled Rust code shipped in Firefox (over time)] | |||
* [https://4e6.github.io/firefox-lang-stats/ Lines of Rust code in mozilla-central (current)] | |||
=== Shipped === | === Shipped === | ||
Line 116: | Line 110: | ||
* U2F HID backend: {{bug|1388843}} (shipped in Firefox 57) | * U2F HID backend: {{bug|1388843}} (shipped in Firefox 57) | ||
* libcubeb Audio backend for Linux (PulseAudio): {{bug|1346665}} (shipped in Firefox 59) | * libcubeb Audio backend for Linux (PulseAudio): {{bug|1346665}} (shipped in Firefox 59) | ||
* libcubeb Audio backend for macOS (CoreAudio): {{bug|1530713}} (shipped in Firefox 74) | |||
** '''Why Rust?''' Safer implementation avoids data racing by leveraging lifetime, variable mutability check and better mutex pattern. | |||
* XPIDL binding generator ({{bug|1293362}}) (shipped in Firefox 60) | * XPIDL binding generator ({{bug|1293362}}) (shipped in Firefox 60) | ||
* New prefs parser: {{bug|1423840}} (shipped in Firefox 60) | * New prefs parser: {{bug|1423840}} (shipped in Firefox 60) | ||
Line 124: | Line 120: | ||
* kvstore (key-value storage backed by LMDB): {{bug|1490496}} (shipped in Firefox 67) | * kvstore (key-value storage backed by LMDB): {{bug|1490496}} (shipped in Firefox 67) | ||
** '''Why Rust?''' The rkv crate provides a safe, ergonomic wrapper around LMDB, our choice for simple key-value storage in Firefox. kvstore wraps rkv in an asynchronous XPCOM API for JS and C++ callers. | ** '''Why Rust?''' The rkv crate provides a safe, ergonomic wrapper around LMDB, our choice for simple key-value storage in Firefox. kvstore wraps rkv in an asynchronous XPCOM API for JS and C++ callers. | ||
* Profiler symbolication: {{bug|1509549}} (shipped in Firefox 67) | |||
** '''Why Rust?''' Makes use of existing crates that handle object file parsing and symbol iteration. Easy to compile to WebAssembly. | |||
* XUL store, backed by rkv: {{bug|1460811}} (landed in Firefox 68, used in Nightly only) | * XUL store, backed by rkv: {{bug|1460811}} (landed in Firefox 68, used in Nightly only) | ||
* TLS certificate store, backed by rkv: {{bug|1429796}} (shipped in Firefox 68) | * TLS certificate store, backed by rkv: {{bug|1429796}} (shipped in Firefox 68) | ||
Line 142: | Line 140: | ||
* Encoding detector: {{bug|1551276}} (shipped in Firefox 73) | * Encoding detector: {{bug|1551276}} (shipped in Firefox 73) | ||
** '''Why Rust?''' Builds upon encoding_rs, has tiny FFI surface, subject matter prone to accesses past the bounds of a buffer, potentially parallelizable with Rayon. | ** '''Why Rust?''' Builds upon encoding_rs, has tiny FFI surface, subject matter prone to accesses past the bounds of a buffer, potentially parallelizable with Rayon. | ||
* Integrate [https://github.com/projectfluent/fluent-rs fluent-rs], a localization system: {{bug|1560038}} (shipped in Firefox 76) | |||
** '''Why Rust?''' Performance and memory wins are substantial over previous JS implementation. It brings zero-copy parsing, and memory savvy resolving of localization strings. It also paves the way for migrating the rest of the Fluent APIs away from JS which is required for Fission. | |||
* qcms [https://searchfox.org/mozilla-central/source/gfx/qcms] ported from C to Rust | |||
** '''Why Rust?''' Memory safety | |||
=== In progress === | === In progress === | ||
* | * Port [https://github.com/projectfluent/fluent-rs Localization API] to Rust: {{bug|1613705}} | ||
* [https://github.com/mozilla/neqo neqo] A QUIC implentation. | * [https://github.com/mozilla/neqo neqo] A QUIC implentation. | ||
* [https://github.com/CraneStation/cranelift/ cranelift, a low-level retargetable code generator]: {{bug|1469027}} | * [https://github.com/CraneStation/cranelift/ cranelift, a low-level retargetable code generator]: {{bug|1469027}} | ||
** '''Why Rust?''' It's a new, well-separated component with a clear interface. Also, Rust is a great language for writing compilers, due to algebraic data types and pattern matching. | ** '''Why Rust?''' It's a new, well-separated component with a clear interface. Also, Rust is a great language for writing compilers, due to algebraic data types and pattern matching. | ||
* [https://github.com/mozilla-spidermonkey/rust-frontend | * [https://github.com/mozilla-spidermonkey/rust-frontend SmooshMonkey] A Rust front-end for SpiderMonkey (featuring [https://github.com/mozilla-spidermonkey/jsparagus jsparagus]). | ||
** '''Why Rust?''' Parses untrusted input. Also, Rust is a great language for writing compilers, due to algebraic data types and pattern matching. | ** '''Why Rust?''' Parses untrusted input. Also, Rust is a great language for writing compilers, due to algebraic data types and pattern matching. | ||
* Audio remoting for Windows: {{bug|1432303}} | * Audio remoting for Windows: {{bug|1432303}} | ||
Line 157: | Line 159: | ||
* Linebreaking with xi-unicode: {{bug|1290022}} (last update late 2016) | * Linebreaking with xi-unicode: {{bug|1290022}} (last update late 2016) | ||
* Background Update Agent for Windows: {{bug|1343669}} | * Background Update Agent for Windows: {{bug|1343669}} | ||
* [https://github.com/gfx-rs/wgpu wgpu], a [https://gpuweb.github.io/gpuweb/ WebGPU] API implementation: {{bug|webgpu-mvp}} (in Nightly since 72) | * [https://github.com/gfx-rs/wgpu wgpu], a [https://gpuweb.github.io/gpuweb/ WebGPU] API implementation: {{bug|webgpu-mvp}} (in Nightly since 72) | ||
** '''Why Rust?''' Complex tracking logic, wide attack area. Also, leverages Rust ecosystem for building libraries on top of our native implementation and the API that will target the Web. | ** '''Why Rust?''' Complex tracking logic, wide attack area. Also, leverages Rust ecosystem for building libraries on top of our native implementation and the API that will target the Web. | ||
* Integrate the [https://github.com/mozilla/glean/ Glean SDK], a data collection library. | |||
=== Proposed === | === Proposed === | ||
Line 181: | Line 183: | ||
* Replace the XML parser, possibly via c2rust: {{bug|1611289}} | * Replace the XML parser, possibly via c2rust: {{bug|1611289}} | ||
** '''Why Rust?''' Parses untrusted input, replaces expat, a 3rd-party library with a history of frequent security vulnerabilities. | ** '''Why Rust?''' Parses untrusted input, replaces expat, a 3rd-party library with a history of frequent security vulnerabilities. | ||
* Rewrite the ICE stack used by WebRTC; {{bug|1616966}} | |||
** '''Why Rust?''' Works with network data. | |||
== Outside Firefox == | == Outside Firefox == | ||
Line 203: | Line 207: | ||
* Application Services, client-side | * Application Services, client-side | ||
** [https://github.com/mozilla/application-services/tree/master/components various sync-related components used on iOS and Fenix], includes a cross-compiled FxA Rust client, and storage/syncing of bookmarks, history, logins, tabs and webextensions data. | ** [https://github.com/mozilla/application-services/tree/master/components various sync-related components used on iOS and Fenix], includes a cross-compiled FxA Rust client, and storage/syncing of bookmarks, history, logins, tabs and webextensions data. | ||
* [https://github.com/mozilla/fix-stacks/ fix-stacks], a stack frame symbolizer: {{bug|1596292}} | |||
** '''Why Rust?''' High performance needed, a single implementation can replace multiple platform-specific scripts, and we can use the [https://github.com/getsentry/symbolic/ symbolic] crate to do all the hard parts. | |||
=== In Progress === | === In Progress === | ||
Line 208: | Line 214: | ||
* IPDL Parser: {{bug|1316754}} | * IPDL Parser: {{bug|1316754}} | ||
** '''Why Rust?''' Rust is a much better language than Python for writing compilers, due to strong typing, algebraic data types, and pattern matching. | ** '''Why Rust?''' Rust is a much better language than Python for writing compilers, due to strong typing, algebraic data types, and pattern matching. | ||
= Blockers and obstacles = | = Blockers and obstacles = | ||
Line 215: | Line 219: | ||
This section lists areas where Rust integration could be improved. | This section lists areas where Rust integration could be improved. | ||
* Tracking bug: Make the developer experience for Firefox + Rust great: {{Bug|rust-great}} | * Tracking bug: Make the developer experience for Firefox + Rust great: {{Bug|rust-great}} | ||
* | * [https://docs.google.com/document/d/16FgQPRxNb-Z6sfJy_P7edXzMVWE86jJEZVbmV0oC-m0/ 2020 Questionnaire results] | ||
* [https://docs.google.com/document/d/1puZvhWaURtViz8OC0HkB0h2dqJThVyAgLGFbIQpd4fo/ Oxidation 2020 Plan] | |||
= Meetings = | = Meetings = |