簡體   English   中英

dart 中的循環進口是否不好?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM