Flutter為什么使用Dart?

老孟導(dǎo)讀:關(guān)于Flutter為什么使用Dart?這個(gè)話題,就像PHP是世界上最好的語言一樣,爭論從來沒有停止過,有很多說法,比如:

  • Google是為了推廣Dart,Dart是親兒子。
  • Flutter團(tuán)隊(duì)和Dart團(tuán)隊(duì)相鄰,溝通起來更方便。

或許存在這樣的考慮,但即使是親兒子,爛泥也要能扶上墻才行啊,難道你真的覺得如此重大的決定是靠這些主觀色彩決定的?不可能的,所以Dart一定是有其非常大的優(yōu)勢。

前言

在Flutter成立之初,F(xiàn)lutter團(tuán)隊(duì)評(píng)估了10多種語言,F(xiàn)lutter團(tuán)隊(duì)從四個(gè)主要維度進(jìn)行評(píng)估,并考慮了框架作者,開發(fā)人員和最終用戶的需求。最終Dart在所有評(píng)估維度上得分都很高,并且符合所有要求和標(biāo)準(zhǔn)。

Dart在以下主要標(biāo)準(zhǔn)上贏得了高分:

  • 開發(fā)人員的生產(chǎn)力。Flutter的主要價(jià)值主張之一是,它可以讓開發(fā)人員使用相同的代碼庫為iOS和Android創(chuàng)建應(yīng)用程序,從而節(jié)省了工程資源。使用高效的語言可以進(jìn)一步加速開發(fā)人員,并使Flutter更具吸引力。這對(duì)我們的框架團(tuán)隊(duì)和開發(fā)人員都非常重要。Flutter的大多數(shù)語言都是用與我們提供給用戶的語言相同的語言構(gòu)建的,因此我們需要在不犧牲開發(fā)人員的框架和小部件的可訪問性或可讀性的情況下,保持100k的代碼行的生產(chǎn)力。
  • 面向?qū)ο?/em>。對(duì)于Flutter,我們需要一種適合Flutter問題領(lǐng)域的語言:創(chuàng)建視覺用戶體驗(yàn)。該行業(yè)擁有數(shù)十年使用面向?qū)ο笳Z言構(gòu)建用戶界面框架的經(jīng)驗(yàn)。盡管我們可以使用非面向?qū)ο蟮恼Z言,但這將意味著重新發(fā)明輪子來解決一些難題。另外,絕大多數(shù)開發(fā)人員都有面向?qū)ο箝_發(fā)的經(jīng)驗(yàn),這使得學(xué)習(xí)Flutter開發(fā)方法變得更加容易。
  • 可預(yù)測的高性能。借助Flutter,我們希望使開發(fā)人員能夠創(chuàng)建快速,流暢的用戶體驗(yàn)。為了實(shí)現(xiàn)這一點(diǎn),我們需要能夠在每個(gè)動(dòng)畫幀中運(yùn)行大量的最終開發(fā)人員代碼。這意味著我們需要一種既能提供高性能又能提供可預(yù)測的性能的語言,而又不會(huì)導(dǎo)致幀丟失的定期暫停。
  • 快速分配。Flutter框架使用一種功能樣式的流程,該流程在很大程度上依賴于基礎(chǔ)內(nèi)存分配器,可以有效地處理短暫的短期分配。此樣式是使用具有此屬性的語言開發(fā)的,在缺少此功能的語言中無法有效工作。

Dart

以下是Dart功能的列表,這些功能對(duì)于Flutter來說是必不可少:

  • Dart是AOT(Ahead Of Time)編譯的,編譯成快速,可預(yù)測的本機(jī)代碼,幾乎所有Flutter都可以用Dart編寫。這不僅使Flutter更快,而且?guī)缀跛袃?nèi)容(包括所有小部件)都可以自定義。
  • Dart還可以通過JIT(Just In Time)進(jìn)行編譯,以實(shí)現(xiàn)異??焖俚拈_發(fā)周期和改變游戲規(guī)則的工作流(包括Flutter亞秒級(jí)有狀態(tài)熱重裝)。
  • Dart使創(chuàng)建以60fps運(yùn)行的平滑動(dòng)畫和過渡更加容易。Dart可以在沒有鎖的情況下進(jìn)行對(duì)象分配和垃圾回收。與JavaScript一樣,Dart避免了搶先式調(diào)度和共享內(nèi)存(從而避免了鎖定)。因?yàn)镕lutter應(yīng)用程序已編譯為本機(jī)代碼,所以它們不需要在領(lǐng)域之間建立緩慢的橋梁(例如,JavaScript與本機(jī)之間)。它們的啟動(dòng)速度也快得多。
  • Dart允許Flutter避免使用像JSX或XML這樣的聲明式布局語言,也不需要單獨(dú)的可視化界面構(gòu)建器,因?yàn)镈art的聲明式程序化布局易于閱讀和可視化。而且,由于所有布局都以一種語言和一種位置顯示,因此Flutter可以輕松地提供使布局變得輕松的高級(jí)工具。
  • 開發(fā)人員發(fā)現(xiàn)Dart特別易于學(xué)習(xí),因?yàn)樗哂徐o態(tài)和動(dòng)態(tài)語言用戶都熟悉的功能。

并非所有這些功能都是Dart獨(dú)有的,但是它們的結(jié)合達(dá)到了一個(gè)甜蜜點(diǎn),這使得Dart在實(shí)施Flutter方面具有獨(dú)特的功能。如此之多,很難想象Flutter會(huì)像沒有Dart一樣強(qiáng)大。

編譯與執(zhí)行

如果您已經(jīng)了解靜態(tài)和動(dòng)態(tài)語言,AOT和JIT編譯以及虛擬機(jī)等主題,則可以跳過本節(jié)。

從歷史上看,計(jì)算機(jī)語言已分為兩類:靜態(tài)語言(例如,F(xiàn)ortran或C,其中在編譯時(shí)靜態(tài)鍵入變量)和動(dòng)態(tài)語言(例如,Smalltalk或JavaScript,其中,變量的類型可以在運(yùn)行時(shí)更改)時(shí)間)。通常會(huì)編譯靜態(tài)語言,以生成目標(biāo)計(jì)算機(jī)的本機(jī)代碼(或匯編代碼)程序,這些程序在運(yùn)行時(shí)由硬件直接執(zhí)行。動(dòng)態(tài)語言由解釋器執(zhí)行,而不會(huì)產(chǎn)生機(jī)器語言代碼。

當(dāng)然,后來事情變得更加復(fù)雜。虛擬機(jī)(VM)的概念變得很流行,它實(shí)際上只是一種模仿軟件中的硬件機(jī)器的高級(jí)解釋器。虛擬機(jī)可以更輕松地將語言移植到新的硬件平臺(tái)。在這種情況下,VM的輸入語言通常是中間語言。例如,一種編程語言(例如Java)被編譯成一種中間語言(字節(jié)碼),然后在VM(JVM)上執(zhí)行。

另外,現(xiàn)在有即時(shí)(JIT)編譯器。JIT編譯器會(huì)在程序執(zhí)行期間運(yùn)行,并進(jìn)行即時(shí)編譯。在程序創(chuàng)建期間(運(yùn)行時(shí)之前)執(zhí)行的原始編譯器現(xiàn)在稱為提前(AOT)編譯器。

通常,只有靜態(tài)語言才適合將AOT編譯為本機(jī)機(jī)器代碼,因?yàn)闄C(jī)器語言通常需要知道數(shù)據(jù)的類型,而在動(dòng)態(tài)語言中,類型不是預(yù)先固定的。因此,通常會(huì)解釋動(dòng)態(tài)語言或編譯JIT。

在開發(fā)過程中 AOT 編譯,開發(fā)周期(從更改程序到能夠執(zhí)行程序以查看更改結(jié)果的時(shí)間)總是很慢。但是 AOT 編譯產(chǎn)生的程序可以更可預(yù)測地執(zhí)行,并且運(yùn)行時(shí)不需要停下來分析和編譯。AOT 編譯的程序也更快地開始執(zhí)行(因?yàn)樗鼈円呀?jīng)被編譯)。

相反,JIT編譯可提供更快的開發(fā)周期,但會(huì)導(dǎo)致執(zhí)行速度較慢或更加不穩(wěn)定。特別是,JIT編譯器的啟動(dòng)時(shí)間較慢,因?yàn)樵诔绦蜷_始運(yùn)行時(shí),JIT編譯器必須在執(zhí)行代碼之前進(jìn)行分析和編譯。研究表明,如果開始執(zhí)行需要花費(fèi)幾秒鐘的時(shí)間,那么很多人就會(huì)放棄該應(yīng)用程序。

以上就是 AOT 和 JIT 相關(guān)知識(shí),將 AOT 和 JIT 編譯的優(yōu)點(diǎn)結(jié)合起來不是很棒嗎?而Dart就是通過支持AOT 和 JIT 兩種類型的編譯而帶來顯著的優(yōu)勢。

編譯并執(zhí)行Dart

在研究Dart之前,Dart團(tuán)隊(duì)的成員已經(jīng)在高級(jí)編譯器和虛擬機(jī)上進(jìn)行了開創(chuàng)性的工作,既針對(duì)動(dòng)態(tài)語言(如JavaScript 的V8引擎,針對(duì)Smalltalk的Strongtalk)又針對(duì)靜態(tài)語言(如Java 的Hotspot編譯器)。他們利用這種經(jīng)驗(yàn)使Dart在如何進(jìn)行編譯和執(zhí)行方面異常靈活。

Dart是極少數(shù)適合于同時(shí)編譯AOT和JIT的語言之一。支持這兩種編譯為Dart和(尤其是Flutter)提供了明顯的優(yōu)勢。

在開發(fā)過程中使用JIT編譯,使用的編譯器特別快。然后,當(dāng)應(yīng)用程序準(zhǔn)備發(fā)布時(shí),將對(duì)其進(jìn)行AOT編譯。因此,借助先進(jìn)的工具和編譯器的幫助下,提供兩全其美的方案:極快的開發(fā)周期,并快速執(zhí)行和啟動(dòng)時(shí)間。

Dart在編譯和執(zhí)行方面的靈活性不止于此。例如,Dart可以編譯為JavaScript以便瀏覽器可以執(zhí)行。這允許在移動(dòng)應(yīng)用程序和Web應(yīng)用程序之間重復(fù)使用代碼。開發(fā)人員報(bào)告說,他們的移動(dòng)和Web應(yīng)用程序之間的代碼復(fù)用率高達(dá)70%。通過將Dart編譯成本機(jī)代碼,或編譯成JavaScript并將其與node.js結(jié)合使用,也可以在服務(wù)器上使用Dart 。

最后,Dart還提供了一個(gè)獨(dú)立的VM,該VM使用Dart語言本身作為其中間語言(本質(zhì)上像解釋器一樣工作)。

Dart可以有效地編譯AOT或JIT,解釋或轉(zhuǎn)換為其他語言。Dart的編譯和執(zhí)行不僅異常靈活,而且速度特別。

有狀態(tài)熱重載

Flutter最受歡迎的功能之一是其極快的熱重載。在開發(fā)期間,F(xiàn)lutter使用JIT編譯器,該編譯器通??梢栽谝幻腌妰?nèi)重新加載并繼續(xù)執(zhí)行代碼。只要有可能,應(yīng)用狀態(tài)就會(huì)在每次重新加載時(shí)保持不變,因此該應(yīng)用可以從中斷處繼續(xù)運(yùn)行。

除非您親自體驗(yàn)過,否則很難理解真正快速(可靠)的熱重載在開發(fā)過程中有多重要。Flutter的熱加載功能使嘗試新想法或嘗試替代方法變得容易得多,極大地促進(jìn)了創(chuàng)造力。

以下是一位移動(dòng)應(yīng)用程序開發(fā)人員對(duì)Flutter 熱重載的評(píng)價(jià):

我想測試熱重載,所以我改變了顏色,保存修改,結(jié)果……就喜歡上它了?!

這個(gè)功能真的很棒。我曾認(rèn)為 Visual Studio 中編輯和繼續(xù)(Edit & Continue)很好用,但這簡直令人驚嘆。有了這個(gè)功能,我認(rèn)為移動(dòng)開發(fā)者的生產(chǎn)力可以提高兩倍。

這對(duì)我來說真的是翻天覆地的變化。當(dāng)我部署代碼并花費(fèi)很長時(shí)間時(shí),我分心了,做了其他事情,當(dāng)我回到模擬器 / 設(shè)備時(shí),我就忘了想測試的內(nèi)容。有什么比花 5 分鐘將控件移動(dòng) 2px 更令人沮喪?有了 Flutter,這不再存在。

避免卡頓

一個(gè)快速的應(yīng)用程序是偉大的,但流暢的應(yīng)用程序,甚至更好。即使是超級(jí)快的動(dòng)畫,如果看起來很生澀,也會(huì)看起來很糟糕。但是,防止卡頓可能很困難,因?yàn)橐蛩靥?。Dart 有許多功能可以避免許多常見的導(dǎo)致卡頓的因素。

當(dāng)然,(像任何語言一樣)仍然可以在Flutter中編寫一個(gè)簡陋的應(yīng)用程序。Dart更具可預(yù)測性,可幫助開發(fā)人員更好地控制其應(yīng)用的平滑度,從而更輕松地提供最佳的用戶體驗(yàn),無所不能。

Flutter創(chuàng)建的用戶界面以60 fps的速度運(yùn)行,其性能遠(yuǎn)優(yōu)于其他跨平臺(tái)開發(fā)框架創(chuàng)建的用戶界面。

不僅比跨平臺(tái)應(yīng)用程序更好,而且與最佳本機(jī)應(yīng)用程序一樣好:

用戶界面非常流暢……我從未見過如此流暢的Android應(yīng)用。

AOT匯編和“橋梁”

我們討論過一個(gè)有助于保持順暢的特性,那就是 Dart 能 AOT 編譯為本地機(jī)器碼。預(yù)編譯的 AOT 代碼比 JIT 更具可預(yù)測性,因?yàn)樵谶\(yùn)行時(shí)不需要暫停執(zhí)行 JIT 分析或編譯。

但是,AOT編譯代碼有一個(gè)更大的優(yōu)勢,那就是避免了“ JavaScript橋梁”。當(dāng)動(dòng)態(tài)語言(例如JavaScript)需要與平臺(tái)上的本機(jī)代碼進(jìn)行互操作時(shí),它們必須通過網(wǎng)橋進(jìn)行通信,這會(huì)導(dǎo)致上下文切換必須保存大量的狀態(tài)(可能保存到輔助存儲(chǔ))。這些上下文切換是雙重打擊,因?yàn)樗鼈儾粌H使速度變慢,而且可能導(dǎo)致嚴(yán)重的問題。

注意:即使編譯的代碼也可能需要與平臺(tái)代碼進(jìn)行對(duì)話的接口,這也可以稱為橋接,但是通常比動(dòng)態(tài)語言所需的橋接要快幾個(gè)數(shù)量級(jí)。此外,由于Dart允許將小部件之類的內(nèi)容移入應(yīng)用程序,因此減少了跨過橋梁的需要。

搶先式調(diào)度,時(shí)間分片和共享資源

大多數(shù)支持多個(gè)并發(fā)執(zhí)行線程的計(jì)算機(jī)語言(包括Java,Kotlin,Objective-C和Swift)都使用搶占線程之間進(jìn)行切換。每個(gè)線程都分配了一個(gè)“執(zhí)行時(shí)間”,如果超過了分配的時(shí)間,則使用上下文切換來搶占該線程。但是,如果在更新線程(例如內(nèi)存)之間共享的資源時(shí)發(fā)生了搶占,則這會(huì)導(dǎo)致爭用條件。

競爭狀況是雙重打擊,因?yàn)樗鼈兛赡軐?dǎo)致嚴(yán)重的錯(cuò)誤,包括使應(yīng)用程序崩潰并導(dǎo)致數(shù)據(jù)丟失,而且由于依賴于獨(dú)立線程的相對(duì)時(shí)間,因此特別難以查找和修復(fù)它們。在調(diào)試器中運(yùn)行應(yīng)用程序時(shí),競爭條件會(huì)停止表現(xiàn)出來,這很常見。

解決爭用條件的典型方法是使用防止其他線程執(zhí)行的鎖來保護(hù)共享資源,但是鎖本身可能會(huì)導(dǎo)致棘手甚至更嚴(yán)重的問題(包括死鎖饑餓)。

Dart 采取了不同的方法來解決這個(gè)問題。Dart 中的線程稱為 isolate,不共享內(nèi)存,從而避免了大多數(shù)鎖。isolate 通過在通道上傳遞消息來通信,這與 Erlang 中的 actor 或 JavaScript 中的 Web Worker 相似。

Dart和JavaScript一樣,都是單線程的,這意味著它根本不允許搶占。相反,線程顯式地產(chǎn)生(使用async / await,F(xiàn)uturesStreams)。這使開發(fā)人員可以更好地控制執(zhí)行。單線程可幫助開發(fā)人員確保關(guān)鍵功能(包括動(dòng)畫和過渡)在沒有搶占的情況下得以執(zhí)行。這不僅對(duì)用戶界面,而且對(duì)于其他客戶端-服務(wù)器代碼,通常都是一個(gè)很大的優(yōu)勢。

當(dāng)然,如果開發(fā)人員忘記放棄控制,這可能會(huì)延遲其他代碼的執(zhí)行。但是,我們發(fā)現(xiàn),忘記屈服通常比忘記鎖定容易得多(因?yàn)楹茈y找到競爭條件)。

對(duì)象分配和垃圾回收

造成垃圾的另一個(gè)嚴(yán)重原因是垃圾收集。確實(shí),這只是訪問共享資源(內(nèi)存)的一種特殊情況,在許多語言中,這都需要使用鎖。但是在收集可用內(nèi)存時(shí),鎖可能會(huì)阻止整個(gè)應(yīng)用程序運(yùn)行。但是,Dart幾乎可以在沒有鎖的情況下幾乎始終執(zhí)行垃圾回收。

Dart 使用先進(jìn)的分代垃圾回收和對(duì)象分配方案,該方案對(duì)于分配許多短期對(duì)象(對(duì)于Flutter 這樣的反應(yīng)式用戶界面來說非常完美,F(xiàn)lutter 為每幀重建不可變視圖樹)而言非???。Dart 可以用一個(gè)指針凹凸分配一個(gè)對(duì)象(無需鎖定)。這將導(dǎo)致平滑的滾動(dòng)和動(dòng)畫效果,而不會(huì)產(chǎn)生現(xiàn)卡頓。

統(tǒng)一布局

Dart的另一個(gè)好處是Flutter不會(huì)在您的程序和其他模板化或布局語言(例如JSX或XML)之間拆分布局,也不需要單獨(dú)的可視化布局工具。這是用Dart編寫的簡單Flutter視圖:

Center(child:
  Column(children: [
    Text('Hello, World!'),
    Icon(Icons.star, color: Colors.green),
  ])
)

但是,我知道您可能在想什么- 缺少專門的布局語言如何被稱為優(yōu)勢?但它確實(shí)是顛覆性的。這是開發(fā)人員在題為“ 為什么本機(jī)應(yīng)用程序開發(fā)人員應(yīng)認(rèn)真看待Flutter ” 的文章中寫的。

在 Flutter 里,界面布局直接通過 Dart 編碼來定義,不需要使用 XML 或模板語言,也不需要使用可視化設(shè)計(jì)器之類的工具。

我的預(yù)感是,聽到這個(gè)消息后,你們中的一些人甚至?xí)房s一點(diǎn)。表面看來,這也是我的反應(yīng)。使用視覺工具進(jìn)行布局難道不是一件容易的事。用代碼編寫各種約束邏輯會(huì)不會(huì)使事情變得過于復(fù)雜?

結(jié)果不然。天啊,它簡直讓我大開眼界。

答案的第一部分是上面提到的熱重載。

這比 Android 的 Instant Run 和任何類似解決方案不知道要領(lǐng)先多少年。對(duì)于大型的應(yīng)用同樣適用。如此快的速度,正是 Dart 的優(yōu)勢所在。

實(shí)際上,可視化編輯器就變得多余了。我一點(diǎn)都不懷戀 XCode 的自動(dòng)重布局。

Dart 創(chuàng)建的布局簡潔且易于理解,而“超快”的熱重載可立即看到結(jié)果。這包括布局的非靜態(tài)部分。

結(jié)果,在 Flutter 中進(jìn)行布局要比在 Android/XCode 中快得多。一旦你掌握了它(我花了幾個(gè)星期),由于很少發(fā)生上下文切換,因此會(huì)節(jié)省大量的開銷。不必切換到設(shè)計(jì)模式,選擇鼠標(biāo)并開始點(diǎn)擊,然后想是否有些東西必須通過編程來完成,如何實(shí)現(xiàn)等等。因?yàn)橐磺卸际浅绦蚧摹6疫@些 API 設(shè)計(jì)得非常好。它很直觀,并且比自動(dòng)布局 XML 更強(qiáng)大。

例如,下面是一個(gè)簡單的列表布局,該列表布局以編程方式定義的所有其他項(xiàng)目之間添加了分隔線(水平線):

return new ListView.builder(itemBuilder: (context, i) {
  if (i.isOdd) return new Divider(); 
  // rest of function
});

在 Flutter 中,無論是靜態(tài)布局還是編程布局,所有布局都存在于同一個(gè)位置。新的Dart 工具,包括Flutter Inspector 和大綱視圖(利用所有的布局定義都在代碼里)使復(fù)雜而美觀的布局更加容易。

Dart是專有語言嗎?

不,Dart(如 Flutter)是完全開源的,具備清楚的許可證,同時(shí)也是 ECMA 標(biāo)準(zhǔn)的。Dart 在 Google 內(nèi)外很受歡迎。在谷歌內(nèi)部,它是增長最快的語言之一,并被 Adwords、Flutter、 Fuchsia 和其他產(chǎn)品使用;在谷歌外部,Dart 代碼庫有超過 100 個(gè)外部提交者。

Dart開放性的更好指標(biāo)是Google以外社區(qū)的發(fā)展。例如,我們看到來自第三方的Dart文章和視頻源源不斷(包括Flutter和AngularDart),我在本文中引用了其中的一些。

除了Dart本身的外部提交者之外,公共Dart軟件包存儲(chǔ)庫中還有3000多個(gè)軟件包,包括Firebase,Redux,RxDart,國際化,加密,數(shù)據(jù)庫,路由,集合等的庫。

Dart程序員會(huì)容易找到嗎?

如果沒有很多程序員知道Dart,找到合格的程序員會(huì)更困難嗎?當(dāng)然不是,Dart使它更容易找到程序員,因?yàn)樗且环N非??焖偾乙子趯W(xué)習(xí)的語言。Java,JavaScript,Kotlin,C?;騍wift等語言的程序員幾乎可以立即在Dart中開始編程。最重要的是,熱重載鼓勵(lì)用戶玩Dart并嘗試新事物,這使得學(xué)習(xí)Dart更快,更愉快。

這是一個(gè)程序員在題為“ 為什么Flutter將在2018年騰飛 ”的文章中所說的:

Dart是用于開發(fā)Flutter應(yīng)用程序的語言,學(xué)習(xí)起來很容易。Google擁有創(chuàng)建簡單,記錄良好的語言(例如Go)的經(jīng)驗(yàn)。到目前為止,對(duì)我而言,Dart使我想起了Ruby,這是一種學(xué)習(xí)的樂趣。它不僅適用于移動(dòng)設(shè)備,也適用于Web 開發(fā)。

另一篇關(guān)于Flutter和Dart的文章,標(biāo)題為“ 為什么要Flutter?而不是框架X?甚至更好,為什么我要全力以赴。

Flutter使用由Google創(chuàng)建的Dart語言,說實(shí)話,我不喜歡C?;騄AVA之類的強(qiáng)類型語言,但我不知道Dart編寫代碼的方式為什么看起來有所不同。我寫起來很舒服。也許是因?yàn)樗浅:唵我讓W(xué)。

通過廣泛的UX研究和測試,Dart專門設(shè)計(jì)為熟悉且易于學(xué)習(xí)。例如,在2017年上半年,F(xiàn)lutter團(tuán)隊(duì)與八名開發(fā)人員進(jìn)行了UX研究。我們向他們簡要介紹了Flutter,然后將它們松散了一個(gè)小時(shí)左右,以創(chuàng)建一個(gè)簡單的視圖。所有參與者都能夠立即開始編程,即使他們以前從未使用過Dart。他們專注于編寫響應(yīng)式視圖,而不是語言。Dart 直接就能上手用了。

最后,一位參與者(在任務(wù)中取得了特別大的進(jìn)步)沒有提及該語言,因此我們?cè)儐査麄兪欠褚庾R(shí)到自己使用的是哪種語言。他們不知道。語言沒關(guān)系 ; 他們?cè)趲追昼妰?nèi)就可以在Dart中編程。

學(xué)習(xí)新系統(tǒng)的難點(diǎn)通常不是學(xué)習(xí)語言,而是學(xué)習(xí)所有編寫好的代碼的庫,框架,工具,模式和最佳實(shí)踐。而且Dart庫和工具都非常出色,并且文檔齊全。一篇文章宣稱:“作為獎(jiǎng)勵(lì),他們還非常注意自己的代碼庫,并且擁有我見過的最好的文檔?!?學(xué)習(xí)Dart只需花很少的精力就可以通過節(jié)省學(xué)習(xí)其余時(shí)間的時(shí)間來彌補(bǔ)。

作為直接的證據(jù),Google內(nèi)部的一個(gè)大型項(xiàng)目希望將其移動(dòng)應(yīng)用程序移植到iOS。他們打算雇用一些iOS程序員,但決定嘗試Flutter。他們監(jiān)控了使開發(fā)人員快速掌握Flutter所花費(fèi)的時(shí)間。他們的結(jié)果表明,程序員可以在三周內(nèi)學(xué)習(xí)Dart Flutter并提高工作效率。相比之下,他們之前觀察到的五個(gè)星期可以使程序員僅在Android上就可以上手(更不用說他們必須雇用和培訓(xùn)iOS的開發(fā)人員)。

最后,文章“ 我們?yōu)槭裁催x擇Flutter以及它如何使我們的公司變得更好 ”來自一家將大型企業(yè)應(yīng)用程序遷移到所有三個(gè)平臺(tái)(iOS,Android和Web)上的Dart的公司。他們的結(jié)論:

招人變得容易多了。無論他們是來自 Web、iOS 還是 Android,我們現(xiàn)在都希望接受最佳人選。

現(xiàn)在我們擁有 3 倍的工作效率,因?yàn)槲覀兯械膱F(tuán)隊(duì)都集中在一個(gè)代碼庫上。

知識(shí)共享達(dá)到前所未有的高度。

通過使用Dart和Flutter,他們能夠?qū)?em>生產(chǎn)力提高三倍。鑒于他們之前所做的事情,這不足為奇。與許多公司一樣,他們正在使用獨(dú)立的語言,工具和程序員為每個(gè)平臺(tái)(Web,iOS和Android)構(gòu)建獨(dú)立的應(yīng)用程序。改用Dart意味著他們不再需要雇用三種不同的程序員。對(duì)于他們來說,將現(xiàn)有的程序員轉(zhuǎn)移到Dart上很容易。

他們和其他人發(fā)現(xiàn),一旦程序員開始使用Flutter,他們通常會(huì)愛上Dart。他們喜歡語言的簡潔性和缺乏儀式感。他們喜歡語言功能,例如級(jí)聯(lián),命名參數(shù),異步/等待和流。最重要的是,他們喜歡Dart所提供的Flutter功能(例如熱重載),而Dart幫助他們構(gòu)建的漂亮,高性能的應(yīng)用程序。

秘訣就是專注

Dart 2中的改進(jìn)集中在優(yōu)化客戶端開發(fā)上。但是Dart仍然是構(gòu)建服務(wù)器端,臺(tái)式機(jī),嵌入式系統(tǒng)或其他程序的絕佳語言。

專注是一件好事。專注于幾乎可以使所有持久的流行語言受益。例如:

  • C是用于編寫操作系統(tǒng)和編譯器的系統(tǒng)編程語言。它變得更多了。
  • Java是為嵌入式系統(tǒng)設(shè)計(jì)的語言。
  • JavaScript是Web瀏覽器的腳本語言(?。?/li>
  • 甚至備受反對(duì)的PHP也成功了,因?yàn)樗鼘W⒂诰帉憽皞€(gè)人主頁”(并以此為名)。

另一方面,許多語言已經(jīng)明確嘗試(但失?。┏蔀橥耆ㄓ玫恼Z言,例如PL / 1和Ada等。最常見的問題是,沒有集中注意力,這些語言就成了眾所周知的廚房水槽。

使Dart成為出色的客戶端語言的許多功能也使它成為服務(wù)器端使用的更好語言。例如,Dart避免了搶先式多任務(wù)這一事實(shí)使它具有與服務(wù)器上的Node相同的優(yōu)勢,但打字效果更好,更安全。

為嵌入式系統(tǒng)編寫軟件也是如此。Dart可靠地處理多個(gè)并發(fā)輸入的能力是關(guān)鍵。

最后,Dart在客戶端上的成功將不可避免地引起更多在服務(wù)器上使用它的興趣-就像JavaScript和Node發(fā)生的情況一樣。為什么要強(qiáng)迫人們使用兩種不同的語言來構(gòu)建客戶端服務(wù)器軟件?

結(jié)論

這對(duì)于 Dart 來說是一個(gè)激動(dòng)人心的時(shí)刻。使用 Dart 的人喜歡它,而 Dart 2 中的新特性使其成為你工具庫中更有價(jià)值的補(bǔ)充。如果您沒有使用Dart,希望本文為您提供有關(guān)Dart的新功能或不同之處的有價(jià)值的信息,并且您可以嘗試使用它和Flutter。

查看英文原文: https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf

交流

老孟Flutter博客地址(近200個(gè)控件用法):http://laomengit.com

歡迎加入Flutter交流群(微信:laomengit)、關(guān)注公眾號(hào)【老孟Flutter】:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容