[英]Are circular imports bad in dart?
Dart 允许循环导入。
我的一般理解是循环导入(文件a导入文件b,文件b导入文件a)是一种不好的做法,一般是为了让go资源和垃圾回收。 然而,dart 中甚至没有警告,所以我想知道它是否会导致不良行为。
它对垃圾收集有影响吗? 会导致问题吗?
循环进口也不错。
Dart 的循环导入与垃圾回收无关。 这一切都是为了在编译时让其他库可以使用名称。
运行时数据结构中的循环可以使对象保持活动状态(但是,与其他一些语言不同,只要循环中没有对任何 object 的外部引用,Dart 的垃圾收集就可以收集整个循环)。
库在运行时不是数据结构,它们仅在编译时才真正存在。
无论如何,所有导入的库都存在于程序中。 如果程序使用库 A,而库 A 导入库 B,那么这两个库都将成为程序的一部分(它们的各个成员可能会或可能不会被树摇晃,具体取决于它们是否实际使用,但这与库依赖项。)
如果库 B 然后也导入库 A,那什么都不会改变。 这两个库仍然是该计划的一部分。 它所做的只是允许库 B 的成员引用库 A 的成员声明。
循环依赖确实会影响高效的模块化编译。 为了编译一个库,您还需要编译其所有依赖项(至少在某种程度上,包括类型推断),否则您无法检查该库是否正确使用其依赖项。
如果您有一个单向依赖项,那么您可以(可能)在开始查看导入它的库之前完全编译该依赖项。 有时构建系统甚至允许一个库编译一次,然后在依赖它的多个其他程序中重用。
如果你在库依赖中有一个循环,那么模块化编译器需要在同一个编译步骤中编译该循环的所有库,因为它们中的任何一个都不能先于其他编译。 因此,对于模块化的 Ahead-of-Time 编译器,周期会影响模块化编译的粒度。 我建议避免跨多个包的 go 循环。 在单个 package 内部,它非常好。
在运行时它仍然没有区别。
我实际上做了很多,它从来没有引起任何问题。
Dart 使用循环导入来支持多次处理源代码以创建中间代码的多遍编译器。 Dart VM 还支持使用此中间代码的即时编译和提前编译。
JIT 编译器在执行前将源代码转换为本机机器码,以提高性能速度和运行时间。 它也用于 Java。
AOT 编译器强制执行类型系统 Dart 使用和管理 memory 使用快速 object 分配和支持这些循环导入的分代垃圾收集器。 当您的应用程序准备好部署到生产环境时使用它。 它在将代码交付到将运行它的任何运行时环境之前对其进行编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.