[英]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.