目錄

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 嗎?

#

是的。若要了解更多資訊,請參閱 dart:convert 函式庫中的 JSON 轉換器。

問: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 Ads、AdSense、AdMob 和 Google 助理都使用 Dart。Google 的大部分收入都透過這些應用程式產生。在 Google 內部或外部,每個 Flutter 應用程式都使用 Dart。


原生執行

#

問:Dart 是單執行緒的嗎?

#

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

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

並行在 Dart 網頁應用程式中的運作方式有所不同。若要了解更多資訊,請參閱Dart 在網頁上是單執行緒嗎?

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

#

是的。當編譯以桌面或行動裝置等目標的應用程式時,Dart Native 包含帶有即時 (JIT) 編譯器的 Dart VM 和提前 (AOT) 編譯器,以產生原生程式碼。

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

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

#

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

請參閱 dart compile 文件。

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

#

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

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

  • JIT 編譯的程式碼啟動速度較慢,但經過足夠的執行時間來套用執行階段最佳化後,可以達到尖峰效能。


Web 執行

#

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

#

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

  • Google Chrome
  • Microsoft Edge
  • Firefox
  • Apple Safari

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

問:Dart 在 Web 上是單執行緒的嗎?

#

稍微有。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(包括 0 的 -2,147,483,647 到 2,147,483,648)。

問:編譯為 JavaScript 時如何處理類型化的列表?

#

JavaScript 提供與 Dart 類型化清單相容的 32 位元類型化陣列。這會將 Float32List 對應為 Float32Array。生產環境 JavaScript 編譯器不支援 64 位元整數:Int64ListUint64List。編譯包含任何這些清單的 Dart 程式碼會導致執行階段例外狀況。