真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

flutter普及率,flutter發(fā)展

編程時選用的程序設(shè)計語言,對軟件的開發(fā)與維護的影響?

【CSDN 編者按】“如果我們把人類文明想象成汽車的話,那么軟件開發(fā)行業(yè)就相當(dāng)于汽車的引擎,編程語言就像引擎的燃料?!弊鳛橐幻_發(fā)者,需跟隨技術(shù)潮流的發(fā)展來學(xué)習(xí)新技術(shù)。2020年,你有計劃新學(xué)一門編程語言嗎?

山西ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

本文作者從一名架構(gòu)師的角度,詳細分析了7種現(xiàn)代編程語言的優(yōu)點與功能,你對哪門語言最感興趣呢?

作者 | Md Kamaruzzaman,軟件架構(gòu)師

譯者 | 彎月,責(zé)編 | 伍杏玲

封圖| CSDN 下載于視覺中國

出品 | CSDN(ID:CSDNnews)

以下為譯文:

如果我們把人類文明想象成汽車的話,那么軟件開發(fā)行業(yè)就相當(dāng)于汽車的引擎,而編程語言就像引擎的燃料。作為一名開發(fā)者,今年你應(yīng)該學(xué)習(xí)哪種編程語言呢?

學(xué)習(xí)一種新的編程語言無疑是時間、精力和智力上的巨大投資, 但是學(xué)習(xí)一種新的編程語言可以提升你的軟件開發(fā)技術(shù)力,促進你的職業(yè)發(fā)展。

在這里,我將獻上一份現(xiàn)代編程語言的列表,這些語言不僅有助于提高你的生產(chǎn)力,而且還可以促進你的職業(yè)發(fā)展,并讓你成長為更優(yōu)秀的開發(fā)人員。這份列表還涵蓋了非常廣泛的領(lǐng)域:系統(tǒng)編程、應(yīng)用程序開發(fā)、Web開發(fā)、科學(xué)計算等。

什么是現(xiàn)代編程語言?

“現(xiàn)代編程語言”這個說法本身就很含糊。許多人認為Python和JavaScript等語言是現(xiàn)代編程語言,還認為Java是一種古老的編程語言。實際上,這幾種語言大約在同一時間出現(xiàn):1995年。

大多數(shù)主流編程語言是上個世紀開發(fā)的:七十年代(如C)、八十年代(如C ++)、九十年代(如Java、Python、JavaScript)。這些語言在設(shè)計上并沒有考慮現(xiàn)代軟件開發(fā)生態(tài)系統(tǒng):多核CPU、GPU、快速的互聯(lián)網(wǎng)、移動設(shè)備、容器和云等。盡管許多語言中的許多功能都已進行一些改進,如并發(fā)等,而且在不斷調(diào)整自己以適應(yīng)時代,但它們依然保留了向后兼容性,無法拋棄那些過時的舊功能。

在這方面,Python就做得很好(某種意義上也未必是好事),Python 2和Python 3兩者之間有明確的分界線。很多語言常常會為解決同一個問題提供十余種的方法,同時又沒有顧及到開發(fā)人員的感受。根據(jù)StackOverflow的開發(fā)人員調(diào)查,大多數(shù)舊時的主流編程語言在“最可怕的語言”排名都名列前茅:

如果非要在新舊編程語言之間劃個界限的話,那么應(yīng)該是2007年6月29日,也就是第一臺iPhone發(fā)行的時候。在這之后,編程語言界發(fā)生了很大變化。因此,在本文的列表中,我只考慮2007年以后的編程語言。

為什么要學(xué)習(xí)新語言?

首先,現(xiàn)代編程語言充分利用現(xiàn)代計算機硬件(多核CPU、GPU、TPU)、移動設(shè)備、大量數(shù)據(jù)、高速互聯(lián)網(wǎng)、容器和云的優(yōu)勢。大多數(shù)現(xiàn)代編程語言會關(guān)注開發(fā)人員的體驗,比如:

簡潔明了的代碼(減少樣板代碼)

內(nèi)置的并發(fā)支持

空指針安全

類型推斷

簡潔的功能集

降低學(xué)習(xí)難度

融合所有編程范例的最佳功能

本文列表的許多編程語言都帶有革命性地變化,并將永久地改變軟件行業(yè)。一些已成為主流編程語言,還有一些則有望取得突破。因此選擇這些語言作為第二種編程語言是明智的做法。

Rust

一直以來,系統(tǒng)編程語言環(huán)境主要由靠近硬件的語言(如C、C ++等)主導(dǎo)。盡管它們可以完全控制程序和硬件,但是它們?nèi)狈?nèi)存安全性。即使它們支持并發(fā),使用C/C ++編寫并發(fā)程序也很困難,因為沒有并發(fā)安全性。還有一些流行的編程語言是解釋性語言,例如Java、Python、Haskell。這些語言具備安全性,但需要龐大的運行時或虛擬機。由于它們的運行時間長,因此Java等語言不適合于系統(tǒng)編程。

許多人曾嘗試將C/C ++的功能與Java、Haskell的安全性相結(jié)合。然而,Rust才是第一個成功實現(xiàn)了這一點的編程語言。

Graydon Hoare在業(yè)余項目中開發(fā)出了Rust,他的靈感來自研究編程語言Cyclone。Rust是開源的,由Mozilla與許多其他公司和社區(qū)一起領(lǐng)導(dǎo)這門語言的開發(fā)。Rust于2015年首次發(fā)布,并很快引起了社區(qū)的關(guān)注。

主要特征:

通過所有權(quán)和借用概念提供內(nèi)存安全和并發(fā)安全。

內(nèi)存安全和并發(fā)安全在編譯時確保,即如果程序代碼可以編譯,那么內(nèi)存既安全又沒有數(shù)據(jù)競爭。這是Rust最吸引人的功能。

它還提供了Haskell中元編程的表現(xiàn)力。憑借不可變的數(shù)據(jù)結(jié)構(gòu)和功能編程功能,Rust提供了功能并發(fā)和數(shù)據(jù)并發(fā)。

Rust的速度非???,純Rust的性能甚至優(yōu)于純C。

在沒有運行時的情況下,Rust可以完全控制現(xiàn)代硬件(TPU、GPU、多核CPU)。

Rust具有LLVM支持。因此,Rust提供一流的與WebAssembly的互操作性,而且Web代碼也非??臁?/p>

流行度:

自2015年首次亮相以來,Rust已被開發(fā)人員廣泛接受,并在StackOverflow開發(fā)人員調(diào)查中連續(xù)四年(2016、2017、2018、2019)被評選為最受歡迎的語言:

根據(jù)GitHub Octoverse的調(diào)查,Rust是運行速度第二快的語言,僅次于Dart:

此外,根據(jù)編程語言流行度排名網(wǎng)站PyPl的數(shù)據(jù),Rust排名第18位,并呈上升趨勢:

對比Rust提供的功能集,我們就會明白為什么微軟、亞馬遜、Google等科技巨頭相繼宣布投資Rust作為一種長期的系統(tǒng)編程語言。

根據(jù)Google統(tǒng)計的趨勢,在過去的5年中,Rust的熱度每年都在增加。

主要用途:

系統(tǒng)編程

Serverless 計算

商業(yè)應(yīng)用

主要競爭對手:

C

C++

Go

Swift

Go

在本世紀初,Google面臨兩個擴展問題:開發(fā)擴展和應(yīng)用程序擴展。開發(fā)擴展問題指的是他們不能僅通過投入開發(fā)人員的方式來添加更多功能。應(yīng)用程序擴展問題則指他們無法開發(fā)出一款能夠擴展到Google級別的計算機集群的應(yīng)用程序。

所以在2007年左右,Google創(chuàng)建了一種新的編程語言,用于解決這兩個擴展問題。兩位才華橫溢的Google軟件工程師Rob Pike(UTF-8)和Ken Thompson(UNIX OS)創(chuàng)建了一種新語言。

2012年,Google正式發(fā)布了第一版的Go編程語言。Go是一種系統(tǒng)編程語言,但與Rust不同,它還具有Runtime和垃圾收集器(幾兆字節(jié))。但是與Java或Python不同,這個Runtime包含了生成的代碼。最后,Go生成了一個本地的二進制代碼,可以在沒有附加依賴項或運行時的情況下在計算機中運行。

主要特征:

Go具有一流的并發(fā)支持。Go不通過線程和鎖提供“共享內(nèi)存”并發(fā)性,因為編程難度太大。相反,它提供了基于CSP的消息傳遞并發(fā)性(基于Tony Hoare的論文)。Go使用“ Goroutine”(輕量級綠色線程)和“ Channel”進行消息傳遞。

Go最大的殺手級功能是:簡單,它是最簡單的系統(tǒng)編程語言。新手軟件開發(fā)人員只需幾天就可以編寫高效的代碼,就像Python一樣。有些大規(guī)模的云原生項目(如Kubernetes、Docker)都是用Go編寫的。

Go還內(nèi)置了垃圾收集器,這意味著開發(fā)人員無需擔(dān)心C/C++中的內(nèi)存管理問題。

Google投入了大量資金打造Go。因此Go擁有大量的工具支持。新手Go開發(fā)人員擁有大量的工具生態(tài)系統(tǒng)。

一般,開發(fā)人員80%的時間都花在了維護現(xiàn)有代碼上,用于編寫新代碼的時間只占20%。由于其簡單性,Go在語言維護方面表現(xiàn)出色。如今,Go在業(yè)務(wù)應(yīng)用程序中大量使用。

流行度:

Go一問世就受到了軟件開發(fā)社區(qū)熱烈的歡迎。2009年-2018年,Go一直在TIOBE編程語言排行榜上徘徊。Go的成功為Rust等新一代編程語言鋪平了道路。

如今,Go已是主流編程語言。最近,Go團隊宣布了有關(guān)“Go 2”的消息,這門編程語言的發(fā)展會更加穩(wěn)固。

幾乎在所有的流行編程語言排行榜中,Go的排名都很高,已超過許多現(xiàn)有的語言。自2019年12月以來,在TIOBE指數(shù)排名中,Go名列第15位:

根據(jù)StackOverFlow的調(diào)查,十大最受喜愛的編程語言中,Go也位列其中:

此外,根據(jù)GitHub的數(shù)據(jù),Go也是十大發(fā)展最迅速的語言之一:

Google趨勢顯示,在過去的5年中,Go的熱度每年都在增加。

主要用途:

系統(tǒng)編程

Serverless 計算

商業(yè)應(yīng)用

云原生開發(fā)

主要競爭對手:

C

C++

Rust

Python

Java

Kotlin

Java 是企業(yè)軟件開發(fā)領(lǐng)域無可爭議的王者。近年來,Java受到了一些負面評論:過于冗長,大量樣板代碼,容易出現(xiàn)意外的復(fù)雜性。但是,關(guān)于Java虛擬機(JVM)的爭論卻很少。JVM是軟件工程的杰作,經(jīng)過了時間的考驗,提供了硬核的runtime。

多年來,Scala等JVM語言一直在努力克服Java的缺點,想成為更好的Java,但他們都失敗了。最終,這場提升Java的探索以Kotlin的誕生結(jié)束。Jet Brains(流行的IDE IntelliJ背后的公司)開發(fā)了Kotlin,它可以在JVM上運行,克服了Java的很多缺點,提供許多現(xiàn)代功能。

與Scala不同的是,Kotlin比Java更簡單,還可在JVM中提供與Go或Python開發(fā)人員同等的生產(chǎn)力。

Google宣布Kotlin是一流的Android應(yīng)用開發(fā)語言,因此Kotlin在社區(qū)中的接受度得到了大幅提高。自2017年以來,同樣受歡迎的Java Enterprise框架Spring也開始支持Kotlin。我曾嘗試結(jié)合Kotlin與Reactive Spring使用,體驗非常棒。

主要特征:

Kotlin的主要賣點在于其語言設(shè)計。我總是將Kotlin視為JVM上的Go/Python,因為它簡潔明了的代碼。因此,Kotlin的生產(chǎn)力很高。

與許多其他現(xiàn)代語言一樣,Kotlin提供了Null指針、安全性、類型推斷等功能。

由于Kotlin也運行在JVM中,因此現(xiàn)有Java庫龐大的生態(tài)系統(tǒng)都可供使用。

Kotlin是一流的Android應(yīng)用開發(fā)語言,并且已經(jīng)超過Java,成為開發(fā)Android應(yīng)用的首選。

Kotlin得到了JetBrains和Open Source的支持,因此具有出色的工具支持。

Kotlin有兩個有趣的項目:Kotlin Native(將Kotlin編譯為原生代碼)和kotlin.js(Kotlin到JavaScript)。如果成功,則可以在JVM外部使用Kotlin。

Kotlin還提供了一種簡單的方式來編寫DSL(域特定語言)。

流行度:

自2015年首次發(fā)布以來,Kotlin的知名度不斷飆升。根據(jù)Stack Overflow,Kotlin是2019年第四大最受歡迎的編程語言:

Kotlin還是增長最快的編程語言之一,排名第四:

在流行編程語言排名網(wǎng)站PyPl的排名中,Kotlin名列第十二名,并具有較高的上升趨勢:

自從Google宣布Kotlin是一流的Android應(yīng)用開發(fā)語言以來,Kotlin的流行趨勢出現(xiàn)了大幅上漲,如下所示:

主要用途:

企業(yè)應(yīng)用程序

主要競爭對手:

TypeScript

JavaScript是一門優(yōu)秀的編程語言,在2015年之前,JavaScript有很多缺點。著名的軟件工程師Douglas Crockford寫了一本書名為《JavaScript: The Good Parts》,暗示了JavaScript有很糟的部分。無模塊化,還有“回調(diào)地獄”,因此開發(fā)人員都不喜歡維護特別大的JavaScript項目。

Google甚至還開發(fā)了一個平臺,可將Java代碼反編譯為JavaScript代碼(GWT)。許多公司和個人都曾嘗試開發(fā)更好的JavaScript,例如CoffeeScript、Flow、ClojureScript。最終,微軟的TypeScript取得了成功。

微軟的一隊工程師在著名的Anders Hejlsberg的帶領(lǐng)下,創(chuàng)建了JavaScript的靜態(tài)類型、模塊化超集——TypeScript。

TypeScript可以編譯為JavaScript。于2014年首次發(fā)布后,TypeScript很快引起了社區(qū)的關(guān)注。Google當(dāng)時還計劃開發(fā)JavaScript的靜態(tài)類型超集。Google對TypeScript青睞有加,以至于他們沒有開發(fā)新的語言,而是選擇與微軟合作改進TypeScript。

Google選擇TypeScript作為其SPA框架Angular 2+的主要編程語言。此外,流行的SPA框架React也提供對TypeScript的支持。另一個流行的JavaScript框架Vue.js也宣布將使用TypeScript開發(fā)新的Vue.js 3:

另外,node.js的創(chuàng)建者Ryan Dahl已決定使用TypeScript來開發(fā)安全的Node.js替代品Deno。

主要特征:

流行度:

開發(fā)人員喜歡TypeScript的優(yōu)雅語言設(shè)計。在StackOverFlow最受歡迎的語言類別的調(diào)查中,TypeScript與Python并列第二名:

根據(jù)GitHub的排名,TypeScript是增長最快的編程語言之一,排名第五:

從GitHub的貢獻度來看,TypeScript排名第七,打進了前十:

Google的趨勢表明,在過去的幾年中,TypeScript的熱度越來越高:

主要用途:

主要競爭對手:

Swift

當(dāng)初喬布斯拒絕在iOS中支持Java(和JVM),他認為Java不再是主流編程語言。如今我們發(fā)現(xiàn)喬布斯當(dāng)初的估計是錯的,雖然iOS仍然不支持Java。蘋果選擇了Objective-C作為iOS中的首選編程語言。Objective-C是一門很難掌握的語言,它不支持現(xiàn)代編程語言所要求的高生產(chǎn)力。

后來,蘋果的Chris Lattner和其他人開發(fā)了一種多范例、通用的、編譯編程語言——Swift,來替代Objective-C。Swift的第一個穩(wěn)定版本于2014年發(fā)布。Swift還支持LLVM編譯器工具鏈(也由Chris Lattner開發(fā))。Swift與Objective-C代碼庫具有出色的互操作性,并且已確立為iOS應(yīng)用開發(fā)中的主要編程語言。

主要特征:

流行度:

開發(fā)人員對Swift的喜愛不亞于許多其他現(xiàn)代編程語言。根據(jù)StackOverflow的調(diào)查,Swift在最受歡迎的編程語言中排名第六:

2019年,在TIOBE的編程語言排名中,Swift的排名上升到了第10名。鑒于這種編程語言只有5年的歷史,可以說是成績斐然:

Google的趨勢表明,在過去的幾年中,Swift的熱度出現(xiàn)了激增:

主要用途:

主要競爭對手:

Dart

Dart是Google出品的第二大編程語言。Google是Web和Android領(lǐng)域的巨頭,因此Google在Web和應(yīng)用領(lǐng)域開發(fā)自己的編程語言也不足為奇。在丹麥軟件工程師Lars Bak(領(lǐng)導(dǎo)Chrome的 JavaScript V8引擎開發(fā))的帶領(lǐng)下,Google于2013年發(fā)布了Dart。

Dart是一種通用編程語言,支持“強類型”和“面向?qū)ο蟆本幊獭art也可以轉(zhuǎn)編譯為JavaScript,凡是JavaScript可以運行的任何地方(例如Web、移動、服務(wù)器)幾乎都可以運行 Dart。

主要特征:

流行度:

根據(jù)GitHub Octoverse數(shù)據(jù)顯示,Dart是2019年增長最快的編程語言,去年它的流行度增長了五倍:

根據(jù)TIOBE指數(shù)顯示,Dart排名第23,僅用了4年時間就超過了很多其他的現(xiàn)代編程語言:

根據(jù)StackOverflow的調(diào)查,Dart在最受歡迎的編程語言中排名第12:

受Flutter的影響,Google的趨勢表明,在過去的兩年中,Dart的熱度急劇上升:

主要用途:

主要競爭對手:

Julia

本文提及的大多數(shù)編程語言都是由大型公司開發(fā)的,但Julia是個例外??萍加嬎泐I(lǐng)域通常都會使用動態(tài)語言,例如Python、Matlab。雖然這些語言提供易于使用的語法,但不適用于大規(guī)模的科技計算。他們需要使用C/C ++庫執(zhí)行CPU密集型任務(wù),因此這就產(chǎn)生了著名的“兩種語言”的問題,因為他們需要粘合代碼來綁定兩種語言。由于編寫的代碼需要在兩種語言之間來回切換,因此總是會損失部分性能。

為了解決這個問題,麻省理工學(xué)院的一隊研究人員計劃從頭開始創(chuàng)建一種新的語言,這種語言既可以利用現(xiàn)代硬件的優(yōu)勢,而且還結(jié)合其他語言的優(yōu)勢。于是,Julia誕生了。

Julia是一種動態(tài)的高級編程語言,提供一流的并發(fā)、并行和分布式計算支持。Julia的第一個穩(wěn)定版本于2018年發(fā)布,并很快受到社區(qū)和行業(yè)的關(guān)注。Julia可用于科學(xué)計算、人工智能和許多其他領(lǐng)域,而且還可以解決“兩種語言”的問題。

主要特征:

流行度:

Julia在許多領(lǐng)域主要與Python競爭。由于Python是最流行的編程語言之一,因此Julia想晉升主流還需要幾年的時間。

雖然Julia非常新(只有一歲),但仍在TIOBE指數(shù)中排到第43名:

Google趨勢顯示,在過去的一年中,Julia的熱度在穩(wěn)步增長:

但是考慮到Julia的功能集,以及NSF、DARPA、NASA、因特爾等公司的推動,相信Julia取得突破的進展只是時間的問題。

主要用途:

主要競爭對手:

原文鏈接:

本文為 CSDN 翻譯,轉(zhuǎn)載請注明來源出處。

【End】

Python

Matlab

科學(xué)計算

高性能計算

數(shù)據(jù)科學(xué)

可視化

與Rust一樣,Julia的主要特征在于語言的設(shè)計。這種語言在不犧牲性能的情況下,將高性能和科學(xué)計算中現(xiàn)有編程語言的一些功能結(jié)合在一起。就目前的情況來看,Julia出色地完成了這項任務(wù)。

Julia是一種動態(tài)編程語言,支持類型系統(tǒng)但類型不是必須的。因此,Julia這種編程語言很容易學(xué)習(xí),生產(chǎn)力很高。

Julia的核心是多調(diào)度編程范例。

Julia內(nèi)部支持并發(fā)、并行和分布式計算。

Julia為I/O密集型任務(wù)提供異步I/O。

Julia的運行速度非??欤捎糜谛枰獢?shù)百萬個線程的科學(xué)計算。

JavaScript

TypeScript

應(yīng)用開發(fā)

UI開發(fā)

與Go一樣,Dart也非常注重開發(fā)人員的工作效率。由于Dart簡潔的語法,以及高效的生產(chǎn)力,受到開發(fā)人員的喜愛。

Dart還提供“強類型”和“面向?qū)ο蟆本幊獭?/p>

Dart是少數(shù)同時支持JIT編譯(運行時編譯)和AOT編譯(創(chuàng)建時編譯)的編程語言之一。因此,Dart可以針對JavaScript運行時(V8引擎),并且Dart可以編譯為快速的原生代碼(AOT編譯)。

跨平臺原生應(yīng)用程序開發(fā)平臺Flutter選擇了Dart作為開發(fā)iOS和Android應(yīng)用的編程語言。從那以后,Dart的流行度越來越高。

與Goog的Go編程語言一樣,Dart也具有出色的工具支持和龐大的Flutter生態(tài)系統(tǒng)。Flutter的日益普及也會推動Dart的采用率升高。

Objective-C

Rust

Go

iOS應(yīng)用開發(fā)

系統(tǒng)編程

客戶端開發(fā)(通過WebAssembly)

Swift的殺手級功能之一是其語言設(shè)計。語言本身很簡單,語法簡潔,比Objective-C更高效。

Swift還提供了現(xiàn)代程序語言的功能:null安全。此外,它還提供了語法糖來避免“厄運金字塔”。

作為一種編譯語言,Swift和C++一樣快。

Swift支持LLVM編譯器工具鏈。因此,我們可以在服務(wù)器端編程,甚至瀏覽器編程(使用WebAssembly)中使用Swift。

Swift提供了自動引用計數(shù)(ARC)支持,可抑制內(nèi)存管理的不善。

JavaScript

Dart

Web UI開發(fā)

服務(wù)器端開發(fā)

與Go或Kotlin同樣,TypeScript的主要特征也是語言設(shè)計。TypeScript憑借其簡潔明快的代碼,成為了目前最優(yōu)雅的編程語言之一。就開發(fā)人員的生產(chǎn)力而言,它與JVM或Go/Python上的Kotlin并駕齊驅(qū)。TypeScript是生產(chǎn)力最高的JavaScript超集。

TypeScript是JavaScript的強類型超集,特別適合大型項目,而且可以稱為“可擴展的JavaScript”。

單頁應(yīng)用程序框架的“三巨頭”(Angular、React、Vue.js)為TypeScript提供了出色的支持。在Angular中,TypeScript是首選的編程語言。在React和Vue.js中,TypeScript越來越受歡迎。

最大的兩家技術(shù)巨頭:微軟和Google正在合作開發(fā)由活躍的開源社區(qū)支持的TypeScript。因此,TypeScript擁有最好的工具支持。

由于TypeScript是JavaScript的超集,因此凡是可以運行JavaScript的任何地方都可以運行TypeScript,包括瀏覽器、服務(wù)器、移動設(shè)備、物聯(lián)網(wǎng)設(shè)備和云。

Java

Scala

Python

Go

Flutter入門這一篇效率文章就夠了

本文面向 Flutter 初學(xué)者,旨在用易懂的方式帶大家入門。除了 Flutter 代碼,還會介紹到語法、原理、特性等基礎(chǔ)知識。相信本文能幫助你學(xué)習(xí)和理解 Flutter。

我們先看一下目前的一些跨平臺方案,從前端渲染的角度來分類的話,大致可以分為以下幾種方案。

WebView 渲染

這種方案就很好理解,現(xiàn)在很多項目都會嵌入 H5 的頁面。就是用 JavaScript 等前端技術(shù)進行開發(fā),在客戶端上用 WebView 來進行渲染。微信小程序目前使用的就是這種方案。

它的優(yōu)點很明顯,使用成熟的前端技術(shù)進行開發(fā),學(xué)習(xí)成本低,開發(fā)效率高,并且支持動態(tài)發(fā)布代碼。

但缺點也很明顯,在性能體驗上,和原生還是存在較大差距的。

原生控件渲染

既然 WebView 的性能不夠好,于是就有了使用原生控件進行渲染的方案。這種方案,同樣也是使用 JavaScript 開發(fā),區(qū)別是它最終是調(diào)用原生控件進行渲染的。這種方案的代表是 Facebook 的 React Native。

由于使用原生控件進行渲染,性能體驗也會更接近原生。但也只是更接近,和原生還是有差距的,因為它需要頻繁的進行 JavaScript 和原生之間的通信,這個通信效率是比較低的。

另外,由于需要適配各個平臺的控件,那就有可能出現(xiàn),系統(tǒng)控件更新了,而框架本身還沒有更新,由此產(chǎn)生了一些問題。換句話說,這種方案是受到原生控件限制的。

繪圖引擎渲染

接下來就是主角了。

在前端,如果完全不使用原生控件,我們可以通過系統(tǒng)的繪圖 API 繪制出一個用戶界面。從這個角度出發(fā),可以在各個平臺使用一個統(tǒng)一接口的繪圖引擎來進行界面繪制,這個引擎最終調(diào)用的是系統(tǒng)的 API 繪制的。這樣的話,它的性能可以做到接近原生,并且又不受原生控件的限制,在不同平臺上能夠做到 UI 統(tǒng)一。

Flutter 就是這樣的一個開發(fā)框架。

一個跨平臺 UI 解決方案

Flutter 是由 Google 開發(fā)的,一個跨平臺 UI 解決方案。換句話說,它原則上只管 UI 的問題,如果涉及到平臺本身的一些功能,比如調(diào)用藍牙、攝像頭,一般還是需要原生代碼去操作。但現(xiàn)在也會有一些第三方庫幫我們解決這些問題。

繪圖引擎 Skia

Flutter 使用 Skia 作為它的繪圖引擎。Skia 已經(jīng)被 Google 收購,目前很多 Google 旗下的產(chǎn)品都是用 Skia 繪制的,包括 Android。

Android 內(nèi)置了 Skia,但 iOS 沒有,所以在打 iOS 安裝包的時候,會把 Skia 一起打進去。這就導(dǎo)致了,用同一份 Flutter 代碼打包之后,iOS 的包要比 Android 的包大一些。

開發(fā)語言 Dart

Flutter 使用的開發(fā)語言,叫 Dart。Dart 也是 Google 自家的,它是一門面向?qū)ο蟮恼Z言,從它身上會看到一些其他開發(fā)語言的影子。學(xué)習(xí)起來難度不大的。

前面講跨平臺方案的時候,可以發(fā)現(xiàn)別的方案基本都是用 JavaScript 作為開發(fā)語言的,但為什么 Flutter 不用?就因為 Dart 是谷歌自家的嗎?這個問題先留著,我們后面會提到。

這里部分就簡單點帶過了,具體的搭建流程可以在官網(wǎng)查看:

主要的搭建步驟如下:

下載 Flutter SDK

官網(wǎng)下載地址:

由于在國內(nèi)訪問可能受限,官方為中國開發(fā)者搭建了鏡像:

更新環(huán)境變量

解壓后,將 flutter\bin 的全路徑添加到環(huán)境變量 PATH 中。

安裝開發(fā)工具

理論上,任何文本編輯器都可以用來開發(fā) Flutter 應(yīng)用,但推薦的開發(fā)工具是 Android Studio、IntelliJ 以及 VS Code。因為在這些開發(fā)工具上,可以安裝官方的 Flutter 和 Dart 插件,得到更好的開發(fā)體驗。文章里使用 Android Studio 來演示。

如果你打算開發(fā) iOS 應(yīng)用,則還需要安裝 Xcode。

安裝插件

在開發(fā)工具的插件設(shè)置中,安裝上面說到的 Flutter 和 Dart 插件。Flutter 插件用于支持 Flutter 的運行、調(diào)試、熱重載等功能,而 Dart 插件則提供了代碼的輸入校驗、代碼補全等功能。

萬物始于 Hello World,我們先來創(chuàng)建一個顯示 Hello World 的 Flutter 項目。

在 Android Studio 的歡迎頁面選擇 Start a new Flutter project ,或者通過菜單欄的 File New New Flutter Project ,創(chuàng)建一個新的 Flutter 項目。

創(chuàng)建好的項目里面包含了 android 和 ios 兩個文件夾,它們是標準的 Android 和 iOS 項目。我們的 Flutter 代碼,存放在 lib 文件夾里。項目創(chuàng)建好后,會默認帶一個計數(shù)器的示例,我們不管它,把 main.dart 的代碼改成 Hello World:

啟動一個模擬器,或者連上真機,點擊 Run 運行一下,就能看這樣一個界面了:

具體代碼先混個眼熟就好,具體的后面會再講到。

在寫 Flutter 之前,還要先跟大家簡單介紹一下 Dart 的語法。如果你有 Java 或 JavaScript 的開發(fā)經(jīng)驗,以及面向?qū)ο蟮木幊趟枷?,學(xué)起來是很快的。

我們可以在 test 文件夾下新建一個 dart 文件,用來寫測試代碼。

指定類型

var

但和 JavaScript 不同的是,以下代碼在 JavaScript 是不會報錯的,但在 Dart 里會報錯:

Object

如果非要上面這樣寫,那也可以。把 var 換成 Object 就不報錯了:

和 Java 類似,Object 是所有對象的根基類。但是這樣的話,如果想打印一下 num 的字符串長度,是會報錯的:

因為 length 是屬于 String 的,但系統(tǒng)只知道 num 是一個對象,并不知道它是一個 String。

dynamic

如果還是非要這樣寫,那也可以。Dart 有一個特有的關(guān)鍵字 dynamic,把 Object 改成 dynamic 就不報錯了:

我們運行一下這個文件,可以在控制臺看到正確打印出了字符串長度。

函數(shù)

dynamic

在 Dart 里,函數(shù)也是可以不寫返回類型的,不寫的話會被當(dāng)做 dynamic 來處理。這樣的話,函數(shù)的類型就是 return 的類型,如果沒有 return 則是 void 類型。比如可以這樣:

運行之后是能正確打印出字符串長度的。

用于傳參

Dart 里的函數(shù)也是一個對象,所以可以把函數(shù)作為參數(shù)來傳遞,比如:

可選參數(shù)

在 Dart 的函數(shù)傳參里,有一個叫可選參數(shù)的概念,我們以文字控件 Text 為例,在源碼里可以看到 Text 的構(gòu)造函數(shù)是這樣的:

首先,在參數(shù)里有一個 data,它是要顯示的文字內(nèi)容,是一個必填項。而 data 后面的一堆參數(shù),是用一個大括號括起來的,這些參數(shù)就叫做可選參數(shù),意思是這些參數(shù)可傳可不傳。

假如我們要顯示一個比較長的文字,又想限制它最多顯示兩行,就可以這樣來創(chuàng)建一個 Text:

可選參數(shù),在 Flutter 里面用的非常多。

異步

Future

在 Dart 里使用 Future 來處理異步任務(wù),比如我們現(xiàn)在延時一秒打印 666,代碼如下:

Future 的語法和 Promise 非常像。任務(wù)執(zhí)行成功會調(diào)用 then,執(zhí)行失敗會調(diào)用 catchError,而無論成功還是失敗,都會調(diào)用 whenComplete。

async/await

如果你不喜歡上面那種寫法,或者是想把異步轉(zhuǎn)成同步,就可以用 async 和 await 這兩個關(guān)鍵字來轉(zhuǎn)換。

我們把上面的代碼轉(zhuǎn)換一下,寫一個 getString 方法,返回的類型是 Future,它會延時返回一個字符串。在 main 函數(shù)后面加上 async 關(guān)鍵字,在 getString() 前面加上 await,代碼如下:

運行之后可以看到,能正常延時一秒后,把字符串打印出來。這里 getString() 返回的類型是 Future,而 await getString() 則是返回了延時之后返回的字符串。await 要在 async 的函數(shù)里面才能使用。

async 和 await 其實是一個語法糖,它最終也是轉(zhuǎn)換成 Future 調(diào)用鏈的形式執(zhí)行的。

接下來回到 Flutter,F(xiàn)lutter 里最重要的一個概念是 Widget(下面翻譯作控件)。

在原生開發(fā)里面,我們可能會在界面上區(qū)分,這是一個 View,這是一個 Layout,這是一個 View Controller。但在 Flutter 里面,它們?nèi)紝儆谝粋€統(tǒng)一的模型 Widget。可以說,在 Flutter 界面里,所有東西都是 Widget。

以前學(xué)面向?qū)ο蟮臅r候,我們都聽過一句話,叫萬物皆對象。我這里套用一下,在 Flutter 里, 萬物皆控件 。

具體有哪些控件,我做了一下簡單的分類。

根控件

所有的控件都屬于 StatefulWidget 或 StatelessWidget 。它們的區(qū)別是,StatefulWidget 擁有狀態(tài) State ,而 StatelessWidget 沒有。

StatefulWidget

當(dāng)一個控件是可變的時候,就要使用 StatefulWidget 來構(gòu)建。StatefulWidget 本身不可變,但它持有的狀態(tài) State 是可變的。

StatelessWidget

當(dāng)一個控件狀態(tài)是固定不可變的時候,就可以使用 StatelessWidget。前面我們寫的 Hello World 就是使用 StatelessWidget。

容器控件

容器類控件一般是將某些屬性或配置,作用在它的子控件上,比如控件所在的寬高、背景、位置等。

常用的容器控件有 Container、Center、Padding 等。

布局控件

布局控件可以類比作原生開發(fā)中的 Layout,通常它會擁有一個 children 的屬性,用于接收一個控件數(shù)組,對這些控件進行特定的排版。

常用的布局控件有 Row、Column、Stack、Flex 等。

基礎(chǔ)控件

基礎(chǔ)控件就是常用的文字、按鈕、圖片等控件。

常用的基礎(chǔ)控件有 Text、TextField、Button、Image 等。

功能控件

在 Flutter 里還有一類控件,它們不影響 UI 布局,但帶有一些特定的功能,比如頁面跳轉(zhuǎn)、事件監(jiān)聽、定義主題等。我們把這一類控件稱作功能控件。

常用的功能控件有 Navigator、NotificationListener、Theme 等。

開始寫 Flutter 代碼了。還記不記得,在 Flutter 項目創(chuàng)建之后,是自帶一個計數(shù)器 demo 的,現(xiàn)在我們用自己的代碼實現(xiàn)一遍。代碼修改成如下:

運行之后,就可以看到這樣的界面了:

按鈕每點擊一次,數(shù)字就會加一。下面我們來分析一下這段代碼,看下里面用到的一些 Widget。

StatefulWidget

由于頁面中的數(shù)字是跟隨狀態(tài)變化的,所以該頁面改用 StatefulWidget。StatefulWidget 并不會直接返回一個 Widget,而是返回狀態(tài) State,在 State 里再返回 Widget。

Scaffold

Scaffold 是一個標準的 Material Design 頁面,它包含了標題欄、浮動按鈕、側(cè)滑菜單、底部導(dǎo)航欄等配置。我們這里用到了標題欄 appBar、頁面內(nèi)容 body、浮動按鈕 floatingActionButton。

AppBar

AppBar 就是標題欄,通過查看控件的構(gòu)造方法,我們可以知道它可配置的屬性。

AppBar 的可選參數(shù)除了標題 title,還可以配置標題前的內(nèi)容 leading,右側(cè)的操作按鈕 anctions,控件垂直高度 elevation 等。我們只傳了 title,其他屬性都用默認值。

Center

Center 是一個容器類控件,它的作用就是讓它的子控件居中顯示。

FloatingActionButton

熟悉安卓開發(fā)的應(yīng)該對這個控件比較熟悉,它就是頁面右下角一個特定樣式的 Button,參數(shù)里面的 onPressed 是一個必填項,要傳一個點擊之后的回調(diào)函數(shù)。

根據(jù)這個例子,下面給大家介紹一下 Flutter 兩個比較重要的特性。

點擊 Button 之后,我們把 num 變量加一,并使用 setState 通知狀態(tài)發(fā)生了改變,F(xiàn)lutter 會根據(jù)新的狀態(tài)更新 UI。如果有接觸過小程序開發(fā),setState 就和小程序的 setData 類似。

在 Flutter 里面我們不需要用 set 方法來更新 UI,可變控件是和狀態(tài)綁定的,這就是 Flutter 的響應(yīng)式 UI 編程。

在 Android Q 和 iOS 13 里都加入了暗黑模式,我們也換一個暗黑主題來玩一下。MaterialApp 里有一個 theme 的屬性,我們把它配置一下:

這次改完之后不點 Run 了,我們點一下閃電圖標 Flutter Hot Reload ,就能看到界面發(fā)生了變化:

這就是 Flutter 的 熱重載 ,在修改完代碼之后,通過熱重載就能馬上在設(shè)備上看到修改結(jié)果,可以很大程度上增加開發(fā)效率。

下面再給大家介紹幾個 Flutter 里的常見操作。

在 Flutter 里,使用 Navigator 來管理頁面跳轉(zhuǎn),比如要跳轉(zhuǎn)到一個 NewPage 可以這樣寫:

進棧使用 push,出棧則是 pop。

使用 MaterialPageRoute 會模擬出 Android 上頁面跳轉(zhuǎn)的過場效果。

我們來看看怎么顯示一張本地圖片。

先在根目錄新建一個存放圖片的文件夾,比如叫 images,把圖片 picture.png 放進去。

找到根目錄下的 pubspec.yaml 文件,這個便是 Flutter 依賴配置文件,我們需要在這里配置一下剛才的圖片:

這樣,我們就能使用 Image 控件把這張圖片顯示出來了:

和 node 的 npm 以及 Android 的 jcenter 類似,F(xiàn)lutter 也擁有一個公共倉庫 pub.dev。pub.dev 是 Google 官方的 Dart 倉庫,在上面可以找到我們需要的包和插件。

Flutter 本身沒有 Toast,我們來接入一個。在 pub.dev 上搜索后,我決定使用 fluttertoast:

按照說明,在 pubspec.yaml 文件里的 dependencies 下配置:

點一下 Android Studio 右上角的 Packages get 同步之后就可以使用了:

我們上面使用的都是 Material Design 的控件,它們都是在 flutter/material.dart 包里面的。如果要使用 iOS 風(fēng)格的控件,則要用到 flutter/cupertino.dart 包:

iOS 風(fēng)格的控件,基本都以 Cupertino 開頭。我們把計時器頁面里的控件替換一下:

效果如下:

代碼的部分就到這里了,接下來跟大家聊一下編譯方式,編程語言的編譯方式有兩種。

關(guān)于它們孰優(yōu)孰劣,就要看從哪個角度去對比了。JIT 的話,它的一大特點就是支持動態(tài)發(fā)布代碼,也就是支持熱更新。但要是從性能的角度考慮,AOT 會更好,因為在運行的時候不用再進行編譯的操作的,運行的效率會更高一些。

回到我們一開始的時候留下的問題,為什么別的跨平臺方案都是用 JavaScript,而 Flutter 要用 Dart 來開發(fā)。JavaScript 的編譯方式是 JIT 的,它不支持 AOT。而 Dart 同時支持 JIT 和 AOT。

Flutter 在開發(fā)階段使用 JIT,讓我們用上了熱重載,增加了開發(fā)效率。在打包時改用 AOT,保證了正式版應(yīng)用的性能。

最后講一下大家比較關(guān)心的一個東西,F(xiàn)lutter 是否支持熱更新?前面說到 Dart 支持 JIT,所以從技術(shù)層面它是支持的。但是目前是不支持的,在官方的計劃文檔中,可以看到:

至于原因,官方在這里進行了說明??偟膩碚f,是由于政策的限制,以及出于對性能和安全性的考慮,暫時不支持了。

到這就結(jié)束啦。由于想把 Flutter 基礎(chǔ)在一篇內(nèi)講完,沒有涉及太多細節(jié),如果要寫 Flutter 代碼還需要深入學(xué)習(xí)。但相信理解之后再學(xué),會輕松很多。

咸魚flutter換成h5了嗎

沒有。

咸魚flutter沒有換成h5,咸魚不僅有flutter的開發(fā)應(yīng)用,還包括h5的開發(fā)應(yīng)用,flutterflutter更偏向客戶端的研發(fā)體系,h5性能穩(wěn)定,因為二者有不同的優(yōu)勢,所以咸魚flutter沒有換成h5,而是兩者共用。

咸魚flutter是一個全新的移動UI框架,它允許使用同一個代碼庫構(gòu)建高性能的Android和iOS應(yīng)用,在此基礎(chǔ)之上,以h5為數(shù)據(jù)分析的系統(tǒng),進行大數(shù)據(jù)分析,從而二者共同促進咸魚的使用率。

跨平臺技術(shù);H5和Flutter誰是未來?

前言

為什么跨平臺是發(fā)展趨勢?

同一個應(yīng)用,各個“端”獨立開發(fā),不僅開發(fā)周期長,而且人員成本高。同時,作為技術(shù)人員,也不應(yīng)該滿足于這種重復(fù)、低能的工作狀態(tài)。在這樣的形勢下,跨平臺的技術(shù)方案也受到越來越多人和企業(yè)的關(guān)注。

本篇文章我將從原理、優(yōu)缺點等方面為大家分享跨平臺技術(shù)

一. H5

說到跨平臺,沒人不知道H5。不管是在Mac、Windows、Linux、iOS、Android還是其他平臺,只要給一個瀏覽器,連“月球”上它都能跑。

1.瀏覽器架構(gòu)

下面,我們來看看讓H5如此橫行霸道的瀏覽器的架構(gòu):

瀏覽器由以上7個部分組成,而“渲染引擎”是性能優(yōu)化的重中之重,一起了解其中的渲染原理。

2.渲染引擎原理

不同的瀏覽器內(nèi)核不同,渲染過程會不太一樣,但主要流程還是一致的。

分為下面6步驟:

從以上6步,我們可以總結(jié)渲染優(yōu)化的要點:

以上就是瀏覽器端的內(nèi)容。但H5作為跨平臺技術(shù)的載體,是如何與不同平臺的App進行交互的呢?這時候JSBridge就該出場了。

3.JSBridge原理

JSBridge,顧名思義,是JS和Native之間的橋梁,用來進行JS和Native之間的通信。

通信分為以下兩個維度:

那么App內(nèi)加載H5的過程是什么樣的呢?

4.App打開H5過程

打開H5分為4個階段:

這四步,對應(yīng)的過程如上圖所以,我們可以針對性的做性能優(yōu)化。

5.優(yōu)缺點分析

下面,我們進行H5的優(yōu)缺點分析:

優(yōu)點

缺點

雖然H5目前還存在不足,但隨著PWA、WebAssembly等技術(shù)的進步,相信H5在未來能夠得到越來也好的發(fā)展。

二.小程序

2018年是微信小程序飛速發(fā)展的一年,19年,各大廠商快速跟進,已經(jīng)有了很大的影響力。下面,我們以微信小程序為例,分析小程序的技術(shù)架構(gòu)。

小程序跟H5一樣,也是基于Webview實現(xiàn)。但它包含View視圖層、App Service邏輯層兩部分,分別獨立運行在各自的WebView線程中。

1.View

可以理解為h5的頁面,提供UI渲染。由WAWebview.js來提供底層的功能,具體如下:

每個窗口都有一個獨立的WebView進程,因此微信限制不能打開超過5個層級的頁面來保障用戶體驗。

2. App Service

提供邏輯處理、數(shù)據(jù)請求、接口調(diào)用。由WAService.js來提供底層的功能,具體如下:

運行環(huán)境:

僅有一個WebView進程

3.View App Service通信

視圖層和邏輯層通過系統(tǒng)層的JSBridage進行通信,邏輯層把數(shù)據(jù)變化通知到視圖層,觸發(fā)視圖層頁面更新,視圖層將觸發(fā)的事件通知到邏輯層進行業(yè)務(wù)處理。

4. 優(yōu)缺點分析

優(yōu)點

缺點

既然WebView性能不佳,那有沒有更好的方案呢?下面我們看看React Native。

三.React Native

RN的理念是在不同平臺上編寫基于React的代碼,實現(xiàn)Learn once, write anywhere。

Virtual DOM在內(nèi)存中,可以通過不同的渲染引擎生成不同平臺下的UI,JS和Native之間通過Bridge通信

1.React Native 工作原理

在 React 框架中,JSX 源碼通過 React 框架最終渲染到了瀏覽器的真實 DOM 中,而在 React Native 框架中,JSX 源碼通過 React Native 框架編譯后,與Native原生的UI組件進行映射,用原生代替DOM元素來渲染,在UI渲染上非常接近Native App。

2.React Native 與Native平臺通信

3.優(yōu)缺點分析

優(yōu)點

缺點

4.RN展望

雖然RN還存在不足,但RN新版本已經(jīng)做了如下改進,并且RN團隊也在積極準備大版本重構(gòu),能否成為開發(fā)者們所信賴的跨平臺方案,讓我們拭目以待。

既然React Native在渲染方面還擺脫不了原生,那有沒有一種方案是直接操控GPU,自制引擎渲染呢,我們終于迎來了Flutter!

四.Flutter

Flutter是Google開發(fā)的一套全新的跨平臺、開源UI框架,支持iOS、Android系統(tǒng)開發(fā),并且是未來新操作系統(tǒng)Fuchsia的默認開發(fā)套件。渲染引擎依靠跨平臺的Skia圖形庫來實現(xiàn),依賴系統(tǒng)的只有圖形繪制相關(guān)的接口,可以在最大程度上保證不同平臺、不同設(shè)備的體驗一致性,邏輯處理使用支持AOT的Dart語言,執(zhí)行效率也比JavaScript高得多。

1.Flutter架構(gòu)原理

2.Dart優(yōu)勢

很多人會好奇,為什么Flutter要用Dart,而不是用JavaScript開發(fā),這里列下Dart的優(yōu)勢

3.優(yōu)缺點分析

優(yōu)點

缺點


網(wǎng)頁名稱:flutter普及率,flutter發(fā)展
鏈接地址:http://weahome.cn/article/dsidjes.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部