內容

Dart 常見問題

內容 keyboard_arrow_down keyboard_arrow_up
more_horiz

此頁面收集社群中一些最常被問到的問題。

一般

#

問:Dart 有規範嗎?

#

是的。 EMCA-408 涵蓋 Dart 程式語言規格。

已發布五個版本。最新的進行中版本涵蓋至 Dart 2.13-dev。

版本發布核准涵蓋至版本
第 6 版 picture_as_pdf2024 年 1 月 24 日2.13-dev
第 5 版 picture_as_pdf2021 年 4 月 9 日2.10
第 4 版 picture_as_pdf2015 年 8 月 19 日2015 年 12 月1.11
第 3 版 picture_as_pdf2015 年 4 月 15 日2015 年 6 月1.9
第 2 版 picture_as_pdf2014 年 11 月 21 日2014 年 12 月1.6
第 1 版 picture_as_pdf2014 年 3 月 27 日2014 年 6 月1.3

如需深入了解規格,請查看 Dart 語言規格 頁面。

問:你們如何針對 Dart 的變更徵求意見?

#

團隊會傾聽回饋意見、閱讀 問題,並檢閱貢獻者的程式碼修補程式。擁有良好記錄的貢獻者可能會獲得儲存庫的寫入權限。Google 工程師也會在公開儲存庫中工作,並讓變更可見。此專案已收到許多外部程式碼修補程式,並歡迎分散式提交者。


語言

#

問:Dart 不就像 Java 嗎?

#

Dart 與 Java 有些相似之處。如需查看使用熟悉語法的簡短範例,請檢閱 Dart 簡介 中的程式碼範例。

問:Dart 和 Go 有什麼關係?

#

Google 啟動了 Dart 和 Go 語言專案。這些獨立專案有不同的目標。因此,它們會做出不同的選擇。這些語言的性質截然不同,但團隊成員會互相學習彼此的工作。

問:為什麼 Dart 不更像 Haskell / Smalltalk / Python / Scala / 其他語言?

#

取決於比較語言的不同原因。

與 JavaScript 不同的語言
Dart 必須編譯為高效能的 JavaScript。與 JavaScript 差異過大的原始語言可能會產生複雜的輸出程式碼,以模擬原始語言的行為。這可能會導致效能以程式設計師無法預測的方式產生變化。
編譯為原生程式碼的語言
Dart 優先考慮有效編譯為機器碼。因此,它與其他編譯語言有一些共同點。
被認為「比 Dart 更動態」的語言
Dart 選擇犧牲一些任意的執行時期修改,以實現更好的效能和更具生產力的工具。

問:為什麼 Dart 語法沒有更令人興奮?

#

有一些不錯的語法功能,例如 this. 建構函數參數和 => 單行函式。Dart 選擇熟悉度勝於令人興奮

問:Dart 有反射能力嗎?

#
伺服器和命令列指令碼
是的,Dart 支援 mirrors API 的反射。
Web 或 Flutter 應用程式
不,Dart 不支援寫入 Web 或 Flutter 應用程式

問:Dart 可以新增元組、部分評估...嗎?

#

未來的版本可能會包含您想要的某項功能。有些功能不符合語言的性質。有些功能與其他功能搭配不佳。簡潔性是給未來程式設計師最重要的禮物。

若要檢查是否有人已提交您的要求,請檢閱 語言漏斗語言問題清單

  • 如果問題存在,請按讚。

  • 如果問題不存在,請要求 建立新問題

    為您的功能提出深思熟慮的論點。為您的論點加入證據。包含有和沒有您的功能的範例程式碼或大量的程式碼庫。

若要深入了解,請參閱 語言演化過程

如果 Dart 語言團隊拒絕您的要求,請不要感到驚訝。移除語言功能比新增語言功能更令人痛苦。Dart 語言團隊會先新增最明顯的功能,並稍後再檢視下一層級的功能。

社群會要求比任何單一語言都能滿足的更多功能,而不會造成混亂。Dart 語言團隊確實感謝建議和證據。這種感謝應透過仔細的設計選擇和公平的溝通而顯現出來。


型別

#

問:Dart 使用靜態型別嗎?

#

是的,Dart 使用靜態類型。若要深入了解,請參閱 Dart 的類型系統

結合靜態和執行時期檢查,Dart 有一個健全的類型系統。這保證一個類型的表達式無法產生另一種類型的值。

如果您需要動態類型的靈活性,您可以使用 dynamic 註解任何變數。這個 dynamic 類型是靜態的,但在執行時期可以包含任何類型。這會從該變數中移除類型安全語言的許多好處。

問:為什麼泛型是協變的?

#

協變泛型符合程式設計師的常見直覺,而且這種直覺通常是正確的,例如泛型的常見「唯讀」使用方式。雖然這種直覺並不總是正確的,但 Dart 透過協變泛型在便利性方面犯了錯。

唯一其他合理的預設變異將是不變異。雖然只有不變異的泛型肯定可以防止更多錯誤,但它也會阻止許多有效的程式或需要在每次有「蘋果」清單時進行轉換,而有人只想吃「水果」。

我們熟悉各種語言嘗試標記或推論變異的方式。我們認為變異推論系統在 Dart 中增加了太多複雜性,而無法發揮其優點。

再次強調,我們試圖務實,我們認為結果是合理的。


用法和工具

#

問:Dart 支援 JSON 嗎?

#

是。如需深入了解,請參閱 JSON 轉換器,這些轉換器位於 dart:convert 函式庫中。

問:Dart 可以執行在伺服器上嗎?

#

是。如需深入了解,請參閱 伺服器上的 Dart

問:我該如何使用第三方程式碼,或分享程式碼?

#

pub.dev 網站 上搜尋套件,這是 Dart 和 Flutter 的套件託管服務。使用 pub 命令 來封裝程式碼並上傳到網站。

問:我需要使用特定的編輯器或 IDE 來撰寫 Dart 程式碼嗎?

#

否。您可以使用 DartPad 來試用 Dart 程式碼,然後使用您最愛的編輯器或 IDE 來進行開發。一些功能齊全的 IDE(例如 IntelliJ IDEA、WebStorm 和 Visual Studio Code)具有 Dart 外掛程式。針對許多編輯器也存在開源的 Dart 外掛程式。如需更多資訊,請參閱 Dart 工具

問:我可以使用 Dart 建置 Android 應用程式嗎?

#

是的!您可以使用 Flutter 架構和 Dart 語言來建置 Android 應用程式。您撰寫的任何 Flutter 應用程式也適用於 iOS、網路和桌面平台。

問:Dart 有哪些實際的生產部署範例?

#

Google 廣告、AdSense、AdMob 和 Google 助理都使用 Dart。Google 的大部分收益都來自這些應用程式。在 Google 內部或外部,每個 Flutter 應用程式 都使用 Dart。


原生執行

#

問:Dart 是單執行緒的嗎?

#

否。在原生目標上,Dart 的 isolate API 可以視需要啟動多個執行緒。Dart VM 使用多個 CPU 核心來同時執行這些執行緒。

Dart 的並行架構 抽象化了典型共用記憶體執行緒的複雜且容易出錯的程式碼。這可能會解釋為什麼會有人誤解 Dart 是單執行緒的。

並行處理在 Dart 網路應用程式中運作的方式不同。如需深入了解,請參閱 Dart 在網路上是單執行緒的嗎?

問:我可以將 Dart 程式碼編譯成原生程式碼嗎?

#

是。在編譯目標為桌面或行動裝置等裝置的應用程式時,Dart Native 包含一個具有即時 (JIT) 編譯器和預先 (AOT) 編譯器的 Dart VM,以產生原生程式碼。

Flutter 架構使用 Dart 的原生編譯功能來產生快速的原生應用程式。

問:我可以編譯 Dart 程式以便在終端機中執行嗎?

#

是。Dart 程式可以編譯為原生程式碼,以便在 macOS Terminal、Windows 命令提示字元或 Linux shell 中執行。

請參閱 dart compile 文件。

問:哪一個比較快:AOT 編譯或 JIT 編譯的程式碼?

#

這取決於情況。Dart 編譯程式碼的方式會產生具有不同效能特性的應用程式。

  • AOT 編譯的程式碼啟動快速,執行時間效能一致,在早期執行期間沒有延遲。

  • JIT 編譯的程式碼啟動較慢,但執行時間夠長以套用執行時期最佳化後,會達到效能巔峰。


網路執行

#

問:你們支援哪些瀏覽器作為 JavaScript 編譯目標?

#

生產網路編譯器支援下列瀏覽器的最後兩個主要版本

  • Google Chrome
  • Microsoft Edge
  • Firefox
  • Apple Safari

開發 JavaScript 編譯器僅支援 Chrome 進行偵錯。

問:Dart 在網路中是單執行緒的嗎?

#

有些可以。Dart 網路應用程式無法使用隔離。若要達成程式碼並行,網路應用程式會使用 網頁工作執行緒。網頁工作執行緒缺乏隔離的容易性和效率,且具有不同的功能和限制。若要深入了解,請參閱 網路上的並行

問:任何有效的 Dart 程式碼都可以編譯成 JavaScript 嗎?

#

任何有效的 Dart 程式碼都應該編譯成 JavaScript。有些函式庫僅在伺服器或 Flutter 中執行。考慮使用 dart:io 函式庫。它提供對作業系統檔案和目錄的存取,而瀏覽器無法使用這些 API。

問:為什麼 Dart 有兩種編譯成 JavaScript 的方式?

#

兩種方式都使用 webdev 指令。webdev build 指令會產生經過縮小的 JavaScript,針對生產進行最佳化。webdev serve 指令會產生模組化的 JavaScript,針對偵錯進行最佳化。

若要深入了解,請參閱 Dart JavaScript 編譯器參考

問:編譯成 JavaScript 時,浮點數是如何處理的?

#

JavaScript 僅有一個數字表示法:IEEE-754 雙精度浮點數。這表示任何數字(整數或浮點數)都表示為雙精度數。JavaScript 具有型別化資料陣列,而從原生 Dart 型別化清單對應到 JavaScript 型別化陣列的對應關係很簡單。

問:編譯成 JavaScript 時,Dart 如何處理整數?

#

JavaScript 將所有 數字儲存為雙精度數。這會將整數限制為 53 位元精確度,值介於 -253 到 253 之間。JavaScript 可以在此範圍內儲存整數,而不會損失精確度。由於 JavaScript VM 會處理數字的內部表示法,因此請保持在小整數 (SMI) 範圍內。在 JavaScript 中,該範圍介於 -231 到 231 之間(-2,147,483,647 到 2,147,483,648,包含 0)。

問:編譯成 JavaScript 時,型別化清單是如何處理的?

#

JavaScript 提供 32 位元型別化陣列,與 Dart 的型別化清單相容。這會對應為 Float32List 成為 Float32Array。生產 JavaScript 編譯器不支援 64 位元整數:Int64ListUint64List。使用其中任一清單編譯 Dart 程式碼會導致執行時期例外狀況。