Dart 常見問題
本頁收集社群中一些最常被問到的問題。
一般
#問:Dart 有規格嗎?
#是。EMCA-408 涵蓋了 Dart 程式設計語言規格。
已發佈五個版本。最新的開發中版本涵蓋至 Dart 2.13-dev。
版本 | 發佈日期 | 核准日期 | 涵蓋至版本 |
---|---|---|---|
第 6 版 picture_as_pdf | 2024 年 1 月 24 日 | 2.13-dev | |
第 5 版 picture_as_pdf | 2021 年 4 月 9 日 | 2.10 | |
第 4 版 picture_as_pdf | 2015 年 8 月 19 日 | 2015 年 12 月 | 1.11 |
第 3 版 picture_as_pdf | 2015 年 4 月 15 日 | 2015 年 6 月 | 1.9 |
第 2 版 picture_as_pdf | 2014 年 11 月 21 日 | 2014 年 12 月 | 1.6 |
第 1 版 picture_as_pdf | 2014 年 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、Web 和桌面平台。
問:Dart 有哪些真實世界的正式環境部署案例?
#Google Ads、AdSense、AdMob 和 Google 助理都使用 Dart。Google 的大部分收入都透過這些應用程式流動。在 Google 內外,每個 Flutter 應用程式都使用 Dart。
原生執行
#問:Dart 是單執行緒的嗎?
#否。在原生目標上,Dart 的 isolate API 可以在需要時啟動多個執行緒。Dart VM 使用多個 CPU 核心同時執行這些執行緒。
Dart 的並行架構 抽象化了典型共用記憶體執行緒的複雜、容易出錯的程式碼。這可以解釋 Dart 是單執行緒的誤解。
並行在 Dart Web 應用程式中的運作方式不同。若要深入瞭解,請參閱Dart 在 Web 上是單執行緒的嗎?
問:我可以將 Dart 程式碼編譯為原生程式碼嗎?
#是。在編譯以桌面或行動裝置等裝置為目標的應用程式時,Dart Native 包含具有即時 (JIT) 編譯器和預先 (AOT) 編譯器的 Dart VM,以產生原生程式碼。
Flutter 架構使用 Dart 的原生編譯功能來產生快速的原生應用程式。
問:我可以編譯 Dart 程式以在終端機中執行嗎?
#是。Dart 程式可以編譯為原生程式碼,以便在 macOS 終端機、Windows 命令提示字元或 Linux Shell 中執行。
請參閱 dart compile 文件。
問:哪個比較快:AOT 或 JIT 編譯的程式碼?
#這取決於情況。Dart 編譯程式碼的方式會產生具有不同效能特性的應用程式。
AOT 編譯的程式碼啟動速度快,執行階段效能一致,早期執行期間沒有延遲。
JIT 編譯的程式碼啟動速度較慢,但在執行足夠長的時間以套用執行階段最佳化後,會達到效能峰值。
Web 執行
#問:你們支援哪些瀏覽器作為 JavaScript 編譯目標?
#正式環境 Web 編譯器支援下列瀏覽器的最新兩個主要版本
- Google Chrome
- Microsoft Edge
- Firefox
- Apple Safari
開發 JavaScript 編譯器 僅支援 Chrome 進行偵錯。
問:Dart 在 Web 上是單執行緒的嗎?
#在某種程度上是。Dart Web 應用程式無法使用 isolates。為了實現程式碼並行,Web 應用程式使用 Web workers。Web workers 缺乏 isolates 的便利性和效率,並且具有不同的功能和限制。若要深入瞭解,請參閱Web 上的並行。
問:所有有效的 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 位元整數:Int64List
或 Uint64List
。使用其中任一列表編譯 Dart 程式碼會導致執行階段例外狀況。
除非另有說明,否則本網站上的文件反映的是 Dart 3.7.1 版本。頁面上次更新於 2025-01-21。 查看原始碼 或 回報問題。