片由 h heyerlein 發(fā)布在 Unsplash 上
如果我們把人類的現(xiàn)代文明看作一輛汽車,那么軟件開發(fā)行業(yè)就像汽車的發(fā)動(dòng)機(jī),編程語(yǔ)言就像發(fā)動(dòng)機(jī)的燃料。那么問(wèn)題來(lái)了,你應(yīng)該學(xué)哪種編程語(yǔ)言?
學(xué)習(xí)一門新的編程語(yǔ)言在時(shí)間、精力和腦力上的投入都非常巨大,但它可以提高你的軟件開發(fā)技能,并給你的職業(yè)生涯帶來(lái)提升,正如我在另一篇博客中所寫的:
博客網(wǎng)址:https://medium.com/@md.kamaruzzaman/5-reasons-to-learn-a-new-programming-language-in-2020-bfc9a4b9a763
通常,你應(yīng)該選擇一種能有助于你事業(yè)發(fā)展的編程語(yǔ)言。另外,你還可以學(xué)習(xí)一門受歡迎程度正在上升的語(yǔ)言。
我對(duì)主流編程語(yǔ)言非常尊重。但在這里,我列出現(xiàn)代編程語(yǔ)言,這些語(yǔ)言可以提高你的工作效率,使你成為一個(gè)更好的開發(fā)人員。此外,我還將涉及更廣泛的領(lǐng)域:系統(tǒng)編程,應(yīng)用程序開發(fā),網(wǎng)絡(luò)開發(fā),科學(xué)計(jì)算。
「現(xiàn)代編程語(yǔ)言」這個(gè)詞是模棱兩可的。許多人認(rèn)為像 Python、JavaScript 這樣的語(yǔ)言是現(xiàn)代編程語(yǔ)言。但同時(shí),他們認(rèn)為 Java 是一種古老的編程語(yǔ)言。事實(shí)上,它們都出現(xiàn)在同一時(shí)間:1995 年。
大多數(shù)主流的編程語(yǔ)言是在上個(gè)世紀(jì)發(fā)展起來(lái)的,主要是在 20 世紀(jì) 70 年代(例如 C)、20 世紀(jì) 80 年代(例如 C++)、20 世紀(jì) 90 年代(例如 Java、Python、JavaScript)。這些語(yǔ)言不是為了利用現(xiàn)代軟件開發(fā)生態(tài)系統(tǒng)而設(shè)計(jì)的。盡管其中的許多語(yǔ)言中有改進(jìn)特性,比如并發(fā)性和自我調(diào)整,但是它們也提供了向后兼容性,并且不能丟棄舊的、過(guò)時(shí)的特性。
在這一點(diǎn)上,Python 做的很好,它在 Python 2 和 Python 3 之間做了一個(gè)明確的劃分。這些語(yǔ)言通常提供 10 種方法來(lái)做同樣的事情,而不關(guān)心開發(fā)人員用起來(lái)是否方便。根據(jù) StackOverflow developer 的調(diào)查,大多數(shù)主流的舊編程語(yǔ)言都在「最可怕的語(yǔ)言」類別中占據(jù)了榜首:
圖片來(lái)源:Stackoverflow
我將以第一款 iPhone 發(fā)布的時(shí)候,也就是 2007 年 6 月 29 日作為新舊編程語(yǔ)言之間的界限時(shí)間點(diǎn)。在 iPhone 發(fā)布之后,一切都發(fā)生了變化。在這個(gè)列表中,我主要考慮 2007 年后的編程語(yǔ)言。
首先,開發(fā)現(xiàn)代編程語(yǔ)言是為了充分利用現(xiàn)代計(jì)算機(jī)硬件(多核 CPU、GPU、TPU)、移動(dòng)設(shè)備、大數(shù)據(jù)集、快速網(wǎng)絡(luò)、容器和云。此外,大多數(shù)現(xiàn)代編程語(yǔ)言使用起來(lái)都更容易,主要體現(xiàn)在:
簡(jiǎn)潔的代碼
內(nèi)置的并發(fā)支持
空指針安全
類型推斷
更簡(jiǎn)單的特性集
低認(rèn)知負(fù)荷
混合所有編程范例的最佳特性
其次,列表中的許多編程語(yǔ)言都具有破壞性,將永遠(yuǎn)改變軟件行業(yè)。其中一些已經(jīng)成為主流編程語(yǔ)言,而另一些則等待取得突破。至少作為第二種編程語(yǔ)言來(lái)學(xué)習(xí)這些語(yǔ)言是明智的。
在之前的一篇博文「20 個(gè) 2020 年軟件發(fā)展趨勢(shì)預(yù)測(cè)」中,我預(yù)測(cè)了 2020 年許多現(xiàn)代編程語(yǔ)言的突破:
文章網(wǎng)址:https://towardsdatascience.com/20-predictions-about-software-development-trends-in-2020-afb8b110d9a0
Rust
圖片來(lái)源:Thoughtram
系統(tǒng)編程語(yǔ)言是由 C、C++等主導(dǎo)的,盡管它們可以完全控制程序和硬件,但它們?nèi)狈?nèi)存安全性。即使它們支持并發(fā)性,但是在比你保證并發(fā)安全性的情況下,使用 C/C++編寫并發(fā)程序是很有挑戰(zhàn)性的。其他流行的編程語(yǔ)言是可解釋性的語(yǔ)言,如 Java、Python、Haskell,它們提供安全性,但需要很多的運(yùn)行時(shí)間或虛擬機(jī)。由于運(yùn)行時(shí)很大,像 Java 這樣的語(yǔ)言不適合系統(tǒng)編程。
有很多人嘗試過(guò)將 C/C++的特性和 Haskell,Java 的安全性結(jié)合起來(lái),但目前看來(lái),Rust 是第一個(gè)實(shí)現(xiàn)這一目的的產(chǎn)品級(jí)編程語(yǔ)言。
Graydon Hoare 最早將 Rust 作為一個(gè)副產(chǎn)品開發(fā)出來(lái)。他受到了研究性的編程語(yǔ)言 Cyclone 的啟發(fā)。Rust 是開源的,Mozilla 與許多其他公司和社區(qū)一起進(jìn)行語(yǔ)言開發(fā)。Rust 于 2015 年首次發(fā)布,很快就引起了社會(huì)各界的關(guān)注。在以前的文章中,我深入研究了 Rust,并論證了為什么在大數(shù)據(jù)域中使用 Rust 來(lái)代替 C++、Java 是一個(gè)更好的選擇:
文章網(wǎng)址:https://towardsdatascience.com/back-to-the-metal-top-3-programming-language-to-develop-big-data-frameworks-in-2019-69a44a36a842
主要特性:
通過(guò)所有權(quán)和借用的概念提供內(nèi)存安全性和并發(fā)安全性。
內(nèi)存安全和并發(fā)安全的編譯時(shí)間保證,即如果一個(gè)程序代碼編譯了,那么它既是內(nèi)存安全的,也沒有數(shù)據(jù)競(jìng)爭(zhēng)。這是 Rust 最吸引人的特點(diǎn)。
它還提供了 ML,Haskell 的表示方式。Rust 具有不變的數(shù)據(jù)結(jié)構(gòu)和函數(shù)式編程特性,提供函數(shù)式并發(fā)和數(shù)據(jù)并發(fā)。
Rust 的速度非常快。
由于沒有運(yùn)行時(shí),Rust 提供了對(duì)現(xiàn)代硬件(TPU、GPU、多核 CPU)的完全控制。
Rust 有 LLVM 支持。
受歡迎程度:
自 2015 年首次亮相以來(lái),Rust 一直被開發(fā)者所喜愛,并在 StackOverflow 開發(fā)者調(diào)查中連續(xù)四年(2016、2017、2018、2019)被評(píng)為最受歡迎的語(yǔ)言:
圖片來(lái)源:Stackoverflow
根據(jù) GitHub Octoverse 的說(shuō)法,Rust 是僅次于 Dart 的增長(zhǎng)第二快的語(yǔ)言:
圖片來(lái)源:Octoverse
流行編程語(yǔ)言網(wǎng)站 PyPl 也將 Rust 排在第 18 位,并呈上升趨勢(shì):
圖片來(lái)源:PyPl
對(duì)比它提供的功能集,難怪像微軟、亞馬遜、谷歌這樣的科技巨頭最終宣布將 Rust 作為一種長(zhǎng)期的系統(tǒng)編程語(yǔ)言。
在過(guò)去的 5 年里,Rust 的吸引力每年都在增加:
圖片來(lái)源:Google Trends
主要用在:
系統(tǒng)編程
無(wú)服務(wù)器計(jì)算
業(yè)務(wù)應(yīng)用程序
主要競(jìng)爭(zhēng)語(yǔ)言:
C
C++
Go
Swift
Go
圖片來(lái)源:Wikimedia
谷歌是最大的網(wǎng)絡(luò)公司之一。本世紀(jì)初,Google 面臨著兩個(gè)擴(kuò)展問(wèn)題:開發(fā)擴(kuò)展和應(yīng)用程序擴(kuò)展。開發(fā)擴(kuò)展意味著他們不能通過(guò)增加開發(fā)人員來(lái)增加更多的功能,應(yīng)用程序擴(kuò)展意味著他們無(wú)法輕松開發(fā)一個(gè)可以擴(kuò)展到「Google」級(jí)機(jī)器集群的應(yīng)用程序。2007 年左右,谷歌開始創(chuàng)建一種新的「實(shí)用」編程語(yǔ)言,這種語(yǔ)言可以解決這兩個(gè)問(wèn)題。在 Rob Pike(UTF-8)和 Ken Thompson(UNIX 操作系統(tǒng))中,兩個(gè)世界上最有才華的軟件工程師創(chuàng)建了一種新的語(yǔ)言。
2012 年,谷歌發(fā)布了 Go 編程語(yǔ)言的第一個(gè)官方版本。Go 是一種系統(tǒng)編程語(yǔ)言,但不同于 Rust。它也有一個(gè)運(yùn)行時(shí)和垃圾收集器(幾兆字節(jié)),但與 Java 或 Python 不同的是,這個(gè)運(yùn)行時(shí)包含了生成的代碼。最后,Go 生成一個(gè)本機(jī)二進(jìn)制代碼,可以在沒有附加依賴項(xiàng)或運(yùn)行時(shí)的情況下在計(jì)算機(jī)中運(yùn)行。
主要特性:
Go 具有一流的并發(fā)支持。它不通過(guò)線程和鎖提供「共享內(nèi)存」并發(fā)性,因?yàn)榫幊屉y度要大得多。相反,它提供了基于 CSP 的消息傳遞并發(fā)性。Go 使用「Goroutine」(輕量級(jí)綠色線程)和「Channel」進(jìn)行消息傳遞。
Go 最具殺傷力的特點(diǎn)是簡(jiǎn)單,它是最簡(jiǎn)單的系統(tǒng)編程語(yǔ)言,一個(gè)萌新軟件開發(fā)人員可以在幾天內(nèi)編寫出高效的代碼。一些最大的云原生項(xiàng)目(Kubernetes,Docker)是用 Go 編寫的。
GO 也有嵌入式垃圾收集器,這意味著開發(fā)人員不需要擔(dān)心像 C/C++那樣的內(nèi)存管理問(wèn)題。
谷歌在 Go 上投入了大量資金,因此,Go 擁有大量的工具支持。對(duì)于新的 Go 開發(fā)人員來(lái)說(shuō),有一個(gè)龐大的工具生態(tài)系統(tǒng)。
通常,開發(fā)人員花費(fèi) 20% 的時(shí)間編寫新代碼,80% 的時(shí)間維護(hù)現(xiàn)有代碼。由于其簡(jiǎn)單性,Go 在語(yǔ)言維護(hù)領(lǐng)域表現(xiàn)出色。如今,Go 在商業(yè)應(yīng)用程序中得到了廣泛的應(yīng)用。
受歡迎程度:
自 Go 首次問(wèn)世以來(lái),軟件開發(fā)社區(qū)已經(jīng)欣然接受了它。在 2009 年(首次亮相)和 2018 年,Go 通過(guò) TIOBE 指數(shù)進(jìn)入編程語(yǔ)言名人堂排行榜。難怪 Go 的成功為 Rust 這樣的新一代編程語(yǔ)言鋪平了道路。
Go 已經(jīng)是一種主流編程語(yǔ)言。最近,Go 團(tuán)隊(duì)宣布了「Go 2」的計(jì)劃,目的只是讓語(yǔ)言更加穩(wěn)固。
在幾乎所有流行編程語(yǔ)言比較網(wǎng)站,Go 的排名很高,超過(guò)了許多現(xiàn)有的語(yǔ)言。以下是 2019 年 12 月的 TIOBE 指數(shù)評(píng)級(jí),Go 排名第 15 位:
圖片來(lái)源:TIOBE
根據(jù) Stackoverflow 的調(diào)查,Go 是十大最受歡迎的編程語(yǔ)言之一:
圖片來(lái)源:Stackoverflow
根據(jù) GitHub Octoverse 的統(tǒng)計(jì),Go 也是增長(zhǎng)最快的十大語(yǔ)言之一:
圖片來(lái)源:Octoverse
谷歌還顯示,過(guò)去五年里,Go 的吸引力不斷增強(qiáng):
圖片來(lái)源:Google Trends
主要用例:
系統(tǒng)編程
無(wú)服務(wù)器計(jì)算
業(yè)務(wù)應(yīng)用程序
云本機(jī)開發(fā)
主要競(jìng)爭(zhēng)語(yǔ)言:
C
C++
Rust
Python
Java
Kotlin
Java 是企業(yè)軟件開發(fā)中無(wú)可爭(zhēng)議的王者。近年來(lái),Java 已經(jīng)受到了很多批評(píng):冗長(zhǎng),需要大量的樣板編碼,復(fù)雜,容易發(fā)生意外。然而,關(guān)于 Java 虛擬機(jī)(JVM)的爭(zhēng)論很少。JVM 是軟件工程領(lǐng)域的杰作,它提供了一個(gè)經(jīng)過(guò)時(shí)間考驗(yàn)的運(yùn)行時(shí)。在上一篇文章中,我詳細(xì)討論了 JVM 的優(yōu)點(diǎn):
文章網(wǎng)址:https://towardsdatascience.com/programming-language-that-rules-the-data-intensive-big-data-fast-data-frameworks-6cd7d5f754b0
多年來(lái),像 Scala 這樣的 JVM 語(yǔ)言試圖回答 Java 的缺點(diǎn),并希望成為更好的 Java,但是失敗了。最后,Kotlin 出現(xiàn)了,尋找更好 Java 的旅程似乎已經(jīng)結(jié)束。Jet Brains(流行 IDE IntelliJ 背后的公司)開發(fā)了 Kotlin,它運(yùn)行在 JVM 上,解決了 Java 的缺點(diǎn),并提供了許多現(xiàn)代特性。與 Scala 不同,Kotlin 比 Java 簡(jiǎn)單得多,并在 JVM 中提供 Go 或 Python 式的開發(fā)效率。
谷歌宣布 Kotlin 是開發(fā) Android 的一流語(yǔ)言,并提高了 Kotlin 在社區(qū)的接受度。同樣流行的 Java 企業(yè)框架 Spring 也從 2017 年開始在 Spring 生態(tài)系統(tǒng)中支持 Kotlin。
主要特性:
Kotlin 的 USP 是它的語(yǔ)言設(shè)計(jì)。我總是將 Kotlin 看作 JVM 上的 Go/Python,因?yàn)樗拇a簡(jiǎn)潔明了。因此,Kotlin 的生產(chǎn)效率很高。
與許多其他現(xiàn)代語(yǔ)言一樣,Kotlin 提供了空指針安全、類型推斷等功能。
因?yàn)?Kotlin 在 JVM 中運(yùn)行,因此你可以使用現(xiàn)存的 Java 庫(kù)龐大的生態(tài)系統(tǒng)。
Kotlin 是開發(fā) Android 應(yīng)用程序的一流語(yǔ)言,已經(jīng)超越 Java 成為開發(fā) Android 應(yīng)用程序的第一語(yǔ)言。
Kotlin 有 JetBrains 和開源的支持。所以,Kotlin 有很好的工具支持。
有兩個(gè)有趣的項(xiàng)目:Kotlin Native(將 Kotlin 編譯為本機(jī)代碼)和 Kotlin.js(Kotlin 轉(zhuǎn)換為 JavaScript)。如果他們成功了,那么 Kotlin 可以在 JVM 之外使用。
Kotlin 還提供了一種編寫 DSL(領(lǐng)域特定語(yǔ)言)的簡(jiǎn)單方法。
受歡迎程度:
自 2015 年首次發(fā)布以來(lái),Kotlin 的受歡迎程度正在飆升。根據(jù) Stack Overflow,Kotlin 是 2019 年第四受歡迎的編程語(yǔ)言:
圖片來(lái)源:Stackoverflow
Kotlin 也是增長(zhǎng)最快的編程語(yǔ)言之一,排名第四:
圖片來(lái)源:Github Octoverse
熱門編程語(yǔ)言排名網(wǎng)站 PyPl 將 Kotlin 列為第 12 位最受歡迎的編程語(yǔ)言,并有很高的上升趨勢(shì):
圖片來(lái)源:Pypl
自從谷歌宣布 Kotlin 是開發(fā) Android 應(yīng)用程序的一流語(yǔ)言以來(lái),Kotlin 的受歡迎程度快速上升,如下圖所示:
圖片來(lái)源:Google Trends
主要用例:
企業(yè)應(yīng)用程序
Android應(yīng)用程序開發(fā)
主要競(jìng)爭(zhēng)語(yǔ)言:
Java
Scala
Python
Go
TypeScript
JavaScript 是一種優(yōu)秀的語(yǔ)言,但 2015 年以前的 JavaScript 有許多缺點(diǎn)。甚至著名的軟件工程師 Douglas Crockford 也寫過(guò)一本書《JavaScript: The Good Parts》,并暗示 JavaScript 有很多不好的部分。由于沒有模塊化和「回調(diào)地獄」,開發(fā)人員不喜歡維護(hù)特別大的 JavaScript 項(xiàng)目。
Google 甚至開發(fā)了一個(gè)平臺(tái),將 Java 代碼轉(zhuǎn)換為 JavaScript 代碼(GWT)。許多公司或個(gè)人試圖開發(fā)更好的 JavaScript,例如 CoffeeScript、Flow、ClojureScript,但微軟的 TypeScript 無(wú)疑是其中最突出的。由 Delphi 的創(chuàng)建者 Anders Hejlsberg 領(lǐng)導(dǎo)的一組微軟工程師創(chuàng)建了 TypeScript,把它作為 JavaScript 的靜態(tài)類型的模塊化超集。
在編譯期間,TypeScript 被編譯為 JavaScript。2014 年首次發(fā)布以來(lái),TypeScript 迅速引起社會(huì)關(guān)注。當(dāng)時(shí)谷歌還計(jì)劃開發(fā)一個(gè)靜態(tài)類型的 JavaScript 超集。谷歌對(duì) TypeScript 印象深刻,他們沒有開發(fā)新的語(yǔ)言,而是與微軟合作改進(jìn) TypeScript。
Google 使用 TypeScript 作為其 SPA 框架 Angular2+ 的主要編程語(yǔ)言。另外,流行的 SPA 框架 React 提供了對(duì) TypeScript 的支持。另一個(gè)流行的 JavaScript 框架 Vue.js 聲明他們將使用 TypeScript 開發(fā)新的 Vue.js 3:
圖片來(lái)源:Vue.js Roadmap
此外,node.js 的創(chuàng)建者 Ryan Dahl 決定使用 TypeScript 開發(fā)一個(gè)安全的 node.js 替代品 Deno。
主要特性:
與列表中的 Go 或 Kotlin 一樣,TypeScript 的主要特性是語(yǔ)言設(shè)計(jì)。憑借其清晰干凈的代碼,它是最優(yōu)雅的編程語(yǔ)言之一。就開發(fā)人員的生產(chǎn)力而言,它與 JVM 上的 Kotlin 或 Go/Python 不相上下。TypeScript 是最高效的 JavaScript 超集。
TypeScript 是 JavaScript 的強(qiáng)類型超集。它特別適合大型項(xiàng)目,并被正確地稱為「大規(guī)模的 JavaScript」。
「三大」單頁(yè)應(yīng)用程序框架(Angular、React、Vue.js)為 TypeScript 提供了極好的支持。在 Angular 中,TypeScript 是首選的編程語(yǔ)言。在 React 和 Vue.js 中,TypeScript 越來(lái)越流行。
兩個(gè)最大的科技巨頭:微軟和谷歌正在合作開發(fā) TypeScript,它得到了一個(gè)充滿活力的開源社區(qū)的支持。因此,對(duì) TypeScript 的工具支持是最好的支持之一。
由于 TypeScript 是 JavaScript 的超集,它可以在 JavaScript 所有的地方運(yùn)行。TypeScript 可以在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、物聯(lián)網(wǎng)設(shè)備和云上運(yùn)行。
受歡迎程度:
開發(fā)人員喜歡 TypeScript 優(yōu)雅的語(yǔ)言設(shè)計(jì)。在 Stackoverflow 開發(fā)者調(diào)查中,它在最受歡迎的語(yǔ)言類別中與 Python 并列第二:
圖片來(lái)源:Stackoverflow
TypeScript 是增長(zhǎng)最快的 Web 編程語(yǔ)言之一,在 GitHub Octoverse 上排名第五:
圖片來(lái)源:Octoverse
根據(jù) GitHub 貢獻(xiàn),TypeScript 也進(jìn)入了前 10 名(排名第 7):
圖片來(lái)源:Octoverse
TypeScript 在過(guò)去的一年中吸引了越來(lái)越多的眼球,這反映在 Google 趨勢(shì)上:
圖片來(lái)源:Google Trends
主要用例:
Web 用戶界面開發(fā)
服務(wù)器端開發(fā)
主要競(jìng)爭(zhēng)語(yǔ)言:
JavaScript
Dart
Swift
Steve Jobs 拒絕在 iOS 中支持 Java(和 JVM),因?yàn)樗J(rèn)為 Java 將不再是一種主要的編程語(yǔ)言。我們現(xiàn)在知道 Steve Jobs 對(duì) Java 的評(píng)價(jià)是錯(cuò)誤的,但是 iOS 仍然不支持 Java。相反,蘋果選擇 Objective-C 作為 iOS 中的主流編程語(yǔ)言。Objective-C 是一門很難掌握的語(yǔ)言。而且,它具備現(xiàn)代編程語(yǔ)言所要求的高開發(fā)效率。
在蘋果,Chris Lattner 和其他人開發(fā)了 Swift ,它是一種多范式、通用、可編譯的編程語(yǔ)言,為 Objective-C 提供了一種替代方案。Swift 的第一個(gè)穩(wěn)定版本于 2014 年發(fā)布。Swift 還支持 LLVM 編譯器工具鏈(也由 Chris Lattner 開發(fā))。Swift 與 Objective-C 代碼庫(kù)具有良好的互操作性,并且已經(jīng)成為 iOS 應(yīng)用程序開發(fā)的主要編程語(yǔ)言。
主要特性:
Swift 的一個(gè)致命優(yōu)點(diǎn)是它的語(yǔ)言設(shè)計(jì)。它使用更簡(jiǎn)單、簡(jiǎn)潔和干凈的語(yǔ)法,為 Objective-C 提供了一個(gè)更高效的替代方案。
Swift 還提供了現(xiàn)代程序語(yǔ)言的特性:null 安全性。
Swift 是一種編譯語(yǔ)言,它和 C++一樣快。
Swift 支持 LLVM 編譯器工具鏈。因此,我們可以在服務(wù)器端甚至瀏覽器編程(使用 WebAssembly)中使用 Swift。
Swift 提供自動(dòng)參考計(jì)數(shù)(ARC)支持,這樣可以限制內(nèi)存管理不當(dāng)。
受歡迎程度:
和許多其他現(xiàn)代語(yǔ)言一樣,開發(fā)人員也非常喜歡 Swift。根據(jù) StackOverflow 的調(diào)查,Swift 在最受歡迎的編程語(yǔ)言中排名第六:
在 TIOBE 的編程語(yǔ)言排行榜中,Swift 在 2019 年已升至第 10 位。考慮到這門語(yǔ)言才 5 歲,這是一個(gè)相當(dāng)了不起的成就:
圖片來(lái)源:TIOBE Index
Google trends 還顯示,Swift 的受歡迎程度先急劇上升,隨后在最后幾次飽和中趨勢(shì)略有下降:
圖片來(lái)源:Google Trends
主要用例:
iOS 應(yīng)用程序開發(fā)
系統(tǒng)編程
客戶端開發(fā)(通過(guò) WebAssembly)
主要競(jìng)爭(zhēng)語(yǔ)言:
Objective-C
Rust
Go
Dart
Dart 也是 Google 發(fā)布的編程語(yǔ)言。Google 是網(wǎng)絡(luò)和安卓領(lǐng)域的關(guān)鍵玩家,在網(wǎng)絡(luò)和應(yīng)用程序開發(fā)領(lǐng)域開發(fā)自己的編程語(yǔ)言也就不足為奇了。
Dart 是一種支持強(qiáng)類型和面向?qū)ο缶幊痰耐ㄓ镁幊陶Z(yǔ)言。Dart 也可以被轉(zhuǎn)換成 JavaScript,并且可以運(yùn)行在 JavaScript 運(yùn)行著的任何地方(例如 Web、移動(dòng)、服務(wù)器)。
主要特性:
與 Go 一樣,Dart 也非常注重開發(fā)人員的工作效率。Dart 由于其干凈、簡(jiǎn)單、簡(jiǎn)潔的語(yǔ)法,極大地提高了生產(chǎn)效率,深受開發(fā)人員的喜愛。
Dart 還提供強(qiáng)大的類和面向?qū)ο蟮木幊獭?/p>
Dart 是少數(shù)支持 JIT 編譯和 AOT 編譯的語(yǔ)言之一。因此,Dart 可以以 JavaScript 運(yùn)行時(shí)(V8 引擎)為目標(biāo),Dart 可以編譯成快速的本機(jī)代碼(AOT 編譯)。
跨平臺(tái)的原生應(yīng)用開發(fā)平臺(tái) Flutter 選擇 Dart 作為編程語(yǔ)言來(lái)開發(fā) iOS 和 Android 應(yīng)用。從那以后,Dart 變得越來(lái)越流行。
與 Go 一樣,Dart 也有出色的工具支持和 Flutter 巨大的生態(tài)系統(tǒng)。Flutter 的日益流行只會(huì)增加 Dart 的流行程度。
受歡迎程度:
根據(jù) Github Octoverse,Dart 是 2019 年增長(zhǎng)最快的編程語(yǔ)言,去年它的受歡迎程度翻了五倍:
根據(jù) TIOBE,Dart 居于第 23 位,僅僅 4 年時(shí)間,它已經(jīng)超越了其它很多編程語(yǔ)言:
圖片來(lái)源:TIOBE index
它也是 StackOverflow 開發(fā)者調(diào)查中排名第 12 位的最受歡迎的編程語(yǔ)言之一:
圖片來(lái)源:StackOverflow
除了 Flutter,Dart 的受歡迎程度在過(guò)去兩年也經(jīng)歷了巨大的改善,這一點(diǎn)在 Google 中很明顯:
圖片來(lái)源:Google Trends
主要用例:
應(yīng)用程序開發(fā)
前端開發(fā)
主要競(jìng)爭(zhēng)語(yǔ)言:
JavaScript
TypeScript
Julia
前面列出的編程語(yǔ)言都是由大公司開發(fā)的,但 Julia 不是。在技術(shù)計(jì)算中,通常使用 Python、Matlab 等動(dòng)態(tài)語(yǔ)言。這些語(yǔ)言提供易于使用的語(yǔ)法,但不適合大規(guī)模的技術(shù)計(jì)算,他們使用 C/C++庫(kù)來(lái)處理 CPU 密集型任務(wù)。由于代碼是在兩種語(yǔ)言之間轉(zhuǎn)換的,因此總會(huì)有一些性能損失。
為了解決這個(gè)問(wèn)題,麻省理工學(xué)院的一組研究人員計(jì)劃從頭開始創(chuàng)建一種新的語(yǔ)言,它利用了現(xiàn)代硬件的優(yōu)勢(shì),并結(jié)合了其他語(yǔ)言的最佳部分。他們?cè)诼槭±砉W(xué)院創(chuàng)新實(shí)驗(yàn)室完成這項(xiàng)工作,還發(fā)表了以下宣言:
資料來(lái)源:Julia Presentation
Julia 是一種動(dòng)態(tài)的高級(jí)編程語(yǔ)言,為并發(fā)、并行和分布式計(jì)算提供一流的支持。Julia 的第一個(gè)穩(wěn)定版本于 2018 年發(fā)布,很快就得到了社區(qū)和業(yè)界的青睞。Julia 可以應(yīng)用于科學(xué)計(jì)算、人工智能等許多領(lǐng)域,最終解決「兩種語(yǔ)言」的問(wèn)題。
特性:
和 Rust 一樣,Julia 的主要特點(diǎn)是語(yǔ)言的設(shè)計(jì)。它試圖在不犧牲性能的情況下,結(jié)合現(xiàn)有的編程語(yǔ)言在高性能和科學(xué)計(jì)算中的一些最佳特性。到目前為止,它做得很好。
Julia 是一種可選類型的動(dòng)態(tài)編程語(yǔ)言。因此,Julia 很容易學(xué)習(xí),而且效率很高。
它以多分派編程范式為核心。
它內(nèi)置了對(duì)并發(fā)、并行和分布式計(jì)算的支持。
它還為 I/O 密集型任務(wù)提供異步 I/O。
它速度非常快,可以用于需要數(shù)百萬(wàn)線程的科學(xué)計(jì)算。
受歡迎程度:
在許多領(lǐng)域,Julia 主要與 Python 競(jìng)爭(zhēng)。由于 Python 是最流行的編程語(yǔ)言之一,Julia 成為主流還需要幾年時(shí)間。
Julia 相對(duì)年輕(只有一歲),但在 TIOBE index 中仍排在第 43 位:
圖片來(lái)源:TIOBE
Google Trends 也顯示出過(guò)去的時(shí)間里,程序員對(duì) Julia 的穩(wěn)定興趣。
但考慮到 Julia 背后的功能集和公司數(shù)量,如 NSF、DARPA、NASA、Intel,Julia 何時(shí)取得突破只是個(gè)時(shí)間問(wèn)題。
主要用例:
科學(xué)計(jì)算
高性能計(jì)算
數(shù)據(jù)科學(xué)
可視化
主要競(jìng)爭(zhēng)語(yǔ)言:
Python
Matlab
via:https://towardsdatascience.com/top-7-modern-programming-language-to-learn-now-156863bd1eec
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
些人會(huì)說(shuō)語(yǔ)言學(xué)到最后不都差不多嗎?其實(shí)可以這樣講,也可以不這樣講。雖然每種語(yǔ)言的表達(dá)能力大部分是重合的,只是語(yǔ)法表現(xiàn)形式不一樣,但是由于歷史發(fā)展的原因,每種語(yǔ)言形成了自己的支撐環(huán)境,所以都有其主要的適用范圍。
C、C++、Python和Java四種是通用編程語(yǔ)言,JavaScript和PHP算是Web環(huán)境的專用編程語(yǔ)言。
由于其底層操作特性和歷史的積累,在嵌入式領(lǐng)域是當(dāng)之無(wú)愧的王者。
是一種支持最廣泛編程范式的復(fù)雜語(yǔ)言,在高級(jí)語(yǔ)言當(dāng)中,處理運(yùn)行速度是最快的,大部分的游戲軟件,系統(tǒng)都是由C++來(lái)編寫的。
作為一種靈活的輕便的通用型腳本語(yǔ)言,使用范圍比較廣,從應(yīng)用軟件到Web開發(fā)都有它的身影,由于其解釋語(yǔ)言的特點(diǎn),比較適合輕量級(jí)或原型開發(fā);
Java由于其跨平臺(tái)可移植性,在Web開發(fā)領(lǐng)域大放異彩,特別是在企業(yè)級(jí)Web開發(fā),同時(shí)由于Android系統(tǒng)采用Java來(lái)開發(fā)應(yīng)用程序,所以也隨著Android的發(fā)展而應(yīng)用越發(fā)廣泛;
JavaScript語(yǔ)言由于其是瀏覽器內(nèi)置的腳本語(yǔ)言,是Web前端開發(fā)的主流,近年來(lái)由于google的V8引擎開源,出現(xiàn)了Node.js之類JavaScript后臺(tái)開發(fā)框架,把JavaScript的應(yīng)用領(lǐng)域擴(kuò)展到了Web后臺(tái)。
獨(dú)特的語(yǔ)法混合了C、Java、Perl以及PHP自創(chuàng)的語(yǔ)法。它可以比CGI或者Perl更快速地執(zhí)行動(dòng)態(tài)網(wǎng)頁(yè);還可以執(zhí)行編譯后代碼,編譯可以達(dá)到加密和優(yōu)化代碼運(yùn)行,使代碼運(yùn)行更快。
理清不同語(yǔ)言間主要語(yǔ)法特性的差異,才能更好的在合適的領(lǐng)域或場(chǎng)景下去應(yīng)用合適的編程語(yǔ)言,以滿足我們所面對(duì)的需求。這六種語(yǔ)言都是從C語(yǔ)言發(fā)展而來(lái),所以它們的語(yǔ)法都比較像C語(yǔ)言,下面我就主要語(yǔ)法特性對(duì)各個(gè)語(yǔ)言做一個(gè)對(duì)比。
1、常量定義
C:#define TEST 0
C++:#define TEST 0
或者
const test = 0;
Python:test = 0
C#:不支持
PHP:define('test', 1);
Java:final int test = 0;
分析:JavaScript不支持常量,C、C++都用特有的預(yù)定義宏,PHP用特殊的define語(yǔ)法,其它的都用定義不變變量的方式。
2、變量定義
C:int test = 0;
C++:int test = 0;
Python:test = 0
JavaScript:val test = 0;
PHP:$test = 0;
Java:int test = 0;
分析:這個(gè)最基本的都支持了。
3、函數(shù)定義
C:int test(int param){}
C++:int test(int param){}
Python:def test(param):
JavaScript:function test(param){}
PHP:function test($param){}
Java:public class test{
public int test(int param){} }
分析:這個(gè)也是最基本的了,只是Java比較特殊,不支持定義類之外的函數(shù)。
4、類定義(含繼承)
C:不支持
C++:class test2: public test1{}
Python:class test2(test1):
JavaScript:function test2(){}
test2.prototype =inherit(test1.prototype){}
PHP:class test2 extend test1{}
Java:class test2 extends test1{}
分析:C由于是傳統(tǒng)面向過(guò)程的語(yǔ)言不支持類,其他的都支持了,只是JavaScript的類模型比較特殊,把函數(shù)作為類來(lái)使用。
5、對(duì)象定義
C:不支持
C++:test2 obj = new test2();
Python:obj = test2()
JavaScript:var obj = new test2();
PHP:$obj = new test2();
Java:test2 obj = new test2();
分析:除了C外其它語(yǔ)言都是通過(guò)new一個(gè)對(duì)象。
6、數(shù)組定義
C:int a[] = {1, 2, 3};
C++:int a[] = {1, 2, 3};
Python:a = [1, 2, 3]
JavaScript:var a = [1, 2, 3];
PHP:$a = array("1", "2", "3");
Java:int a[] = {1, 2, 3};
分析:數(shù)組是語(yǔ)言的基本特性,都支持了,只是PHP通過(guò)類似函數(shù)調(diào)用的語(yǔ)法來(lái)完成。
7、條件語(yǔ)句
C:if (test > 0){}
else if (test < 0){}
else{}
C++:if (test > 0){}
else if (test < 0){}
else{}
Python:if test > 0:
elif test < 0:
else:
JavaScript:if (test > 0){}
else if (test < 0){}
else{}
PHP:if ($test > 0){}
elseif ($test < 0){}
else{}
Java:if (test > 0){}
else if (test < 0){}
else{}
分析:這是最基本的語(yǔ)句,都支持了。
8、循環(huán)語(yǔ)句
C:for (idx=0; idx<num; idx++){}
C++:for (idx=0; idx<num; idx++){}
Python:for idx in range(1,10):
JavaScript:for (var idx=0; idx<num; idx++){}
PHP:for ($idx=0; $idx<$num; $idx++){}
Java:for (idx=0; idx<num; idx++){}
分析:這個(gè)也是基本的語(yǔ)句,都支持了。
9、foreach語(yǔ)句
C:不支持
C++:不支持
Python:for i in a:
或者
for key in d:
d[key]
JavaScript:for(i in a){}
PHP:foreach($a as $i){}
Java:for(int i : a){}
分析:foreach算是循環(huán)語(yǔ)句的一個(gè)變種,在操作順序容器的時(shí)候非常有用,可以看到C和C++不支持,其它的都語(yǔ)言內(nèi)置支持了。
10、打印語(yǔ)句
C:printf("test: %d", val);
C++:cout<<"test: "<<val<<endl;
Python:print "test: "+val
JavaScript:不支持
PHP:echo "test: $val";
Java:System.out.println("test :"+val);
分析:打印算是語(yǔ)言所運(yùn)行環(huán)境的支持庫(kù)功能,除了JavaScript外都支持了,因?yàn)镴avaScript主要使用來(lái)操控DOM樹的,沒有自己的輸出窗口所以也沒必要支持。
11、字符串定義
C:char test[] = {"helloworld"};
C++:String test = "helloworld";
Python:test = "helloworld"
JavaScript:var test = "helloworld";
PHP:$test = "helloworld";
Java:String test = "helloworld";
分析:這個(gè)都支持了,其中C++、Java都是用標(biāo)準(zhǔn)庫(kù)來(lái)現(xiàn)實(shí)的。
12、字符串串接
C:test = strcat(test1, test2);
C++:test = test1 + test2;(STL庫(kù))
Python:test = test1 + test2
JavaScript:var test = test1 + test2;
PHP:$test = $test1 .= $test2;
Java:test = test1 + test2;
分析:很有用的功能,除了C是用標(biāo)準(zhǔn)庫(kù)函數(shù)來(lái)實(shí)現(xiàn),其它都是語(yǔ)言內(nèi)置支持了。
13、字符串分割
C:不支持
C++:test.substr(3, 8);
Python:test[3:8]
JavaScript:test.slice(3, 5);
PHP:substr($test, 3, 5);
Java:test.substring(3, 8);
分析:常用的功能,C不支持,Python是語(yǔ)言內(nèi)置支持,其他的都依靠庫(kù)來(lái)完成。
14、字符串正則表達(dá)式
C:不支持
C++:不支持
Python:test.replace("test1", "test2")
JavaScript:test.replace(/test1/gi, "test2");
PHP:str_replace($test, "test1", "test2");
Java:test.replaceAll("test1", "test2");
分析:常用的功能,可惜C、C++不支持,其他都有標(biāo)準(zhǔn)庫(kù)來(lái)支持。
15、內(nèi)置容器類型
C:數(shù)組
C++:數(shù)組
順序容器 Vector
關(guān)聯(lián)容器 Pair MapSet
Python:列表/元組
字典
JavaScript:數(shù)組
對(duì)象
PHP:數(shù)組(含關(guān)聯(lián)數(shù)組)
Java:數(shù)組
序列 Collection
映射表 Map
分析:C最簡(jiǎn)單只支持?jǐn)?shù)組,其他都支持容器,不過(guò)主要還是順序容器和關(guān)聯(lián)容器兩大類。
16、注釋方式
C:/* */
C++://
Python:#
JavaScript:/* */
//
PHP:/* */
//
#
Java:/* */
//
分析:大概就/**/、//、#三種方式,各自支持情況不一。
17、多線程支持
C:支持
C++:支持
Python:支持
JavaScript:不支持
PHP:不支持
Java:支持
分析:四種通用編程語(yǔ)言都支持了,兩種專用編程語(yǔ)言都不支持。
18、socket支持
C:支持
C++:支持
Python:支持
JavaScript:不支持
PHP:支持
Java:支持
分析:除了JavaScript以外都支持,這也是JavaScript的應(yīng)用領(lǐng)域限制所決定的。
19、垃圾回收機(jī)制
C:不支持
C++:不支持
Python:支持
JavaScript:支持
PHP:支持
Java:支持
分析:這是現(xiàn)代語(yǔ)言的重要機(jī)制,C和C++不支持,其他的都支持了。
20、引入其他文件中的函數(shù)
C:export int test();
C++:export int test();
Python:from test import *
JavaScript:<script language='javascript' src="test.js"charset="utf-8"></script>
PHP:require_once('test.php');
或者
include_once('test.php');
Java:import java.util.test.*;
分析:都支持,C和C++用export,Python和Java用import,JavaScript依靠HTML腳本,PHP用自己的函數(shù)調(diào)用。
21、將字符串作為指令執(zhí)行
C:不支持
C++:不支持
Python:eval("port=5060")
JavaScript:eval("port=5060;");
PHP:eval("port=5060;");
Java:Porcess proc = new ProcessBuilder(“test”).start();
分析:很有用的一個(gè)動(dòng)態(tài)語(yǔ)言特性,C和C++都不支持,Java要類庫(kù)來(lái)支持,其它的語(yǔ)言內(nèi)置eval關(guān)鍵字.
C/C++資料分享:
需要的小伙伴們可以【點(diǎn)擊下方】鏈接哦~
什么是編程語(yǔ)言?"我總會(huì)問(wèn)自己這個(gè)問(wèn)題,SQL是嗎?Excel是嗎?HTML是嗎?……這些問(wèn)題總在困擾著我,所以我把這些疑問(wèn)整理成問(wèn)卷的形式,向各位網(wǎng)友征集了大家的想法。
上圖就是我們這次調(diào)研結(jié)果,這次調(diào)查我們一共設(shè)置了三個(gè)選項(xiàng):是、否和棄權(quán),調(diào)查對(duì)象主要有HackNews和Reddit的讀者組成。
正如我們所預(yù)期的那樣,絕大多數(shù)人都認(rèn)同C、Java和JavaScript是編程語(yǔ)言,而其他選項(xiàng)的調(diào)查結(jié)果就有趣了很多:
Verilog:大多數(shù)人同意Verilog(硬件描述語(yǔ)言)是一種編程語(yǔ)言,他們認(rèn)為即使軟件的輸出是硬件,但生成硬件的過(guò)程仍然是程序化的。
SQL:大多數(shù)人認(rèn)為SQL是一個(gè)編程語(yǔ)言,但是很多人因?yàn)槠淙狈ν暾远岢隽水愖h,SQL雖然沒有類和循環(huán),但其仍然有算術(shù)表達(dá)式、函數(shù)和變量。
C preprocessor:被調(diào)查者對(duì)于C preprocessor的興趣明顯要高于正則表達(dá)式,C preprocessor本質(zhì)上是一個(gè)字符串替換引擎,它比正則表達(dá)式的功能更少,只用于生成C代碼。但是,很多人認(rèn)為是否被用來(lái)生成代碼是判斷是否為編程語(yǔ)言的關(guān)鍵因素。
LaTeX:咋一看,這是最接近編程語(yǔ)言的,LaTeX具有變量,函數(shù)和許多其他類PL功能(LaTeX是Turing-complete!),但是由于它的輸出是一個(gè)文檔,所以我并不看好大家會(huì)把它當(dāng)做是一種編程語(yǔ)言。
但是令人驚訝的是,它就排在C preprocessor之后。
CSS:進(jìn)入Web語(yǔ)言時(shí)代之后,少數(shù)的受訪者也把CSS當(dāng)做是一種編程語(yǔ)言。
TensorFlow:TensorFlow是一種具有變量、循環(huán)、編譯器等的數(shù)據(jù)流語(yǔ)言。然而,因?yàn)樗且环N特定于領(lǐng)域的語(yǔ)言,而且沒有獨(dú)立的語(yǔ)法(它通常通過(guò)Python API編程),大多數(shù)被調(diào)查者并不認(rèn)為它是一種編程語(yǔ)言。
HTML:可能和CSS的情況一樣。
JSON: JSON是一種數(shù)據(jù)規(guī)范語(yǔ)言,但是大多數(shù)人并不把它當(dāng)做是編程語(yǔ)言。
Microsoft Word: GUIs不可能是編程語(yǔ)言!
Eclipse:看結(jié)果,很顯然并不是!
對(duì)于上述列舉的大家是否認(rèn)為其屬于編程語(yǔ)言呢?歡迎在下方留言評(píng)論!
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。