【CSDN 編者按】“如果我們把人類文明想象成汽車的話,那么軟件開發(fā)行業(yè)就相當(dāng)于汽車的引擎,編程語言就像引擎的燃料?!弊鳛橐幻_發(fā)者,需跟隨技術(shù)潮流的發(fā)展來學(xué)習(xí)新技術(shù)。2020年,你有計(jì)劃新學(xué)一門編程語言嗎?
專業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、成都做網(wǎng)站、電子商務(wù)商城網(wǎng)站建設(shè)、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,成都創(chuàng)新互聯(lián)公司的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
本文作者從一名架構(gòu)師的角度,詳細(xì)分析了7種現(xiàn)代編程語言的優(yōu)點(diǎn)與功能,你對哪門語言最感興趣呢?
作者 | Md Kamaruzzaman,軟件架構(gòu)師
譯者 | 彎月,責(zé)編 | 伍杏玲
封圖| CSDN 下載于視覺中國
出品 | CSDN(ID:CSDNnews)
以下為譯文:
如果我們把人類文明想象成汽車的話,那么軟件開發(fā)行業(yè)就相當(dāng)于汽車的引擎,而編程語言就像引擎的燃料。作為一名開發(fā)者,今年你應(yīng)該學(xué)習(xí)哪種編程語言呢?
學(xué)習(xí)一種新的編程語言無疑是時(shí)間、精力和智力上的巨大投資, 但是學(xué)習(xí)一種新的編程語言可以提升你的軟件開發(fā)技術(shù)力,促進(jìn)你的職業(yè)發(fā)展。
在這里,我將獻(xiàn)上一份現(xiàn)代編程語言的列表,這些語言不僅有助于提高你的生產(chǎn)力,而且還可以促進(jìn)你的職業(yè)發(fā)展,并讓你成長為更優(yōu)秀的開發(fā)人員。這份列表還涵蓋了非常廣泛的領(lǐng)域:系統(tǒng)編程、應(yīng)用程序開發(fā)、Web開發(fā)、科學(xué)計(jì)算等。
什么是現(xiàn)代編程語言?
“現(xiàn)代編程語言”這個(gè)說法本身就很含糊。許多人認(rèn)為Python和JavaScript等語言是現(xiàn)代編程語言,還認(rèn)為Java是一種古老的編程語言。實(shí)際上,這幾種語言大約在同一時(shí)間出現(xiàn):1995年。
大多數(shù)主流編程語言是上個(gè)世紀(jì)開發(fā)的:七十年代(如C)、八十年代(如C ++)、九十年代(如Java、Python、JavaScript)。這些語言在設(shè)計(jì)上并沒有考慮現(xiàn)代軟件開發(fā)生態(tài)系統(tǒng):多核CPU、GPU、快速的互聯(lián)網(wǎng)、移動設(shè)備、容器和云等。盡管許多語言中的許多功能都已進(jìn)行一些改進(jìn),如并發(fā)等,而且在不斷調(diào)整自己以適應(yīng)時(shí)代,但它們依然保留了向后兼容性,無法拋棄那些過時(shí)的舊功能。
在這方面,Python就做得很好(某種意義上也未必是好事),Python 2和Python 3兩者之間有明確的分界線。很多語言常常會為解決同一個(gè)問題提供十余種的方法,同時(shí)又沒有顧及到開發(fā)人員的感受。根據(jù)StackOverflow的開發(fā)人員調(diào)查,大多數(shù)舊時(shí)的主流編程語言在“最可怕的語言”排名都名列前茅:
如果非要在新舊編程語言之間劃個(gè)界限的話,那么應(yīng)該是2007年6月29日,也就是第一臺iPhone發(fā)行的時(shí)候。在這之后,編程語言界發(fā)生了很大變化。因此,在本文的列表中,我只考慮2007年以后的編程語言。
為什么要學(xué)習(xí)新語言?
首先,現(xiàn)代編程語言充分利用現(xiàn)代計(jì)算機(jī)硬件(多核CPU、GPU、TPU)、移動設(shè)備、大量數(shù)據(jù)、高速互聯(lián)網(wǎng)、容器和云的優(yōu)勢。大多數(shù)現(xiàn)代編程語言會關(guān)注開發(fā)人員的體驗(yàn),比如:
簡潔明了的代碼(減少樣板代碼)
內(nèi)置的并發(fā)支持
空指針安全
類型推斷
簡潔的功能集
降低學(xué)習(xí)難度
融合所有編程范例的最佳功能
本文列表的許多編程語言都帶有革命性地變化,并將永久地改變軟件行業(yè)。一些已成為主流編程語言,還有一些則有望取得突破。因此選擇這些語言作為第二種編程語言是明智的做法。
Rust
一直以來,系統(tǒng)編程語言環(huán)境主要由靠近硬件的語言(如C、C ++等)主導(dǎo)。盡管它們可以完全控制程序和硬件,但是它們?nèi)狈?nèi)存安全性。即使它們支持并發(fā),使用C/C ++編寫并發(fā)程序也很困難,因?yàn)闆]有并發(fā)安全性。還有一些流行的編程語言是解釋性語言,例如Java、Python、Haskell。這些語言具備安全性,但需要龐大的運(yùn)行時(shí)或虛擬機(jī)。由于它們的運(yùn)行時(shí)間長,因此Java等語言不適合于系統(tǒng)編程。
許多人曾嘗試將C/C ++的功能與Java、Haskell的安全性相結(jié)合。然而,Rust才是第一個(gè)成功實(shí)現(xiàn)了這一點(diǎn)的編程語言。
Graydon Hoare在業(yè)余項(xiàng)目中開發(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ā)安全在編譯時(shí)確保,即如果程序代碼可以編譯,那么內(nèi)存既安全又沒有數(shù)據(jù)競爭。這是Rust最吸引人的功能。
它還提供了Haskell中元編程的表現(xiàn)力。憑借不可變的數(shù)據(jù)結(jié)構(gòu)和功能編程功能,Rust提供了功能并發(fā)和數(shù)據(jù)并發(fā)。
Rust的速度非常快,純Rust的性能甚至優(yōu)于純C。
在沒有運(yùn)行時(shí)的情況下,Rust可以完全控制現(xiàn)代硬件(TPU、GPU、多核CPU)。
Rust具有LLVM支持。因此,Rust提供一流的與WebAssembly的互操作性,而且Web代碼也非???。
流行度:
自2015年首次亮相以來,Rust已被開發(fā)人員廣泛接受,并在StackOverflow開發(fā)人員調(diào)查中連續(xù)四年(2016、2017、2018、2019)被評選為最受歡迎的語言:
根據(jù)GitHub Octoverse的調(diào)查,Rust是運(yùn)行速度第二快的語言,僅次于Dart:
此外,根據(jù)編程語言流行度排名網(wǎng)站PyPl的數(shù)據(jù),Rust排名第18位,并呈上升趨勢:
對比Rust提供的功能集,我們就會明白為什么微軟、亞馬遜、Google等科技巨頭相繼宣布投資Rust作為一種長期的系統(tǒng)編程語言。
根據(jù)Google統(tǒng)計(jì)的趨勢,在過去的5年中,Rust的熱度每年都在增加。
主要用途:
系統(tǒng)編程
Serverless 計(jì)算
商業(yè)應(yīng)用
主要競爭對手:
C
C++
Go
Swift
Go
在本世紀(jì)初,Google面臨兩個(gè)擴(kuò)展問題:開發(fā)擴(kuò)展和應(yīng)用程序擴(kuò)展。開發(fā)擴(kuò)展問題指的是他們不能僅通過投入開發(fā)人員的方式來添加更多功能。應(yīng)用程序擴(kuò)展問題則指他們無法開發(fā)出一款能夠擴(kuò)展到Google級別的計(jì)算機(jī)集群的應(yīng)用程序。
所以在2007年左右,Google創(chuàng)建了一種新的編程語言,用于解決這兩個(gè)擴(kuò)展問題。兩位才華橫溢的Google軟件工程師Rob Pike(UTF-8)和Ken Thompson(UNIX OS)創(chuàng)建了一種新語言。
2012年,Google正式發(fā)布了第一版的Go編程語言。Go是一種系統(tǒng)編程語言,但與Rust不同,它還具有Runtime和垃圾收集器(幾兆字節(jié))。但是與Java或Python不同,這個(gè)Runtime包含了生成的代碼。最后,Go生成了一個(gè)本地的二進(jìn)制代碼,可以在沒有附加依賴項(xiàng)或運(yùn)行時(shí)的情況下在計(jì)算機(jī)中運(yùn)行。
主要特征:
Go具有一流的并發(fā)支持。Go不通過線程和鎖提供“共享內(nèi)存”并發(fā)性,因?yàn)榫幊屉y度太大。相反,它提供了基于CSP的消息傳遞并發(fā)性(基于Tony Hoare的論文)。Go使用“ Goroutine”(輕量級綠色線程)和“ Channel”進(jìn)行消息傳遞。
Go最大的殺手級功能是:簡單,它是最簡單的系統(tǒng)編程語言。新手軟件開發(fā)人員只需幾天就可以編寫高效的代碼,就像Python一樣。有些大規(guī)模的云原生項(xiàng)目(如Kubernetes、Docker)都是用Go編寫的。
Go還內(nèi)置了垃圾收集器,這意味著開發(fā)人員無需擔(dān)心C/C++中的內(nèi)存管理問題。
Google投入了大量資金打造Go。因此Go擁有大量的工具支持。新手Go開發(fā)人員擁有大量的工具生態(tài)系統(tǒng)。
一般,開發(fā)人員80%的時(shí)間都花在了維護(hù)現(xiàn)有代碼上,用于編寫新代碼的時(shí)間只占20%。由于其簡單性,Go在語言維護(hù)方面表現(xiàn)出色。如今,Go在業(yè)務(wù)應(yīng)用程序中大量使用。
流行度:
Go一問世就受到了軟件開發(fā)社區(qū)熱烈的歡迎。2009年-2018年,Go一直在TIOBE編程語言排行榜上徘徊。Go的成功為Rust等新一代編程語言鋪平了道路。
如今,Go已是主流編程語言。最近,Go團(tuán)隊(duì)宣布了有關(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 計(jì)算
商業(yè)應(yīng)用
云原生開發(fā)
主要競爭對手:
C
C++
Rust
Python
Java
Kotlin
Java 是企業(yè)軟件開發(fā)領(lǐng)域無可爭議的王者。近年來,Java受到了一些負(fù)面評論:過于冗長,大量樣板代碼,容易出現(xiàn)意外的復(fù)雜性。但是,關(guān)于Java虛擬機(jī)(JVM)的爭論卻很少。JVM是軟件工程的杰作,經(jīng)過了時(shí)間的考驗(yàn),提供了硬核的runtime。
多年來,Scala等JVM語言一直在努力克服Java的缺點(diǎn),想成為更好的Java,但他們都失敗了。最終,這場提升Java的探索以Kotlin的誕生結(jié)束。Jet Brains(流行的IDE IntelliJ背后的公司)開發(fā)了Kotlin,它可以在JVM上運(yùn)行,克服了Java的很多缺點(diǎn),提供許多現(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使用,體驗(yàn)非常棒。
主要特征:
Kotlin的主要賣點(diǎn)在于其語言設(shè)計(jì)。我總是將Kotlin視為JVM上的Go/Python,因?yàn)樗啙嵜髁说拇a。因此,Kotlin的生產(chǎn)力很高。
與許多其他現(xiàn)代語言一樣,Kotlin提供了Null指針、安全性、類型推斷等功能。
由于Kotlin也運(yùn)行在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有兩個(gè)有趣的項(xiàng)目: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有很多缺點(diǎn)。著名的軟件工程師Douglas Crockford寫了一本書名為《JavaScript: The Good Parts》,暗示了JavaScript有很糟的部分。無模塊化,還有“回調(diào)地獄”,因此開發(fā)人員都不喜歡維護(hù)特別大的JavaScript項(xiàng)目。
Google甚至還開發(fā)了一個(gè)平臺,可將Java代碼反編譯為JavaScript代碼(GWT)。許多公司和個(gè)人都曾嘗試開發(fā)更好的JavaScript,例如CoffeeScript、Flow、ClojureScript。最終,微軟的TypeScript取得了成功。
微軟的一隊(duì)工程師在著名的Anders Hejlsberg的帶領(lǐng)下,創(chuàng)建了JavaScript的靜態(tài)類型、模塊化超集——TypeScript。
TypeScript可以編譯為JavaScript。于2014年首次發(fā)布后,TypeScript很快引起了社區(qū)的關(guān)注。Google當(dāng)時(shí)還計(jì)劃開發(fā)JavaScript的靜態(tài)類型超集。Google對TypeScript青睞有加,以至于他們沒有開發(fā)新的語言,而是選擇與微軟合作改進(jìn)TypeScript。
Google選擇TypeScript作為其SPA框架Angular 2+的主要編程語言。此外,流行的SPA框架React也提供對TypeScript的支持。另一個(gè)流行的JavaScript框架Vue.js也宣布將使用TypeScript開發(fā)新的Vue.js 3:
另外,node.js的創(chuàng)建者Ryan Dahl已決定使用TypeScript來開發(fā)安全的Node.js替代品Deno。
主要特征:
流行度:
開發(fā)人員喜歡TypeScript的優(yōu)雅語言設(shè)計(jì)。在StackOverFlow最受歡迎的語言類別的調(diào)查中,TypeScript與Python并列第二名:
根據(jù)GitHub的排名,TypeScript是增長最快的編程語言之一,排名第五:
從GitHub的貢獻(xiàn)度來看,TypeScript排名第七,打進(jìn)了前十:
Google的趨勢表明,在過去的幾年中,TypeScript的熱度越來越高:
主要用途:
主要競爭對手:
Swift
當(dāng)初喬布斯拒絕在iOS中支持Java(和JVM),他認(rèn)為Java不再是主流編程語言。如今我們發(fā)現(xiàn)喬布斯當(dāng)初的估計(jì)是錯(cuò)的,雖然iOS仍然不支持Java。蘋果選擇了Objective-C作為iOS中的首選編程語言。Objective-C是一門很難掌握的語言,它不支持現(xiàn)代編程語言所要求的高生產(chǎn)力。
后來,蘋果的Chris Lattner和其他人開發(fā)了一種多范例、通用的、編譯編程語言——Swift,來替代Objective-C。Swift的第一個(gè)穩(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是一種通用編程語言,支持“強(qiáng)類型”和“面向?qū)ο蟆本幊?。Dart也可以轉(zhuǎn)編譯為JavaScript,凡是JavaScript可以運(yùn)行的任何地方(例如Web、移動、服務(wù)器)幾乎都可以運(yùn)行 Dart。
主要特征:
流行度:
根據(jù)GitHub Octoverse數(shù)據(jù)顯示,Dart是2019年增長最快的編程語言,去年它的流行度增長了五倍:
根據(jù)TIOBE指數(shù)顯示,Dart排名第23,僅用了4年時(shí)間就超過了很多其他的現(xiàn)代編程語言:
根據(jù)StackOverflow的調(diào)查,Dart在最受歡迎的編程語言中排名第12:
受Flutter的影響,Google的趨勢表明,在過去的兩年中,Dart的熱度急劇上升:
主要用途:
主要競爭對手:
Julia
本文提及的大多數(shù)編程語言都是由大型公司開發(fā)的,但Julia是個(gè)例外??萍加?jì)算領(lǐng)域通常都會使用動態(tài)語言,例如Python、Matlab。雖然這些語言提供易于使用的語法,但不適用于大規(guī)模的科技計(jì)算。他們需要使用C/C ++庫執(zhí)行CPU密集型任務(wù),因此這就產(chǎn)生了著名的“兩種語言”的問題,因?yàn)樗麄冃枰澈洗a來綁定兩種語言。由于編寫的代碼需要在兩種語言之間來回切換,因此總是會損失部分性能。
為了解決這個(gè)問題,麻省理工學(xué)院的一隊(duì)研究人員計(jì)劃從頭開始創(chuàng)建一種新的語言,這種語言既可以利用現(xiàn)代硬件的優(yōu)勢,而且還結(jié)合其他語言的優(yōu)勢。于是,Julia誕生了。
Julia是一種動態(tài)的高級編程語言,提供一流的并發(fā)、并行和分布式計(jì)算支持。Julia的第一個(gè)穩(wěn)定版本于2018年發(fā)布,并很快受到社區(qū)和行業(yè)的關(guān)注。Julia可用于科學(xué)計(jì)算、人工智能和許多其他領(lǐng)域,而且還可以解決“兩種語言”的問題。
主要特征:
流行度:
Julia在許多領(lǐng)域主要與Python競爭。由于Python是最流行的編程語言之一,因此Julia想晉升主流還需要幾年的時(shí)間。
雖然Julia非常新(只有一歲),但仍在TIOBE指數(shù)中排到第43名:
Google趨勢顯示,在過去的一年中,Julia的熱度在穩(wěn)步增長:
但是考慮到Julia的功能集,以及NSF、DARPA、NASA、因特爾等公司的推動,相信Julia取得突破的進(jìn)展只是時(shí)間的問題。
主要用途:
主要競爭對手:
原文鏈接:
本文為 CSDN 翻譯,轉(zhuǎn)載請注明來源出處。
【End】
Python
Matlab
科學(xué)計(jì)算
高性能計(jì)算
數(shù)據(jù)科學(xué)
可視化
與Rust一樣,Julia的主要特征在于語言的設(shè)計(jì)。這種語言在不犧牲性能的情況下,將高性能和科學(xué)計(jì)算中現(xiàn)有編程語言的一些功能結(jié)合在一起。就目前的情況來看,Julia出色地完成了這項(xiàng)任務(wù)。
Julia是一種動態(tài)編程語言,支持類型系統(tǒng)但類型不是必須的。因此,Julia這種編程語言很容易學(xué)習(xí),生產(chǎn)力很高。
Julia的核心是多調(diào)度編程范例。
Julia內(nèi)部支持并發(fā)、并行和分布式計(jì)算。
Julia為I/O密集型任務(wù)提供異步I/O。
Julia的運(yùn)行速度非???,可用于需要數(shù)百萬個(gè)線程的科學(xué)計(jì)算。
JavaScript
TypeScript
應(yīng)用開發(fā)
UI開發(fā)
與Go一樣,Dart也非常注重開發(fā)人員的工作效率。由于Dart簡潔的語法,以及高效的生產(chǎn)力,受到開發(fā)人員的喜愛。
Dart還提供“強(qiáng)類型”和“面向?qū)ο蟆本幊獭?/p>
Dart是少數(shù)同時(shí)支持JIT編譯(運(yùn)行時(shí)編譯)和AOT編譯(創(chuàng)建時(shí)編譯)的編程語言之一。因此,Dart可以針對JavaScript運(yùn)行時(shí)(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è)計(jì)。語言本身很簡單,語法簡潔,比Objective-C更高效。
Swift還提供了現(xiàn)代程序語言的功能:null安全。此外,它還提供了語法糖來避免“厄運(yùn)金字塔”。
作為一種編譯語言,Swift和C++一樣快。
Swift支持LLVM編譯器工具鏈。因此,我們可以在服務(wù)器端編程,甚至瀏覽器編程(使用WebAssembly)中使用Swift。
Swift提供了自動引用計(jì)數(shù)(ARC)支持,可抑制內(nèi)存管理的不善。
JavaScript
Dart
Web UI開發(fā)
服務(wù)器端開發(fā)
與Go或Kotlin同樣,TypeScript的主要特征也是語言設(shè)計(jì)。TypeScript憑借其簡潔明快的代碼,成為了目前最優(yōu)雅的編程語言之一。就開發(fā)人員的生產(chǎn)力而言,它與JVM或Go/Python上的Kotlin并駕齊驅(qū)。TypeScript是生產(chǎn)力最高的JavaScript超集。
TypeScript是JavaScript的強(qiáng)類型超集,特別適合大型項(xiàng)目,而且可以稱為“可擴(kuò)展的JavaScript”。
單頁應(yīng)用程序框架的“三巨頭”(Angular、React、Vue.js)為TypeScript提供了出色的支持。在Angular中,TypeScript是首選的編程語言。在React和Vue.js中,TypeScript越來越受歡迎。
最大的兩家技術(shù)巨頭:微軟和Google正在合作開發(fā)由活躍的開源社區(qū)支持的TypeScript。因此,TypeScript擁有最好的工具支持。
由于TypeScript是JavaScript的超集,因此凡是可以運(yùn)行JavaScript的任何地方都可以運(yùn)行TypeScript,包括瀏覽器、服務(wù)器、移動設(shè)備、物聯(lián)網(wǎng)設(shè)備和云。
Java
Scala
Python
Go
import 'package:flutter/material.dart';
void main() = runApp(MyApp());
class MyAppextends StatelessWidget {
// This widget is the root of your application.
@override
Widgetbuild(BuildContext context) {
return MaterialApp(
title:'Flutter Demo',
? theme:ThemeData(
primarySwatch: Colors.blue, splashColor: Colors.transparent),
? home:HYHomePage(),
);
}
}
class HYHomePageextends StatelessWidget {
@override
Widgetbuild(BuildContext context) {
return Scaffold(
appBar:AppBar(
title:Text("列表測試"),
? ),
? body:GestureDemo(),
? // Center(
//? child: Stack(
//? ? alignment: Alignment.center,
//? ? children: [
//? ? ? GestureDetector(
//? ? ? ? onTapDown: (details) {
//? ? ? ? ? print("outer click");
//? ? ? ? },
//? ? ? ? child: Container(
//? ? ? ? ? width: 200,
//? ? ? ? ? height: 200,
//? ? ? ? ? color: Colors.yellow,
//? ? ? ? ? alignment: Alignment.center,
//? ? ? ? ),
//? ? ? ),
//? ? ? IgnorePointer(
//? ? ? ? child: GestureDetector(
//? ? ? ? ? onTapDown: (details) {
//? ? ? ? ? ? print("inner click");
//? ? ? ? ? },
//? ? ? ? ? child: Container(
//? ? ? ? ? ? width: 100,
//? ? ? ? ? ? height: 100,
//? ? ? ? ? ? color: Colors.red,
//? ? ? ? ? ),
//? ? ? ? ),
//? ? ? )
//? ? ],
//? ),
// ),
);
}
}
class GestureDemoextends StatelessWidget {
const GestureDemo({
Key key,
}) :super(key: key);
@override
Widgetbuild(BuildContext context) {
return Center(
child:GestureDetector(
onTapDown: (details) {
print("手指按下");
? ? ? print(details.globalPosition);
? ? ? print(details.localPosition);
? ? },
? ? onTapUp: (details) {
print("手指抬起");
? ? },
? ? onTapCancel: () {
print("手勢取消");
? ? },
? ? onTap: () {
print("手勢點(diǎn)擊");
? ? },
? ? onDoubleTap: () {
print("手指雙擊");
? ? },
? ? onLongPress: () {
print("長按手勢");
? ? },
? ? onPanUpdate: (value){
print('當(dāng)前我在滑動$value');
? ? },
? ? child:Container(
width:200,
? ? ? height:200,
? ? ? color: Colors.orange,
? ? ),
? ),
);
}
}
class ListenerDemoextends StatelessWidget {
const ListenerDemo({
Key key,
}) :super(key: key);
@override
Widgetbuild(BuildContext context) {
return Listener(
onPointerDown: (event) {
print("指針按下:$event");
? ? print(event.position);
? ? print(event.localPosition);
? },
? onPointerMove: (event) {
//? ? ? ? ? ? print("指針移動:$event");
? },
? onPointerUp: (event) {
//? ? ? ? ? ? print("指針抬起:$event");
? },
? child:Container(
width:200,
? ? height:200,
? ? color: Colors.red,
? ),
);
}
}
描述了屏幕上指針(觸摸、鼠標(biāo)、觸控筆)的位置和移動。
Flutter中可以使用Listener(功能性組件)來監(jiān)聽原始觸摸事件
例1
例2
例3
忽略PointerEvent
手勢: 描述由一個(gè)或多個(gè)指針移動組成的語義動作,如拖動、縮放、雙擊等。
Material大多數(shù)widget已經(jīng)對tap或手勢做出了響應(yīng)。 例如 IconButton和 FlatButton 響應(yīng)單擊,ListView響應(yīng)滑動事件觸發(fā)滾動。
用于手勢識別的功能性組件,通過它可以來識別各種手勢。
例(單擊)
例(添加Material觸摸水波效果 InkWell組件)
例(滑動關(guān)閉 Dismissable組件)
例(單擊、雙擊、長按)
例(滑動)
例(掃動---單一方向)
例(縮放)
GestureRecognizer是一個(gè)抽象類。
一種手勢的識別器對應(yīng)一個(gè)GestureRecognizer的子類。
例
由于手勢競爭最終只有一個(gè)勝出者,所以,當(dāng)有多個(gè)手勢識別器時(shí),可能會產(chǎn)生沖突。
例
例
在APP中經(jīng)常會需要一個(gè)廣播機(jī)制,用以跨頁面通知。比如一個(gè)需要登錄的APP中,頁面會關(guān)注用戶登錄或注銷事件,來進(jìn)行一些狀態(tài)更新。
這時(shí)候,一個(gè)事件總線便會非常有用,事件總線通常實(shí)現(xiàn)了訂閱者模式,訂閱者模式包含發(fā)布者和訂閱者兩種角色,可以通過事件總線來觸發(fā)事件和監(jiān)聽事件。
對于一些簡單的應(yīng)用,事件總線是足以滿足業(yè)務(wù)需求的,如果決定使用狀態(tài)管理包的話,一定要想清楚APP是否真的有必要使用它,防止“化簡為繁”、過度設(shè)計(jì)。
例
在widget樹中,每一個(gè)節(jié)點(diǎn)都可以分發(fā)通知,通知會沿著當(dāng)前節(jié)點(diǎn)向上傳遞,所有父節(jié)點(diǎn)都可以通過NotificationListener來監(jiān)聽通知。
Flutter中將這種由子向父的傳遞通知的機(jī)制稱為通知冒泡(Notification Bubbling)。
通知冒泡和用戶觸摸事件冒泡是相似的,但有一點(diǎn)不同:通知冒泡可以中止,但用戶觸摸事件不行。
通知冒泡和Web開發(fā)中瀏覽器事件冒泡原理是相似的,都是事件從出發(fā)源逐層向上傳遞,可以在上層節(jié)點(diǎn)任意位置來監(jiān)聽通知/事件,也可以終止冒泡過程,終止冒泡后,通知將不會再向上傳遞。
Flutter的UI框架實(shí)現(xiàn)中,除了在可滾動組件在滾動過程中會發(fā)出ScrollNotification之外,還有一些其它的通知,如SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等,F(xiàn)lutter正是通過這種通知機(jī)制來使父元素可以在一些特定時(shí)機(jī)來做一些事情。
例
例
例
阻止冒泡
通知冒泡原理
隨著互聯(lián)網(wǎng)企業(yè)的不斷發(fā)展,產(chǎn)品項(xiàng)目中的模塊越來越多,用戶體驗(yàn)要求也越來越高,想實(shí)現(xiàn)小步快跑、快速迭代的目的越來越難,還有65535,應(yīng)用之間的互相調(diào)用等等問題,插件化技術(shù)應(yīng)用而生。如果沒有插件化技術(shù),美團(tuán)、淘寶這些集成了大量“app”的應(yīng)用,可能會有幾個(gè)g那么大。
所以,當(dāng)今的iOS移動開發(fā),不會底層、算法、插件化、組件化,80%以上的面試都過不了。
阿里P8大佬每天熬夜到凌晨一兩點(diǎn),花了將近半個(gè)月時(shí)間將iOS逆向安防、算法、架構(gòu)設(shè)計(jì)、多線程,網(wǎng)絡(luò)進(jìn)階,還有底層、音視頻、Flutter等等、iOS第三方開源框架整合成了一套系統(tǒng)知識筆記PDF,長達(dá)1042頁!相信看完這份文檔,你將會對這些iOS第三方框架有著更深入、更系統(tǒng)的理解。
底層原理毫無疑問還是iOS開發(fā)現(xiàn)在必備能力。
對象底層原理
指針與內(nèi)存的一些相關(guān)面試
weak 弱引用
block 的原理
AutoreleasePool 原理
Runloop 的原理
Runtime相關(guān)、消息轉(zhuǎn)發(fā)
性能優(yōu)化以及架構(gòu)能力相對比之前要求越來越多!
①性能優(yōu)化方面:tableView的優(yōu)化 - 界面卡頓原理 - app 性能分析 - 項(xiàng)目優(yōu)化
②架構(gòu)方面: 設(shè)計(jì)模式、解耦手段、組件化....
數(shù)據(jù)結(jié)構(gòu)算法能力占比也比較大。通常一般大公司都會有一些筆試:雖然不在核心崗位對于數(shù)據(jù)結(jié)構(gòu)算法要求不是非常嚴(yán)格,但是也會有一些常規(guī)的數(shù)據(jù)結(jié)構(gòu)和算法的題
排序
數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
復(fù)雜度討論
一些腦經(jīng)急轉(zhuǎn)彎的算法題
.....
現(xiàn)在的iOS開發(fā)為什么會遇到瓶頸是因?yàn)椋呵懊鎯溥^少,坐吃山空! 技術(shù)不斷更新的時(shí)代,我希望你沉下心來與時(shí)俱進(jìn),不斷儲備技能為自己加分
這里我推薦學(xué)習(xí):視覺方向! 無論直播還是小視頻,圖形圖像處理成為必然的技能,未來5G時(shí)代的來臨,這一塊技術(shù)必將成為你與其他開發(fā)人員差距的賽點(diǎn)!
從性能方面來說,F(xiàn)lutter 的性能理論上是最好的,RN和Weex次之,并且都好于傳統(tǒng)的 WebView方案
而從社群和社區(qū)的活躍來看,RN和Flutter無疑是最活躍的
總結(jié):我個(gè)人針對現(xiàn)在的行情比較推薦大家學(xué)習(xí):Flutter
學(xué)習(xí)iOS逆向的目的
大家都懂的 薪資高。。。。
1 學(xué)習(xí)優(yōu)秀App的設(shè)計(jì)
當(dāng)你看到一個(gè)App有一些非常好用的功能,你想學(xué)習(xí)或者你也需要實(shí)現(xiàn)相同的功能,這樣你就可以逆向它的實(shí)現(xiàn),去分析它的實(shí)現(xiàn)過程
2 更好的去加強(qiáng)自己開發(fā)App的安全
當(dāng)你熟悉了iOS逆向工程,今后在開發(fā)自己App的時(shí)候,哪些地方更容易別被人攻破,從而有效的去避免
3 學(xué)習(xí)iOS系統(tǒng)未開源庫的一些實(shí)現(xiàn)。
比如我們常用的UIKit的實(shí)現(xiàn)等等
4 視野更遠(yuǎn)了,iOS開發(fā)就會不在局限于畫界面,數(shù)據(jù),網(wǎng)絡(luò)這些操作了
iOS逆向你能夠了解到整個(gè)iOS系統(tǒng)的大致底層,內(nèi)核,程序加載過程呀,App編譯過程呀,等等
5 可以改變現(xiàn)有app的一些功能
去愛奇藝App的廣告,微信搶紅包等等。(當(dāng)然這個(gè)學(xué)習(xí)可以,不可以作為商業(yè)利益,違法的)
getx可以做到通過頁面的退出自動控制controller的銷毀,那么他是怎么做到的呢
當(dāng)我們使用getx的路由套件時(shí),可以看到,他的每個(gè)跳轉(zhuǎn)方法都使用了自定義的 GetPageRoute 。
在 GetPageRoute 中對于此次的問題,我們需要關(guān)注的是兩個(gè)方法
嗯,這里給傳了一個(gè) reference 給了 Get.reference ,這個(gè) reference 看一下是什么玩意。。
dispose ,route退出流程里調(diào)用的方法。在這里面Get做了兩件事,我們主要關(guān)注第一件事, removeDependencyByRoute() 參數(shù)是上面的頁面標(biāo)識。
這個(gè)方法里,我們可以看到調(diào)用了 GetInstance 的 delete 方法,這個(gè)方法就是銷毀controller的方法,但是為什么呢?為啥傳一個(gè)頁面標(biāo)識就能刪除到對應(yīng)的controller呢。我們接著看
我們都知道我們在使用getx的controller時(shí),一定會有兩個(gè)操作,一個(gè)是 Get.put() ,一個(gè)是 Get.find() 讓我們一個(gè)一個(gè)的看一下
Get.put 的本質(zhì)其實(shí)是將我們傳入的實(shí)例,根據(jù)類 S 和 tag 創(chuàng)建一個(gè) key ,然后以key和實(shí)例作為鍵值對存入了全局的map中(此處是簡單理解,看也看得出來不是直接傳實(shí)例了)
Get.find 方法很簡單的只是通過類 S 和 tag 去全局map中找一個(gè)實(shí)例返回出去, 但是 返回之前,還做了一步操作,即 _initDependencies 。
看到?jīng)],就在下面Get.reference,之前在GetPageRoute的頁面構(gòu)建之前賦值了最近的頁面,然后在此處用來做routesKey的value和前面的controller的key值進(jìn)行綁定。
這也是得益于flutter是個(gè)單線程模型,才能這樣無腦的通過這種方式傳值。其實(shí)getx中有不少讓人覺得神奇的地方都是利用了單線程的優(yōu)勢,比如Obx的自動刷新,也是在Obx的build方法和Rx的value的get方法之間通過一個(gè)全局指針來進(jìn)行傳值。
手勢操作在 Flutter 中分為兩類:
第一類是原始的指針事件(Pointer Event),即原生開發(fā)中常見的觸摸事件,表示屏幕上觸摸(或鼠標(biāo)、手寫筆)行為觸發(fā)的位移行為;
第二類則是手勢識別(Gesture Detector),表示多個(gè)原始指針事件的組合操作,如點(diǎn)擊、雙擊、長按等,是指針事件的語義化封裝。
指針事件表示用戶交互的原始觸摸數(shù)據(jù),如手指接觸屏幕 PointerDownEvent、手指在屏幕上移動 PointerMoveEvent、手指抬起 PointerUpEvent,以及觸摸取消 PointerCancelEvent。在手指接觸屏幕,觸摸事件發(fā)起時(shí),F(xiàn)lutter 會確定手指與屏幕發(fā)生接觸的位置上究竟有哪些組件,并將觸摸事件交給最內(nèi)層的組件去響應(yīng)。事件會從這個(gè)最內(nèi)層的組件開始,沿著組件樹向根節(jié)點(diǎn)向上冒泡分發(fā)。通過 hitTestBehavior 去調(diào)整組件在命中測試期內(nèi)應(yīng)該如何表現(xiàn),比如把觸摸事件交給子組件,或者交給其視圖層級之下的組件去響應(yīng)。關(guān)于組件層面的原始指針事件的監(jiān)聽,F(xiàn)lutter 提供了 Listener Widget,可以監(jiān)聽其子 Widget 的原始指針事件。
Listener(
child: Container(
color: Colors.black,
width: 300,
height: 300,
),
onPointerDown: (event) = print("down $event"),// 手勢按下回調(diào)
onPointerMove:? (event) = print("move $event"),// 手勢移動回調(diào)
onPointerUp:? (event) = print("up $event"),// 手勢抬起回調(diào)
);
Gesture 是手勢語義的抽象,而如果我們想從組件層監(jiān)聽手勢,則需要使用 GestureDetector 。GestureDetector 是一個(gè)處理各種高級用戶觸摸行為的 Widget,與 Listener 一樣,也是一個(gè)功能性組件。
GestureDetector(// 手勢識別
? ? child: Container(color: Colors.red,width: 50,height: 50),// 紅色子視圖
? ? onTap: ()=print("Tap"),// 點(diǎn)擊回調(diào)
? ? onDoubleTap: ()=print("Double Tap"),// 雙擊回調(diào)
? ? onLongPress: ()=print("Long Press"),// 長按回調(diào)
? ? onPanUpdate: (e) {// 拖動回調(diào)
? ? ? setState(() {
? ? ? ? // 更新位置
? ? ? ? _left += e.delta.dx;
? ? ? ? _top += e.delta.dy;
? ? ? });
? ? },
? ),