<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                我們知道,Flutter 開發框架采用的開發語言是 Dart,所以要用好這個框架,我們必須要搞清楚 Dart 語言。 關于新技術的學習,一直以來我都非常認同一個觀點:千萬不要直接陷入細節里,你應該先鳥瞰其全貌,這樣才能從高維度理解問題。所以,為了幫助你更高效地掌握 Dart,以最快的速度具備開發一款 Flutter 應用的能力,今天這篇文章,我會先從 Flutter 開發的角度,和你介紹 Dart 語言出現的歷史背景、特性以及未來。 然后,我會在本專欄的“Dart 基礎”模塊,與你詳細分享它的特性、基礎語法、類型變量、函數等知識,并和你分享一個使用 Dart 的綜合案例,幫你學懂、學會這門語言。 如果你已經對 Dart 有一個初步印象了,也可以跳過這篇預習文章,直接學習后面的內容。 ## Dart 是什么? 2011 年 10 月,在丹麥召開的 GOTO 大會上,Google 發布了一種新的編程語言 Dart。如同 Kotlin 和 Swift 的出現,分別是為了解決 Java 和 Objective-C 在編寫應用程序的一些實際問題一樣,Dart 的誕生正是要解決 JavaScript 存在的、在語言本質上無法改進的缺陷。 那么,**JavaScript 到底有哪些問題和缺陷呢?**JavaScript 之父布蘭登 · 艾克(Brendan Eich)曾在一次采訪中說,JavaScript“幾天就設計出來了”。 概括來說,他的設計思路是這樣的: * 借鑒 C 語言的基本語法; * 借鑒 Java 語言的數據類型和內存管理機制; * 借鑒 Scheme 語言,將函數提升到“第一等公民”(first class)的地位; * 借鑒 Self 語言,使用基于原型(prototype)的繼承機制。 所以,**JavaScript 實際上是兩類編程語言風格的混合產物:(簡化的)函數式編程風格,與(簡化的)面向對象編程風格。** 由于設計時間太短,一些細節考慮得不夠嚴謹,導致后來很長一段時間,使用 JavaScript 開發的程序混亂不堪。出于對 JavaScript 的不滿,Google 的程序員們決定自己寫一個新語言來換掉它,所以 Dart 的最初定位也是一種運行在瀏覽器中的腳本語言。 而為了推廣 Dart,Google 甚至將自己的 Chrome 瀏覽器內置了 Dart VM,可以直接高效地運行 Dart 代碼。而對于普通瀏覽器來說,Google 也提供了一套能夠將 Dart 代碼編譯成 JavaScript 代碼的轉換工具。這樣一來,開發者們就可以毫無顧慮地使用 Dart 去開發了,而不必擔心兼容問題。再加上出身名門,Dart 在一開始就贏得了部分前端開發者的關注。 但,JavaScript 的生命力似乎比預想的更強大。 原本 JavaScript 只能在瀏覽器中運行,但 Node.js 的出現讓它開始有能力運行在服務端,很快手機應用與桌面應用也成為了 JavaScript 的宿主容器,一些明星項目比如 React、React Native、Vue、Electron、NW(node-webkit)等框架如雨后春筍般崛起,迅速擴展了它的邊界。 于是,JavaScript 成為了前后端通吃的全棧語言,前端的開發模式也因此而改變,進入了一個新的世界。就如同 Atwood 定律描述的:凡是能用 JavaScript 寫出來的系統,最終都會用 JavaScript 寫出來(Any application that can be written in JavaScript, will eventually be written in JavaScript.)。 JavaScript 因為 Node.js 煥發了第二春,而 Dart 就沒有那么好的運氣了。由于缺少頂級項目的使用,Dart 始終不溫不火。2015 年,在聽取了大量開發者的反饋后,Google 決定將內置的 Dart VM 引擎從 Chrome 移除,這對 Dart 的發展來說是重大挫折,替代 JavaScript 就更無從談起了。 但,Dart 也借此機會開始轉型:在 Google 內部孵化了移動開發框架 Flutter,彎道超車進入了移動開發的領域;而在 Google 未來的操作系統 Fuchsia 中,Dart 更是被指定為官方的開發語言。 與此同時,Dart 的老本行,瀏覽器前端的發展也并未停滯。著名的前端框架 Angular,除了常見的 TS 版本外,也在持續迭代對應的 Dart 版本[AngularDart](https://github.com/dart-lang/angular)。(不過不得不說的是,這個項目的 star 一直以來只有可憐的 1,100 出頭)。 也正是因為使用者不多、歷史包袱少,所以在經歷了這么多的故事后,Dart 可以徹底轉變思路,成為專注大前端與跨平臺生態的語言。 接下來,我們就從 Flutter 開發的視角,聊聊 Dart 最重要的核心特性吧。 ## Dart 的特性 每門語言都有各自的特點,適合自己的才是最好的。 作為移動端開發的后來者,Dart 語言可以說是集百家之長,擁有其他優秀編程語言的諸多特性和影子,所以對于其他語言的開發者而言,學習成本無疑是非常低的。同時,Dart 擁有的特點則恰到好處,在對 Flutter 的支持上做到了獨一無二。所以,Dart 成了 Flutter 的選擇。 下面,我就和你詳細分享下它的核心特性。 ### JIT 與 AOT 借助于先進的工具鏈和編譯器,Dart 是少數同時支持 JIT(Just In Time,即時編譯)和 AOT(Ahead of Time,運行前編譯)的語言之一。那,到底什么是 JIT 和 AOT 呢? 語言在運行之前通常都需要編譯,JIT 和 AOT 則是最常見的兩種編譯模式。 * JIT 在運行時即時編譯,在開發周期中使用,可以動態下發和執行代碼,開發測試效率高,但運行速度和執行性能則會因為運行時即時編譯受到影響。 * AOT 即提前編譯,可以生成被直接執行的二進制代碼,運行速度快、執行性能表現好,但每次執行前都需要提前編譯,開發測試效率低。 總結來講,在開發期使用 JIT 編譯,可以縮短產品的開發周期。Flutter 最受歡迎的功能之一熱重載,正是基于此特性。而在發布期使用 AOT,就不需要像 React Native 那樣在跨平臺 JavaScript 代碼和原生 Android、iOS 代碼之間建立低效的方法調用映射關系。所以說,Dart 具有運行速度快、執行性能好的特點。 那么,**如何區分一門語言究竟是 AOT 還是 JIT 呢?**通常來說,看代碼在執行前是否需要編譯即可。如果需要編譯,通常屬于 AOT;如果不需要,則屬于 JIT。 AOT 的典型代表是 C/C++,它們必須在執行前編譯成機器碼;而 JIT 的代表,則包括了如 JavaScript、Python 等幾乎所有的腳本語言。 ### 內存分配與垃圾回收 Dart VM 的內存分配策略比較簡單,創建對象時只需要在堆上移動指針,內存增長始終是線性的,省去了查找可用內存的過程。 在 Dart 中,并發是通過 Isolate 實現的。Isolate 是類似于線程但不共享內存,獨立運行的 worker。這樣的機制,就可以讓 Dart 實現無鎖的快速分配。 Dart 的垃圾回收,則是采用了多生代算法。新生代在回收內存時采用“半空間”機制,觸發垃圾回收時,Dart 會將當前半空間中的“活躍”對象拷貝到備用空間,然后整體釋放當前空間的所有內存。回收過程中,Dart 只需要操作少量的“活躍”對象,沒有引用的大量“死亡”對象則被忽略,這樣的回收機制很適合 Flutter 框架中大量 Widget 銷毀重建的場景。 ### 單線程模型 支持并發執行線程的高級語言(比如,C++、Java、Objective-C),大都以搶占式的方式切換線程,即:每個線程都會被分配一個固定的時間片來執行,超過了時間片后線程上下文將被搶占后切換。如果這時正在更新線程間的共享資源,搶占后就可能導致數據不同步的問題。 解決這一問題的典型方法是,使用鎖來保護共享資源,但鎖本身又可能會帶來性能損耗,甚至出現死鎖等更嚴重的問題。 這時,Dart 是單線程模型的優勢就體現出來了,因為它天然不存在資源競爭和狀態同步的問題。這就意味著,一旦某個函數開始執行,就將執行到這個函數結束,而不會被其他 Dart 代碼打斷。 所以,**Dart 中并沒有線程,只有 Isolate(隔離區)**。Isolates 之間不會共享內存,就像幾個運行在不同進程中的 worker,通過事件循環(Event Looper)在事件隊列(Event Queue)上傳遞消息通信。 ### 無需單獨的聲明式布局語言 在 Flutter 中,界面布局直接通過 Dart 編碼來定義。 Dart 聲明式編程布局易于閱讀和可視化,使得 Flutter 并不需要類似 JSX 或 XML 的聲明式布局語言。所有的布局都使用同一種格式,也使得 Flutter 很容易提供高級工具使布局更簡單。 開發過程也不需要可視化界面構建器,因為熱重載可以讓我們立即在手機上看到運行效果。 ## Dart 的未來 那么,在這樣的背景下誕生的 Dart,今后發展會怎樣呢? Dart 是一個優秀而年輕的現代語言,但一種編程語言并不是搞定了引擎和開發者接口就算完成了,而是必須在這個語言得以立足的庫、框架、 應用程序等“生態”都成熟起來之后,其價值才會真正開始體現。而要走到這一步,通常需要花上數年的時間。 目前,基于 Dart 語言的第三方庫還很少,并且質量一般,不過值得慶幸的是,因為 Flutter 和 Fuchsia 的推動,Dart SDK 更新迭代的速度快了很多,開發者的熱情也急劇增長,Dart 生態增速很快。 畢竟,在 Dart 社區目前最頂級的產品就是 Flutter 和 Fuchsia 了,因此 Dart 開發者主要以 Flutter 開發者居多,當然了也有用 Dart 開發瀏覽器前端的開發者,但人數并不多。所以,**我覺得 Dart 是否能夠成功,目前來看主要取決于 Flutter 和 Fuchsia 能否成功**。**而,Flutter 是構建 Fuchsia 的 UI 開發框架,因此這個問題也變成了 Flutter 能否成功。** 正如我在開篇詞中提到的,Flutter 正式版發布也就半年多的時間,在 GitHub 上 Star 就已經超過了 68,000,僅落后 React Native 10,000 左右,可見熱度之高。 現在,我們一起回到 Flutter 自身來看,它的出現提供了一套徹底的跨平臺方案,也確實彌補了當今跨平臺開發框架的短板,解決了業界痛點,極有可能成為跨平臺開發領域的終極解決方案,前途光明,未來非常值得期待。 至此,我們已經可以清晰地看到,Google 在遭受與 Oracle 的 Java 侵權案后,痛定思痛后下定決心要發展自己的語言生態的布局愿景:Dart 憑借 Flutter 與 Fuchsia 的生態主攻前端和移動端,而服務端,則有借助于 Docker 的火熱勢頭增長迅猛的 Go 語言。 所以說,Google 的布局不僅全面,應用和影響也非常廣泛,前后端均有殺手級產品用來構建語言生態。相信隨著 Google 新系統 Fuchsia 的發布,Flutter 和 Dart 會以更迅猛的速度釋放它們的力量,而 Google 統一前后端開發技能棧的愿望也會在一定程度上得以實現。 ## 總結 今天,我帶你了解了 Dart 出現的歷史背景,從 Flutter 開發者的視角詳細介紹了 Dart 語言的各種特性,并分析了 Dart 的未來發展。 Dart 是一門現代語言,集合了各種優秀語言的優點。如果你不了解 Dart 也無需擔心,只要你有過其他編程語言,尤其是 Java、JavaScript、Swift 或 Objective-C 編程經驗的話,可以很容易地在 Dart 身上找它們的影子,以極低的成本快速上手。 希望通過這篇文章,你可以先對 Dart 語言有個初步了解,為我們接下來的學習打好基礎。在本專欄的“Dart 基礎”模塊中,我會對照著其他編程語言的特性,和你講述 Dart 與它們相似的設計理念,幫助你快速建立起構建 Flutter 程序的所需要的 Dart 知識體系。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看