Contents

Dart FAQ

Contents

2019年6月更新

自Dart开源以来,此页面收集了我们从社区中听到的一些最重要的问题.

General

Q. Is there a specification for Dart?

是. Dart 1具有Ecma TC52拥有的正式规范.

当前指定了Dart 2.x; 该规范可从Dart语言规范页面获得.

Q. How are you taking input on changes to Dart?

我们会听取反馈和问题,并查看贡献者提供的补丁. 具有良好记录的贡献者可以成为存储库的提交者. Google工程师还将在公共存储库中工作,进行可见的更改. 该项目很幸运收到了许多外部补丁程序,并欢迎分布式提交者.


Language

Q. Isn’t Dart a lot like Java?

Dart与Java有一些相似之处. 有关Dart与Java之间的一些区别的示例,请参见Java开发人员Dart简介代码实验室.

Q. How does Dart relate to Go?

Dart和Go都是Google发起的语言项目,但是它们是独立的并且有不同的目标. 结果,他们做出了不同的选择,并且即使我们所有人都试图从彼此的工作中学习,语言也具有非常不同的性质.

Q. Why isn’t Dart more like Haskell / Smalltalk / Python / Scala / other language?

各种原因,取决于所询问的语言.

对于与JavaScript截然不同的语言:Dart编译为有效的JavaScript很重要. 我们在GWT中的经验是,如果源语言与JavaScript太不同,则会导致某些情况下需要复杂的输出代码来模仿源语言的行为. 这可能导致性能以对程序员不透明的方式变化.

For languages that are compiled to native code: it’s important that Dart compiles efficiently to machine code, and thus it shares a number of aspects with other compiled languages.

对于比Dart更"动态"的语言:Dart故意权衡一些任意运行时修改,以提高性能和生产工具的效率.

Q. Why isn’t Dart syntax more exciting?

我们确实引入了一些不错的语法功能,例如this. 构造函数args和=>用于单行函数,但是我们同意Dart选择熟悉而不是兴奋. 一位团队成员的个人评价:"我希望它能使人眼花more乱,但我无法否认在编写Dart代码的第一天,我的工作效率很高."

Q. Does Dart have reflection capabilities?

对于服务器和命令行脚本,我们从mirrors API获得了反射支持. 使用Dart编写Web或Flutter应用程序时,不支持镜像( 更多信息 ).

Q. Can Dart add tuples, pattern matching, non-nullable types, partial evaluation, optional semicolons, …?

尽管我们无法囊括所有内容,但将来的发行版可能会包含(其中的)某些功能. 有些功能与语言的基本性质不符,而某些功能无法与其他功能配合使用. 简单是我们可以给未来的程序员最重要的礼物.

Please look at the language funnel and language issues list to see if your request is already there. If it is, let us know that you care and give it a thumbs up. Otherwise, go ahead and add a new request issue (see the language evolution process for details). Make a thoughtful argument for your feature. Sample code with and without your feature is good evidence; a sizeable codebase that shows the need is even better evidence.

如果Dart语言小组默认设置为"否",请不要感到惊讶. 删除语言功能比添加语言功能要痛苦得多,因此Dart可能会先添加最明显的功能,然后再重新访问下一层. 而且,世界上仅存在更多可能的语言功能,它们可以适合任何一种语言而无需对其进行总哈希处理. 但是我们非常感谢您的建议和证据. 我们希望您能通过精心的设计选择和公平的沟通看到我们的赞赏.


Types

Q. Is Dart a statically typed language?

是的,Dart 2是静态类型的. 有关更多信息,请阅读有关Dart的字体系统 .

通过将静态检查和运行时检查相结合,Dart具有声音类型系统,该系统可以保证一种类型的表达式不能产生另一种类型的值. 没有惊喜!

即使使用类型安全的Dart,如果需要动态语言的灵活性,也可以使用dynamic注释任何变量. dynamic类型本身是静态的,但在运行时可以包含任何类型. 当然,这消除了该变量使用类型安全语言的许多好处.

Q. Why are generics covariant?

协变泛型符合程序员的一般直觉,而且这种直觉通常是正确的,例如在泛型的常见"只读"用法中. 尽管这种直觉并不总是正确的,但Dart通过使用协变泛型而在方便方面犯了错误.

唯一其他合理的默认方差将是不变性. 虽然仅具有不变的泛型肯定会防止更多错误,但它也将阻止许多有效程序,或者每次您有一个"苹果"列表并且有人只想要"水果"时都需要转换.

我们熟悉语言尝试标记或推断差异的多种方式. 我们认为方差推断系统为其在Dart中的利益增加了太多的复杂性.

同样,我们正在尝试务实,我们认为结果是合理的.


Usage and tools

Q. Does Dart support JSON?

是. 请参阅dart:convert库中的JSON转换器.

Q. Can Dart run on the server?

是. 有关详细信息,请参见服务器上的Dart .

Q. How do I use third party code, or share code?

您可以在pub.dev站点上找到许多软件包,该服务用于托管Dart代码的软件包. 使用pub命令打包代码并上传到站点.

Q. Do I need to use a particular editor or IDE to write Dart code?

不. 您可以在DartPad中试用Dart代码然后使用自己喜欢的编辑器或IDE进行开发. 一些功能齐全的IDE(例如IntelliJ IDEA,WebStorm和Visual Studio Code)具有Dart插件. 还存在许多编辑器的开源Dart插件. 有关更多信息,请参见Dart工具 .

Q. Can I build an Android app with Dart?

是! 您可以使用由Dart平台提供支持的Flutter ,通过单个代码库构建一个可在iOS上运行的Android应用程序.

Q. What are some real-world production deployments of Dart?

Google AdWords,AdSense,AdMob和Google助手都使用Dart. 通过这些应用程序,Google的收入中有很大一部分流向了. 在Google内部或外部,每个Flutter应用程序都使用Dart.


Native execution

Q. Can I compile Dart code to native code?

是. 对于面向设备(移动设备,台式机,服务器等)的程序, Dart Native包括具有JIT(即时)编译功能的Dart VM和用于生成机器代码的AOT(提前)编译器.

Flutter是一个示例框架,该框架使用Dart的本机编译功能来生成快速的本机应用程序.

Q. Can I compile a Dart program for running in a terminal?

是. Dart程序可以编译为本机x64机器代码,以在Windows,macOS和Linux等桌面操作系统上的"终端/命令提示符"中运行. 有关更多详细信息,请参阅dart2native文档.

Q. Which is faster — AOT- or JIT-compiled code?

使用dart2native之类的编译器提前编译( AOT )的代码与Dart VM中的实时编译( JIT )的代码具有不同的性能特征. 保证AOT编译的代码具有快速启动和一致的运行时性能,并且在早期运行期间没有延迟. JIT编译的代码在启动时速度较慢,但​​是在运行足够长的时间以应用运行时优化后,它可以具有更好的峰值性能.


Web: general

Q. What browsers do you support as JavaScript compilation targets?

生产编译器( dart2js )支持以下浏览器的最后两个主要版本:

  • Chrome
  • Edge
  • Firefox
  • Safari

开发编译器( dartdevc )仅支持Chrome.

Q. Is Dart supported by my browser?

尽管没有产品浏览器可以直接执行Dart代码,但是所有现代浏览器都可以执行已编译为JavaScript的Dart代码.

Q. How do I debug an app?

有关设置的详细信息和演练,请参阅调试Dart Web应用程序 .

dart2js文档的调试部分提供了针对特定浏览器的一些技巧.

Q. What web frameworks can I use with Dart?

您可以使用诸如dart:html之类的核心库定义的低级HTML API,也可以使用诸如AngularDart之类的框架. 在Google I / O 2019期间,我们宣布Flutter for web的技术预览,使您可以获取Flutter UI代码和业务逻辑并直接在浏览器中运行它.

Q. Will the Dart VM get into Chrome?

.Dart旨在编译为可在现代Web上运行的JavaScript.


Web: JavaScript and other technologies

Q. How does Dart code interoperate with JavaScript libraries?

尽管Dart和JavaScript是完全独立的语言,具有独立的VM,但它们可以互操作. 有关更多信息,请参见JavaScript和TypeScript interop .

Q. I have a large JavaScript codebase. How can I migrate it to Dart?

尝试一次迁移一项主要功能,并仅在必要时使用JavaScript互操作性库 .

Q. How does Dart compare with using the Closure compiler on JavaScript?

可选类型注释的想法与此类似. Dart在语法上更好.

比较以下Closure编译器代码:

// Closure compiler code

/**
 * @param {String} name
 * @return {String}
 */
makeGreeting = function(name) {
  /** @type {String} */
  var greeting = 'hello ' + name;
  return greeting;
}

使用以下Dart代码:

// Dart code

String makeGreeting(String name) {
  var greeting = 'hello $name';
  return greeting;
}

Q. How does Dart compare with CoffeeScript?

Dart和CoffeeScript均受JavaScript的启发,并且都可以转换回它. 他们做出了不同的选择,尤其是在语法风格上. 作为一种语言,我们认为可以说Dart在语义上与JavaScript的区别要比CoffeeScript大得多. 可能会减少行对行的翻译,但是我们相信Dart生成的JavaScript可以具有出色的大小和速度.

Dart引入了新的语义,而CoffeeScript保留了JavaScript的语义.

如果您喜欢CoffeeScript具有比原始JavaScript更结构化的感觉,则可能喜欢Dart的静态类型注释.

Q. What does Google think of TypeScript?

TypeScript和Dart具有相似的目标. 它们使构建大型Web应用程序变得更加容易. 但是,它们的方法完全不同. TypeScript保持了与JavaScript的向后兼容性,而Dart故意中断了JavaScript语法和语义的某些部分,以消除大量的错误并提高性能. Web遭受的选择太久太久了,我们认为Dart和TypeScript都为Web开发人员指明了光明的未来. 您可以在我们的博客上阅读更完整的回复 .

Q. I have a large app written in GWT. How do I port it to Dart?

Java和Dart在语法上相似,因此这可能比您想象的要容易. 您可以依靠Dart分析器来标记任何语法问题. 另外,您可以考虑一次将一项功能移植到Dart,并使用JavaScript互操作性库作为共同的中间立场. 请务必观看Dart-JavaScript互操作性,这是Dart Developer Summit 2016的演讲.


Web: JavaScript compilation

Q. Will any valid Dart code compile to JavaScript, or are there limitations?

我们打算将任何有效的Dart代码编译为JavaScript. 当然,某些库仅在服务器或Flutter中运行. 例如, dart:io库提供对浏览器不可用的API的操作系统文件和目录的访问.

Q. Why does Dart have two JavaScript compilers, dartdevc and dart2js?

两种编译器有不同的用例. 通常,您不必担心要使用哪个编译器,因为webdev工具会为您的用例选择正确的编译器. 在开发应用程序时,webdev选择dartdevc ,它支持增量编译,因此您可以快速查看编辑结果. 在构建用于部署的应用程序时,webdev选择dart2js ,它使用摇树之类的技术来生成优化的代码.

Q. How can dart2js produce JavaScript that runs faster than handwritten JavaScript?

将dart2js视为真正的编译器,它可以分析您的整个程序并进行您可能无法或不会执行的优化. 就像gcc可以通过移动代码来输出有效的代码一样,dart2js可以利用Dart的结构化特性来实现全局优化.

我们并不是声称所有Dart代码在编译为JavaScript时都比手写JavaScript运行得更快,但我们正在努力使常见情况更快.

Q. How can I write Dart code that compiles to performant JavaScript?

请参阅帮助dart2js生成更好的代码 . 请注意,此信息可能会随着dart2js实施的更改而更改.

Q. Why is the code for “Hello, World” so big, compared to the original Dart code after compilation to JavaScript?

我们认为从Dart创建小型高效的JavaScript很重要,但是大多数开发人员不会编写" Hello,World"应用程序. 这都是相对的,并且通过摇晃(消除死代码),缩小和压缩,Dart应用程序可以相当有效地编译为JavaScript.

凯文·摩尔(Kevin Moore)从他的真实HTML5游戏中看到了生成的JavaScript大小的改进 .

dart2js小组致力于产生较小的输出,但更多地侧重于实际应用,而不是琐碎的示例.

Q. How are floating point numbers handled when compiled to JavaScript?

JavaScript只有一种数字表示形式:IEEE-754双精度浮点数. 这意味着任何数字(整数或浮点数)都表示为双精度. JavaScript具有类型数据数组,并且从本机Dart类型列表到JavaScript类型数组的映射很简单.

Q. How are integers handled when compiled to JavaScript?

因为所有数字都存储为双精度数,所以整数限制为53位精度. 可以存储-2 53到2 53范围内的整数值而不会损失精度. 因为JavaScript VM使用数字的内部表示(类似于上述数字)来欺骗技巧,所以保持在smi范围内仍然是一种好习惯.

Q. How are typed lists handled when compiled to JavaScript?

JavaScript提供与Dart的类型列表兼容的类型数组. 映射很简单-例如,Float32List变为Float32Array. 今天的一个例外是dart2js不支持64位整数,因此不支持Int64List或Uint64List. 如果使用这些列表之一,则通过dart2js编译的Dart代码会导致运行时异常.

Q. Why not compile Dart to asm.js instead of JavaScript?

Asm.js是JavaScript的一个受限制的子集,最适合作为C编译器的编译目标. 它不包括JavaScript对象或直接访问DOM. 本质上,它仅允许对类型数组进行算术运算和操作.

尽管可以实现Dart所需的功能,但与依赖于底层JavaScript引擎提供的现有功能相比,它们将在速度和大小上产生大量开销. 例如,任何JavaScript机器都带有垃圾回收器. 在asm.js中实现另一个将增加输出大小,并且比现代JavaScript VM的经过良好调整的垃圾收集器明显慢.

by  ICOPY.SITE