Google 发布了 Dart 2.15 编程语言,该语言继续开发彻底重新设计的 Dart 2 分支,该分支与原始版本的 Dart 语言的不同之处在于使用了强静态类型(类型可以自动推断,因此指定类型不是必需的,但不再使用动态类型,并且初始计算将类型分配给变量,随后应用严格的类型检查)。
Dart语言的特点:
- 熟悉且易于学习的语法,对于 JavaScript、C 和 Java 程序员来说很自然。
- 确保所有现代 Web 浏览器和各种类型的环境(从便携式设备到功能强大的服务器)的快速启动和高性能。
- 能够定义允许封装和重用现有方法和数据的类和接口。
- 指定类型可以更轻松地调试和识别错误,使代码更清晰、更具可读性,并简化第三方开发人员的修改和分析。
- 支持的类型包括:各种类型的哈希、数组和列表、队列、数字和字符串类型、用于确定日期和时间的类型、正则表达式(RegExp)。 可以创建您自己的类型。
- 为了组织并行执行,建议使用具有isolate属性的类,其代码完全在单独的内存区域的隔离空间中执行,通过发送消息与主进程交互。
- 支持使用可简化大型 Web 项目的支持和调试的库。 函数的第三方实现可以以共享库的形式包含在内。 应用程序可以分为多个部分,并将每个部分的开发委托给单独的程序员团队。
- 一组支持 Dart 语言开发的现成工具,包括动态开发和调试工具的实现,以及动态代码修正(“编辑并继续”)。
- 为了简化 Dart 语言的开发,它附带了一个 SDK、一个包管理器 pub、一个静态代码分析器 dart_analyzer、一组库、一个集成开发环境 DartPad 以及支持 Dart 的 IntelliJ IDEA、WebStorm、Emacs、Sublime Text 插件2 和维姆。
- 带有库和实用程序的其他软件包通过 pub 存储库分发,该存储库包含大约 22 个软件包。
Dart 2.15 版本的主要变化:
- 提供用于快速并行执行任务并隔离处理程序的工具。 在多核系统上,Dart 运行时默认在一个 CPU 核心上运行应用程序代码,并使用其他核心来执行系统任务,例如异步 I/O、写入文件或进行网络调用。 对于需要并行执行处理程序的应用程序,例如,在界面中渲染动画,可以启动单独的代码块(隔离),彼此隔离并与主应用程序线程同时在其他 CPU 内核上执行。 为了防止同时执行处理同一组数据的代码时出现错误,禁止在不同隔离块中共享可变对象,并使用消息传递模型进行处理程序之间的交互。
Dart 2.15 引入了一个新概念——隔离块组(isolate groups),它允许您在属于同一组的隔离块中组织对各种内部数据结构的共享访问,这可以显着减少组中处理程序之间交互时的开销。 例如,由于无需初始化程序数据结构,因此与启动单独的隔离块相比,在现有组中启动附加隔离块的速度快 100 倍,所需内存也少 10-100 倍。
尽管组中的隔离块仍然禁止对可变对象的共享访问,但组使用共享堆内存,这可以显着加快对象从一个块到另一个块的传输速度,而无需执行资源密集型复制操作。 新版本还允许您在调用 Isolate.exit() 时传递处理程序的结果,以将数据传输到父隔离块,而无需复制操作。 此外,消息传输机制也得到了优化——中小型消息的处理速度现在提高了约 8 倍。 可以使用 SendPort.send() 调用在隔离之间传递的对象包括某些类型的函数、闭包和堆栈跟踪。
- 在用于创建指向其他对象中各个函数的指针(tear-off)的工具中,删除了在构造函数代码中创建类似指针的限制,这在基于 Flutter 库构建界面时非常有用。 例如,要创建包含多个 Text 小部件的 Column 小部件,您可以调用“.map()”并将指针传递给 Text 对象的 Text.new 构造函数: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column(children: ['Apple', 'Orange'].map(Text.new).toList()); } }
- 与函数指针的使用相关的可能性已得到扩展。 添加了使用泛型方法和函数指针创建非泛型方法和指针的功能:T id (T值)=>值; var intId = id ; // 在 2.15 版本中允许代替“int Function(int) intId = id;” 常量 fo = id; // 指向函数 id 的指针。 常量 c1 = fo ;
- dart:core 库改进了对枚举的支持,例如,您现在可以使用“.name”方法从每个枚举值输出字符串值、按名称选择值或匹配值对: enum MyEnum { one , 二, 三 } void main() { print(MyEnum.one.name); // 将打印“一”。 print(MyEnum.values.byName('two') == MyEnum.two); // 将打印“true”。 最终地图= MyEnum.values.asNameMap(); print(map['三'] == MyEnum.三); // “真的”。 }
- 已实现指针压缩技术,如果 64 位地址空间足以进行寻址(使用不超过 32 GB 的内存),则允许在 4 位环境中使用更紧凑的指针表示形式。 测试表明,这种优化可以将堆大小减少大约 10%。 在Flutter SDK中,新模式已经默认为Android启用,并计划在未来版本中为iOS启用。
- Dart SDK 包含用于调试和性能分析的工具 (DevTools),这些工具以前是在单独的包中提供的。
- “dart pub”命令和 pub.dev 软件包存储库中添加了工具,用于跟踪机密信息的意外发布,例如,在软件包内留下持续集成系统和云环境的凭据。 如果检测到此类泄漏,“dart pubpublish”命令的执行将被中断并显示错误消息。 如果出现误报,则可以通过白名单绕过检查。
- pub.dev 存储库中添加了撤销已发布的软件包版本的功能,例如,如果发现危险的错误或漏洞。 以前,对于此类更正,做法是发布更正版本,但在某些情况下,有必要取消现有版本并紧急停止其进一步分发(例如,如果更正尚未准备好或完整版本已发布)错误发布而不是测试版本)。 撤销后,该软件包不再在“pub get”和“pub Upgrade”命令中被识别,并且在已经安装了该软件包的系统上,下次执行“pub get”时会发出特殊警告。
- 添加了针对因在更改显示顺序的代码中使用 unicode 字符而导致的漏洞 (CVE-2021-22567) 的保护。
- 修复了一个漏洞 (CVE-2021-22568),该漏洞允许您在将包发布到接受 pub.dev oauth2 访问令牌的第三方服务器时模拟另一个 pub.dev 用户。 例如,该漏洞可用于攻击内部和公司软件包服务器。 仅在 pub.dev 上托管软件包的开发人员不受此问题的影响。
同时,发布了用户界面框架 Flutter 2.8 的重要版本,它被认为是 React Native 的替代品,允许基于单一代码库发布适用于 iOS、Android、Windows、macOS 和Linux 平台,以及创建在浏览器中运行的应用程序。 Google 开发的 Fuchsia 微内核操作系统的定制 shell 是在 Flutter 的基础上构建的。 值得注意的是,过去六个月,Google Play Store 中 Flutter 2 应用的数量从 200 万增加到 375 万,即几乎两次。
Flutter代码的主要部分是用Dart语言实现的,执行应用程序的运行时引擎是用C++编写的。 开发应用时,除了使用Flutter原生的Dart语言之外,还可以使用DartForeignFunction接口来调用C/C++代码。 通过将应用程序编译为目标平台的本机代码,可以实现高执行性能。 在这种情况下,程序不需要在每次更改后重新编译 - Dart 提供了热重载模式,允许您对正在运行的应用程序进行更改并立即评估结果。
Flutter新版本的变化中,值得注意的是移动设备上的启动速度和内存消耗的优化。 将应用程序连接到 Firebase 和 Google Cloud 等后端服务变得更加容易。 与 Google Ads 集成的工具已经稳定。 对相机和网络插件的支持得到了显着改进。 人们提出了新的工具来简化开发,例如,添加了一个小部件以使用 Firebase 进行身份验证。 专为使用 Flutter 开发 2D 游戏而设计的 Flame 引擎已更新。
来源: opennet.ru