| # Fuchsia Programming Language Policy |
| |
| [TOC] |
| |
| ## Scope |
| |
| This document describes which programming languages the Fuchsia project uses, and |
| supports authoring with, for production software that runs on the target device, both |
| within the Fuchsia Platform Source Tree and for end-developers building software that |
| runs on the target Fuchsia device outside the Fuchsia Source Platform Tree. |
| |
| The policy does not apply to (a) developer tooling that end-developers execute, |
| either on target or host devices, or (b) software on the target device |
| that is not executed in normal, end-user operation of the device. For example, |
| this policy does not apply to the language that zxdb (a debugger) is written in, |
| because zxdb is a developer tool that end-developers execute and it does not run |
| on a target device. However, this the policy does apply to pkgfs because |
| pkgfs (a file system) executes in the normal, end-user operation of the device. |
| |
| This policy is an _allowlist_. Languages not explicitly allowed below are |
| considered not allowed. |
| |
| ## Definitions |
| |
| The *Fuchsia Platform Source Tree* is the source code hosted on |
| fuchsia.googlesource.com. The Fuchsia Platform Source Tree can absorb larger |
| changes to the Fuchsia system and its underlying technologies than |
| end-developers because changes that impact only the Fuchsia Platform Source Tree |
| can be executed without coordination with other groups of people. |
| |
| *End-developers* are people who write software for Fuchsia outside of the |
| Fuchsia Platform Source Tree. Changes that impact end-developers require more |
| coordination and take longer to execute than changes that impact only the |
| Fuchsia Platform Source Tree. |
| |
| *Supported for end-developers* means that the Fuchsia IDK contains tools and |
| libraries that help people use the language to develop software for Fuchsia, |
| including a language-specific backend (and supporting libraries) for FIDL. |
| Support also implies some level of documentation, including tutorials and |
| examples, as well as investment from developer relations. |
| |
| *Strong support for asynchronous programming* means asynchronous programs can be |
| written using straight-line code (e.g., using async/await in languages like Rust |
| and Dart). |
| |
| *Strong encapsulation* is a term of art in object-oriented programming |
| languages. It means that the language allows class designers to enforce |
| visibility rules (e.g. `private` in C++ or Java) for the fields of a class and |
| objects of that class. |
| |
| ## Languages |
| |
| ### C |
| |
| #### Analysis |
| |
| * Pro: C is a widely used language. The language has properties that are |
| well-understood, have been stable over a long period of time, and have been |
| used to build similar systems in the past. The language has a mature |
| toolchain and associated developer tools. |
| * Pro: C has a stable ABI, which lets the Fuchsia IDK contain prebuilt |
| binaries that end-developers can re-use. |
| * Pro: Many languages can interoperate with C using a foreign function |
| interface. Supporting C makes it easier for end-developers to integrate |
| these languages with Fuchsia. |
| * Pro: Our current end-developers already use the language. |
| * Con: Support for asynchronous programming is weak. |
| * Con: Programs written in the language often have security bugs arising from |
| the languageās lack of memory safety. |
| * Con: Programs written in the language often contain resource leaks because |
| the language does not provide a facility for automatically releasing |
| resources. |
| * Con: Type safety is weak compared to C++. Simply recompiling some of our C |
| code as C++ often results in compiler errors that surface latent bugs in the |
| code. |
| |
| #### Decision |
| |
| * C is supported for end-developers. (See |
| [the list of supported versions of C](/docs/development/api/c.md#Language-versions).) |
| * Within the Fuchsia Platform Source Tree, new uses of C are discouraged. Ask |
| the relevant OWNERS for guidance about whether to use C for new code. |
| * C is approved for use in the Fuchsia Platform Source Tree: |
| * for low-level systems programming, including within the kernel, and |
| * for defining ABI-stable interfaces to shared libraries and other system |
| components. |
| |
| ### C++ |
| |
| #### Analysis |
| |
| * Pro: Many of our current end-developers use C++ extensively. |
| * Pro: The Fuchsia Platform Source Tree uses C++ extensively. |
| * Pro: C++ is a widely used language. The language has properties that are |
| well-understood, have been stable over a long period of time, and have been |
| used to build similar systems in the past. The language has a mature |
| toolchain and associated developer tools. |
| * Con: Support for asynchronous programming is weak. |
| * Con: Programs written in the language often have security bugs arising from |
| the language's lack of memory safety. |
| |
| #### Decision |
| |
| * C++ is supported for end-developers. (See |
| [the list of supported versions of C++](/docs/development/api/c.md#Language-versions).) |
| * C++ is approved for use throughout the Fuchsia Platform Source Tree. |
| |
| ### Dart |
| |
| #### Analysis |
| |
| * Pro: Asynchronous programs can be written using straight-line code. |
| * Pro: People using the language are highly productive. |
| * Pro: The language provides memory safety guarantees, which reduces the risk |
| of software developed in the language having security bugs. |
| * Con: The language uses garbage collection to manage memory, which is more |
| resource intensive than other techniques for managing memory. |
| * Con: The language has a substantial runtime environment. |
| * Con: The toolchain forces a trade-off between binary size, performance, and |
| startup latency that is worse than the tradeoff provided by toolchains for |
| other languages. |
| * Con: Updates of the Dart language, runtimes, and libraries in the Fuchsia |
| Platform Source Tree have proven to be a maintenance burden. They make heavy |
| usage of the SDK, but are developed out-of-tree. This ties together Dart |
| and Fuchsia versions in a way that makes updates difficult. |
| |
| #### Decision |
| |
| * Dart is supported for end-developers targeting non-drivers. |
| * Per |
| [RFC-0176](/docs/contribute/governance/rfcs/0176_disallow_new_dart_programs.md), |
| use of Dart is allowlisted in the Fuchsia Platform Source Tree, and new |
| additions to the allowlist require an exemption. |
| |
| ### Rust |
| |
| #### Analysis |
| |
| * Pro: The Fuchsia Platform Source Tree has had positive implementation |
| experience using Rust. |
| * Pro: The language provides memory safety guarantees, which reduces the risk |
| of software developed in the language having security bugs. |
| * Pro: Asynchronous programs can be written using straight-line code. |
| * Pro: The Fuchsia project has the opportunity to influence the evolution of |
| the language. |
| * Con: Rust is not a widely used language. The properties of the language are |
| not yet well-understood, having selected an unusual language design point |
| (e.g., borrow checker) and having existed only for a relatively short period |
| of time. |
| * Con: None of our current end-developers use Rust. |
| |
| #### Decision |
| |
| * Rust is not supported for end-developers. |
| * Rust is approved for use throughout the Fuchsia Platform Source Tree, with |
| the following exceptions: |
| * *kernel*. The Zircon kernel is built using a restricted set of |
| technologies that have established industry track records of being used |
| in production operating systems. |
| |
| ### Go |
| |
| #### Analysis |
| |
| * Pro: Go is a widely used language within Google. |
| * Pro: gVisor has implemented a network stack using the language and that |
| network stack has been integrated with Fuchsia. |
| * Pro: People using the language are highly productive. |
| * Pro: The Fuchsia project has the opportunity to influence the evolution of |
| the language. |
| * Pro: The language provides memory safety guarantees, which reduces the risk |
| of software developed in the language having security bugs. |
| * Pro: The language has an extensive ecosystem of libraries that are likely to |
| be useful on Fuchsia. |
| * Con: The language uses garbage collection to manage memory, which is more |
| resource intensive than other techniques for managing memory. |
| * Con: The language has a substantial runtime environment. |
| * Con: The Fuchsia Platform Source Tree has had negative implementation |
| experience using Go. The system components the Fuchsia project has built in |
| Go have used more memory and kernel resources than their counterparts (or |
| replacements) the Fuchsia project has built using C++ or Rust. |
| * Con: The toolchain produces large binaries. |
| |
| #### Decision |
| |
| * Go is not approved, with the following exceptions: |
| * *netstack*. Migrating netstack to another language would require a |
| significant investment. In the fullness of time, we should migrate |
| netstack to an approved language. |
| * All other uses of Go in the Fuchsia Platform Source Tree for production |
| software on the target device must be migrated to an approved language. |
| |
| ### Python |
| |
| #### Analysis |
| |
| * Pro: The language is widely used. |
| * Pro: The language is used in the build systems of many open-source |
| dependencies of Fuchsia. |
| * Pro: People using the language are highly productive. |
| * Pro: The language has a robust ecosystem of contributors and libraries that |
| are likely to be useful on Fuchsia. |
| * Pro: The language provides memory safety guarantees, which reduces the risk |
| of software developed in the language having security bugs. |
| * Con: The language uses garbage collection to manage memory, which is more |
| resource intensive than other techniques for managing memory. |
| * Con: The language has a substantial runtime environment. |
| * Con: The language is not performance-competitive with C++, Rust, or Dart. |
| * Con: Programming errors are often detected during execution rather than |
| statically. |
| * Con: The language lacks strong encapsulation. |
| |
| #### Decision |
| |
| * Per |
| [RFC-0221](/docs/contribute/governance/rfcs/0221_python_for_out-of-tree_system_testing.md), |
| Python 3 is approved for use by end developers for system testing. |
| * Python 3 is approved for use in the Fuchsia Platform Source Tree for the |
| following purposes: |
| * Build |
| * Host tools |
| * System testing |
| * Python 2.7 is deprecated and existing uses in the Fuchsia Platform Source |
| Tree must be migrated to an approved language. |