Dart 常见问题
本页收集了社区的一些热门问题。
通用
#问:Dart 是否有规范?
#是的。EMCA-408 涵盖了 Dart 编程语言规范。
已发布五个版本。最新的进行中版本涵盖了 Dart 2.13-dev。
版本 | 发布 | 批准 | 涵盖的版本 |
---|---|---|---|
第 6 版 picture_as_pdf | 2024 年 1 月 24 日 | 2.13-dev | |
第 5 版 picture_as_pdf | 2021 年 4 月 9 日 | 2.10 | |
第 4 版 picture_as_pdf | 2015 年 8 月 19 日 | 2015 年 12 月 | 1.11 |
第 3 版 picture_as_pdf | 2015 年 4 月 15 日 | 2015 年 6 月 | 1.9 |
第 2 版 picture_as_pdf | 2014 年 11 月 21 日 | 2014 年 12 月 | 1.6 |
第 1 版 picture_as_pdf | 2014 年 3 月 27 日 | 2014 年 6 月 | 1.3 |
要了解有关规范的更多信息,请查看Dart 语言规范页面。
问:您如何接收关于 Dart 更改的意见?
#团队会倾听反馈,阅读问题,并审查来自贡献者的补丁。有良好记录的贡献者可以被授予存储库的写入权限。Google 的工程师也在公共存储库中工作,使更改可见。该项目收到了许多外部补丁,并欢迎分布式提交者。
语言
#问:Dart 不是和 Java 很像吗?
#Dart 与 Java 有一些相似之处。要查看具有熟悉语法的简短示例,请查看Dart 简介中的代码示例。
问:Dart 与 Go 有什么关系?
#Google 启动了 Dart 和 Go 语言项目。这些独立项目具有不同的目标。因此,它们做出了不同的选择。这些语言的性质非常不同,但团队成员会互相学习。
问:为什么 Dart 不更像 Haskell / Smalltalk / Python / Scala / 其他语言?
#根据比较的语言,有各种原因。
- 与 JavaScript 不同的语言
- Dart 必须编译为高效的 JavaScript。与 JavaScript 差异太大的源语言可能会生成复杂的输出代码来模拟源语言的行为。这会导致性能以程序员不明显的方式变化。
- 编译为本机代码的语言
- Dart 优先考虑高效编译为机器代码。因此,它与其他编译语言有一些相似之处。
- 被认为比 Dart “更动态”的语言
- Dart 选择牺牲一些这种任意的运行时修改,以实现更好的性能和更高效的工具。
问:为什么 Dart 的语法不更令人兴奋?
#存在一些不错的语法特性,例如 this.
构造函数参数和单行函数的 =>
。Dart 选择熟悉性而不是兴奋性。
问:Dart 是否具有反射功能?
#- 服务器和命令行脚本
- 是的,Dart 支持来自mirrors API的反射。
- Web 或 Flutter 应用
- 不,Dart 不支持写入Web 或 Flutter 应用。
问:Dart 可以添加元组、部分求值等功能吗?
#未来的版本可能会包含你想要的功能。某些功能不适合该语言的性质。有些功能与其他功能不兼容。简单是给未来程序员最重要的礼物。
要检查是否有人提交了您的请求,请查看语言漏斗和语言问题列表。
如果问题存在,请添加您的赞。
如果问题不存在,请请求新问题。
为您的功能提出周全的论点。为您的论点添加证据。包括带有或不带有您的功能的示例代码或相当大的代码库。
要了解更多信息,请查阅语言演变过程。
如果 Dart 语言团队拒绝您的请求,请不要感到惊讶。删除一个语言功能比添加一个功能会带来更多的痛苦。Dart 语言团队首先添加最明显的功能,稍后会重新审视下一层。
社区将请求比任何单一语言都能满足更多的功能,而不会使其完全混乱。Dart 语言团队确实感谢建议和证据。这种感谢应该通过仔细的设计选择和关于它们的公平沟通变得明显。
类型
#问:Dart 是否使用静态类型?
#是的,Dart 使用静态类型。要了解更多信息,请查阅Dart 的类型系统。
结合静态和运行时检查,Dart 具有健全的类型系统。这保证了一种类型的表达式不会产生另一种类型的值。
如果你需要动态类型的灵活性,你可以用 dynamic
注释任何变量。这个 dynamic
类型是静态的,但在运行时可以包含任何类型。这会从该变量中删除类型安全语言的许多好处。
问:为什么泛型是协变的?
#协变泛型符合程序员的常见直觉,而且很多时候这种直觉是正确的,例如在泛型的常见“只读”用法中。虽然这种直觉并不总是正确,但 Dart 通过使用协变泛型,倾向于便利性。
唯一其他合理的默认变体将是不变性。虽然只使用不变泛型肯定会防止更多错误,但也会阻止许多有效的程序,或者每次当你有一个“苹果”列表,而有人只想要“水果”时,都需要进行转换。
我们熟悉各种语言尝试标记或推断变体的方法。我们认为,变体推断系统会给 Dart 增加过多的复杂性,而收益却不大。
再次强调,我们正在努力务实,并且我们认为结果是合理的。
用法和工具
#问:Dart 是否支持 JSON?
#是的。要了解更多信息,请查阅 JSON 转换器,它们位于 dart:convert 库中。
问:Dart 可以在服务器上运行吗?
#是的。要了解更多信息,请查阅服务器上的 Dart。
问:如何使用第三方代码或共享代码?
#在 pub.dev 网站上搜索软件包,它是 Dart 和 Flutter 的软件包托管服务。使用 pub
命令打包你的代码并上传到该网站。
问:我是否需要使用特定的编辑器或 IDE 来编写 Dart 代码?
#否。你可以使用 DartPad 试用 Dart 代码,然后使用你喜欢的编辑器或 IDE 进行开发。一些功能齐全的 IDE,例如 IntelliJ IDEA、WebStorm 和 Visual Studio Code,都有 Dart 插件。还有一些开源的 Dart 插件适用于许多编辑器。有关更多信息,请参阅 Dart 工具。
问:我可以使用 Dart 构建 Android 应用吗?
#是的!你可以使用 Flutter 框架和 Dart 语言构建 Android 应用程序。你编写的任何 Flutter 应用程序都可以在 iOS、Web 和桌面平台上运行。
问:Dart 在现实世界中的一些生产部署有哪些?
#Google Ads、AdSense、AdMob 和 Google Assistant 都在使用 Dart。谷歌的大部分收入都通过这些应用程序产生。在谷歌内部或外部,每个 Flutter 应用程序都在使用 Dart。
原生执行
#问:Dart 是单线程的吗?
#否。在原生目标上,Dart 的隔离区 API 可以在需要时启动多个执行线程。Dart VM 使用多个 CPU 核心来同时运行这些线程。
Dart 的并发架构 抽象了典型的共享内存线程中复杂且容易出错的代码。这可能解释了 Dart 是单线程的误解。
并发在 Dart Web 应用程序中的工作方式有所不同。要了解更多信息,请查阅 Dart 在 Web 上是单线程的吗?
问:我可以将 Dart 代码编译为原生代码吗?
#是的。在编译以桌面或移动设备等设备为目标的应用程序时,Dart Native 包括一个带有即时 (JIT) 编译器的 Dart VM 和一个提前 (AOT) 编译器,用于生成原生代码。
Flutter 框架使用 Dart 的原生编译能力来生成快速的原生应用程序。
问:我可以编译一个 Dart 程序以便在终端中运行吗?
#是的。Dart 程序可以编译为原生代码,以便在 macOS 终端、Windows 命令提示符或 Linux shell 中运行。
请查阅 dart compile 文档。
问:AOT 编译的代码还是 JIT 编译的代码更快?
#这取决于。Dart 编译代码的方式会产生具有不同性能特征的应用程序。
AOT 编译的代码启动速度快,运行时性能一致,在早期运行时没有延迟。
JIT 编译的代码启动速度较慢,但在运行足够长的时间以应用运行时优化后,可以达到峰值性能。
Web 执行
#问:您支持哪些浏览器作为 JavaScript 编译目标?
#生产 Web 编译器支持以下浏览器最近的两个主要版本
- Google Chrome
- Microsoft Edge
- Firefox
- Apple Safari
开发 JavaScript 编译器仅支持 Chrome 用于调试。
问:Dart 在 Web 上是单线程的吗?
#有点。Dart Web 应用程序不能使用隔离区。为了实现代码并发,Web 应用程序使用 Web Workers。Web Workers 缺乏隔离区的易用性和效率,并且具有不同的功能和限制。要了解更多信息,请查阅 Web 上的并发。
问:任何有效的 Dart 代码都可以编译为 JavaScript 吗?
#任何有效的 Dart 代码都应该编译为 JavaScript。某些库仅在服务器或 Flutter 中运行。考虑 dart:io
库。它提供了对操作系统文件和目录的访问,其中包含浏览器无法使用的 API。
问:为什么 Dart 有两种编译为 JavaScript 的方式?
#这两种方式都使用 webdev
命令。 webdev build
命令生成为生产环境优化的缩小 JavaScript。webdev serve
命令生成为调试优化的模块化 JavaScript。
要了解更多信息,请查阅 Dart JavaScript 编译器参考
问:当编译为 JavaScript 时,浮点数是如何处理的?
#JavaScript 只有一个数字表示形式:IEEE-754 双精度浮点数。这意味着任何数字(整数或浮点数)都表示为双精度数。JavaScript 具有类型化的数据数组,并且从原生 Dart 类型化列表到 JavaScript 类型化数组的映射是微不足道的。
问:当编译为 JavaScript 时,Dart 如何处理整数?
#JavaScript 将所有 数字存储为双精度数。这会将整数限制为 53 位精度,值的范围从 -253 到 253。JavaScript 可以在不损失精度的情况下存储此范围内的整数。由于 JavaScript VM 会操纵数字的内部表示形式,因此请保持在小整数 (SMI) 范围内。在 JavaScript 中,该范围介于 -231 到 231 之间(-2,147,483,647 到 2,147,483,648,包括 0)。
问:当编译为 JavaScript 时,类型化列表是如何处理的?
#JavaScript 提供与 Dart 的类型化列表兼容的 32 位类型化数组。这会将 Float32List
映射为 Float32Array
。生产 JavaScript 编译器不支持 64 位整数:Int64List
或 Uint64List
。编译包含这些列表之一的 Dart 代码会导致运行时异常。
除非另有说明,否则本网站上的文档反映的是 Dart 3.6.0。页面上次更新于 2024-12-10。查看源代码 或 报告问题。