Fuchsia 编程语言政策

范围

本文档介绍了 Fuchsia 项目针对在目标设备上运行的正式版软件(在 Fuchsia 平台源代码树中以及构建在目标 Fuchsia 设备(在 Fuchsia 源代码平台树之外)构建软件的最终开发者)使用并支持编写这些编程语言。

该政策不适用于 (a) 最终开发者在目标设备或主机设备上执行的开发者工具,或 (b) 目标设备上未在最终用户正常操作设备上执行的软件。例如,此政策不适用于编写 zxdb(调试程序)的语言,因为 zxdb 是最终开发者执行的开发者工具,不在目标设备上运行。不过,此政策适用于 pkgfs,因为 pkgfs(文件系统)是在设备的正常最终用户操作中执行的。

此政策是一项许可名单。下方未明确允许的语言被视为不允许。

定义

Fuchsia 平台源代码树是 fuchsia.googlesource.com 上托管的源代码。与最终开发者相比,Fuchsia 平台源代码树吸收了对 Fuchsia 系统及其底层技术的更改。这是因为,仅影响 Fuchsia 平台源代码树的更改无需与其他用户群体协调即可执行。

最终开发者是指在 Fuchsia 平台源代码树之外为 Fuchsia 编写软件的人。与仅影响紫红色平台源代码树的变更相比,影响最终开发者的变更需要更多的协调,执行时间更长。

最终开发者支持表示 Fuchsia IDK 包含的工具和库可帮助用户使用该语言开发适用于 FIDL 的软件,其中包括针对特定语言的后端(和用于 FIDL 的支持库)。支持还意味着一定程度的文档(包括教程和示例)以及来自开发者关系的投资。

对异步编程的强支持意味着可以使用直线代码编写异步程序(例如,在 Rust 和 Dart 等语言中使用 async/await)。

强封装是面向对象的编程语言中的艺术术语。这意味着,该语言允许类设计人员为某个类的字段和该类的对象强制执行可见性规则(例如,C++ 或 Java 中的 private)。

语言

C

分析

  • 优点:C 是一种广泛使用的语言。该语言具有易于理解的属性,在很长一段时间内一直稳定,并且过去曾用于构建类似的系统。该语言具有成熟的工具链和关联的开发者工具。
  • 优点:C 具有稳定的 ABI,使 Fuchsia IDK 能够包含最终开发者可重复使用的预构建二进制文件。
  • 优点:许多语言可以使用外部函数接口与 C 进行互操作。支持 C 有助于最终开发者更轻松地将这些语言与 Fuchsia 集成。
  • 优点:我们当前的最终开发者已经在使用这种语言。
  • 缺点:对异步编程的支持较差。
  • 缺点:用相应语言编写的程序通常存在由于该语言的缺乏内存安全性而导致的安全 bug。
  • 缺点:用相应语言编写的程序常常会发生资源泄露,因为该语言不提供自动释放资源的功能。
  • 缺点:与 C++ 相比,类型安全性较低。直接将部分 C 代码重新编译为 C++ 常常会导致编译器错误,从而在代码中显示潜在 bug。

裁判判定

  • 最终开发者支持 C。(请参阅受支持的 C 版本列表。)
  • 在 Fuchsia 平台源代码树中,不建议再次使用 C。请向相关所有者寻求指导,以确定是否针对新代码使用 C 语言。
  • C 已获准在 Fuchsia 平台源代码树中使用:
    • 用于低级系统编程(包括在内核内编程),以及
    • ,用于定义共享库和其他系统组件的 ABI 稳定接口。

C++

分析

  • 优点:我们目前的许多最终开发者都大量使用 C++。
  • 优点:Fuchsia 平台源代码树广泛使用 C++。
  • 优点:C++ 是一种广泛使用的语言。该语言具有易于理解的属性,在很长一段时间内一直稳定,并且过去曾用于构建类似的系统。该语言具有成熟的工具链和关联的开发者工具。
  • 缺点:对异步编程的支持较差。
  • 缺点:用相应语言编写的程序通常存在由于该语言的缺乏内存安全性而导致的安全 bug。

裁判判定

Dart

分析

  • 优点:可以使用直行代码编写异步程序。
  • 优点:使用这种语言的人的工作效率很高。
  • 优点:该语言提供了内存安全保证,可以降低使用这种语言开发的软件存在安全 bug 的风险。
  • 缺点:该语言使用垃圾回收来管理内存,这比其他内存管理技术占用的资源更多。
  • 缺点:该语言具有大量的运行时环境。
  • 缺点:工具链会在二进制文件大小、性能和启动延迟时间之间强制权衡,这要比工具链为其他语言提供的权衡更糟糕。
  • 缺点:事实证明,更新 Fuchsia 平台源代码树中的 Dart 语言、运行时和库会带来维护负担。它们大量使用 SDK,但是在树外开发的。这会将 Dart 和 Fuchsia 版本联系在一起,使得更新变得困难。

裁判判定

  • 面向非驱动程序的最终开发者支持 Dart。
  • 根据 RFC-0176,Dart 已在 Fuchsia 平台源代码树中列入许可名单,而添加到许可名单中的新项目要求豁免。

Rust

分析

  • 优点:Fucsia 平台源代码树在使用 Rust 时取得了良好的实现体验。
  • 优点:该语言提供了内存安全保证,可以降低使用这种语言开发的软件存在安全 bug 的风险。
  • 优点:可以使用直行代码编写异步程序。
  • 优点:Fucsia 项目有机会影响语言的演变。
  • 缺点:Rust 语言使用不广。语言属性尚未获得充分理解,他们选择了不寻常的语言设计点(例如借用检查器),并且只存在的时间相对较短。
  • 缺点:我们目前的最终开发者都没有使用 Rust。

裁判判定

  • 最终开发者不支持 Rust。
  • Rust 已获准在整个 Fuchsia 平台源代码树中使用,但以下情况除外:
    • kernel:Zircon 内核是使用一组受限的技术构建而成的,这些技术在正式版操作系统中使用的行业记录良好。

Go

分析

  • 优点:Go 是 Google 内部广泛使用的语言。
  • 优点:gVisor 已使用语言实现网络堆栈,且网络堆栈已与 Fuchsia 集成。
  • 优点:使用这种语言的人的工作效率很高。
  • 优点:Fucsia 项目有机会影响语言的演变。
  • 优点:该语言提供了内存安全保证,可以降低使用这种语言开发的软件存在安全 bug 的风险。
  • 优点:该语言具有庞大的库生态系统,在 Fuchsia 上可能很有用。
  • 缺点:该语言使用垃圾回收来管理内存,这比其他内存管理技术占用的资源更多。
  • 缺点:该语言具有大量的运行时环境。
  • 缺点:Fucsia 平台源代码树在使用 Go 时曾有过负面的实现体验。相比 Fuchsia 项目使用 C++ 或 Rust 构建的对应项目(或替换组件),Fucsia 项目在 Go 中构建的系统组件使用了更多的内存和内核资源。
  • 缺点:工具链会生成大型二进制文件。

裁判判定

  • Go 未获批准,但以下情况除外:
    • netstack。将 netstack 迁移到另一种语言需要大量投资。时间非常紧迫,我们应该将 netstack 迁移到已获批准的语言。
  • 在 Fuchsia 平台源代码树中,将 Go 用于目标设备上的正式版软件的所有其他用途都必须迁移到已获批准的语言。

Python

分析

  • 优点:该语言使用广泛。
  • 优点:该语言用于许多 Fuchsia 开源依赖项的构建系统。
  • 优点:使用这种语言的人的工作效率很高。
  • 优点:该语言拥有一个强大的贡献者和库生态系统,在 Fuchsia 上可能很有用。
  • 优点:该语言提供了内存安全保证,可以降低使用这种语言开发的软件存在安全 bug 的风险。
  • 缺点:该语言使用垃圾回收来管理内存,这比其他内存管理技术占用的资源更多。
  • 缺点:该语言具有大量的运行时环境。
  • 缺点:使用 C++、Rust 或 Dart 语言时,语言的性能不具竞争力。
  • 缺点:编程错误通常在执行期间(而不是静态)检测到。
  • 缺点:语言缺少强封装。

裁判判定

  • 根据 RFC-0221,Python 3 已获准使用,可供最终开发者用于系统测试。
  • Python 3 已获准在 Fuchsia 平台源代码树中使用,用于以下用途:
    • Build
    • 托管工具
    • 系统测试
  • Python 2.7 已废弃,Fuchsia 平台源代码树中的现有用例必须迁移到已获批准的语言。