認(rèn)識Nim:具有類似Python語法和C效率的語言
成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,先為民勤等服務(wù)建站,民勤等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為民勤企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。幾周前,我在GitHub上瀏覽時遇到了一個引起我注意的回購。 它托管了一個完全用Nim編寫的項(xiàng)目。
Nim到底是什么? 我想。
我立刻得出結(jié)論,這是很多人使用的許多編程語言之一,但是我只是一個愚蠢的人,不知道它。 但是我沒有把它放在一邊,而是決定:讓我們對此有所了解。
然后,我有了兩個主要認(rèn)識:
因此,這里簡要介紹了我在快速編程教程N(yùn)im方面的經(jīng)驗(yàn),以及為什么該語言對我來說非常有前途。
給我看代碼!
這是我在Nim中編寫的一個無用的程序:
看起來很干凈。 它也是如此簡單,即使您以前可能從未聽說過Nim,您也可以毫不費(fèi)力地弄清楚它的作用。 (提示:它打印數(shù)字:5我:5。)
因此,讓我們分解一下這里似乎熟悉的內(nèi)容:
變量聲明
JavaScript開發(fā)人員非常熟悉。 雖然某些語言使用var,有些語言使用let,但是JS和Nim都允許使用兩者之一進(jìn)行聲明。 請務(wù)必注意,兩種語言的含義并不相同。 但是稍后會更多。
塊語法
要在Nim中標(biāo)記一個新塊,我們使用冒號,后跟縮進(jìn)線。 那就是Python。
關(guān)鍵詞
這兩個循環(huán)以及if語句看起來都像是從Python中拔出來的。 實(shí)際上,從第5行開始的所有內(nèi)容實(shí)際上都是有效的Python(假設(shè)我們定義了echo函數(shù))。
因此,是的,Python中的許多關(guān)鍵字和運(yùn)算符在Nim中也有效,例如not,is,and或or等。
到目前為止,Nim完全沒有什么特別的。 由于我們需要使用let或var,因此它看起來像是Python的較差版本(在語法上)。
但是,如果我告訴您的話,該怎么辦:Nim是一種靜態(tài)類型的語言,其運(yùn)行速度幾乎與C一樣快。
哦,現(xiàn)在我們在說話。
一場友好的比賽
在深入探討Nim語法(尤其是靜態(tài)類型的部分,我們?nèi)匀粵]有看到它)之前,讓我們嘗試備份有關(guān)其速度的聲明。 為此,我編寫了一個程序來天真地(即不進(jìn)行動態(tài)編程)計(jì)算Nim,Python和C中的第n個斐波那契數(shù)。
為了公平起見,我根據(jù)針對此問題的建議Leetcode解決方案(方法1)對實(shí)現(xiàn)進(jìn)行了標(biāo)準(zhǔn)化,并確保在三種語言中盡可能地堅(jiān)持下去。
為了計(jì)時執(zhí)行時間,我在Bash shell中使用了時間輸出中的"真實(shí)"值。
以下是計(jì)算第40個斐波那契數(shù)的結(jié)果:
是的,那件事發(fā)生了。
現(xiàn)在,這是非常有限的,并且離科學(xué)實(shí)驗(yàn)還很遙遠(yuǎn),但這與其他進(jìn)行了更嚴(yán)格基準(zhǔn)測試的人的發(fā)現(xiàn)一致 。
不過,我將在本文中運(yùn)行的所有代碼都可以在GitHub上找到,包括有關(guān)如何進(jìn)行此實(shí)驗(yàn)的說明。
那么,為什么Nim比Python快得多?
好吧,我要說有兩個主要原因。 大大簡化,這些是:
運(yùn)行更快,編寫速度更慢
這是Python文檔關(guān)于解釋語言必須說的話:
"盡管解釋型語言的程序運(yùn)行通常也較慢,但它們通常具有比編譯型語言更短的開發(fā)/調(diào)試周期。"
例如,這句話很好地總結(jié)了Python和C之間的折衷。 您可以使用Python進(jìn)行的任何操作,什么叫軟文營銷?也可以使用C進(jìn)行的操作,什么叫軟文營銷?程序的運(yùn)行速度將提高多個數(shù)量級。
但是,您將花費(fèi)更多的時間用C編寫和調(diào)試代碼,并且代碼更長且可讀性更差。 這就是為什么C不再流行的原因,Python如此流行。 簡而言之:Python是"簡單的"(當(dāng)然,相對而言)。
因此,如果Python在頻譜的一端,而C在另一端,則Nim試圖處于中間位置:有點(diǎn)快又容易嗎? 這樣的事情。
但是,使Nim脫穎而出的原因是,乍一看,它似乎已使權(quán)衡最小化。 換句話說,它比Python快得多,但是編程起來卻不像C那樣困難(或者感覺像經(jīng)過簡短檢查一樣)。
為了說明這一點(diǎn),讓我們看一下斐波那契實(shí)驗(yàn)中的代碼。
這是C代碼:
Python:
和Nim:
盡管Nim擁有奇怪的proc東西,親愛的上帝,還是使用=聲明函數(shù)(或過程,稱呼它們),但它仍然比C干凈得多。
因此,也許這是一個值得權(quán)衡的問題? 比Python難寫一點(diǎn),但是要快幾十倍-我可以接受。
Nim語法
以下是有關(guān)Nim語法的一些關(guān)鍵點(diǎn)的簡要概述:
變量
變量使用var,let或const聲明。
var和const基本上就像JavaScript一樣工作,但是讓我們有一個不同的故事。
盡管JavaScript中的let與var在范圍上有所不同,但Nim中的let表示一個變量,其值在初始化后不能更改。 有人告訴我,這顯然類似于Swift。
但這不是常數(shù)嗎?
好吧,在Nim中,區(qū)別如下:
對于const,編譯器必須能夠在編譯時確定該值,而let可以在運(yùn)行時確定。
文檔提供了以下示例:
此外,您還可以像這樣聲明變量:
函數(shù)
Nim中的函數(shù)稱為過程,它們的聲明是這樣完成的:
鑒于該語言在很多方面看起來都像Python,因此當(dāng)您初次看到它們時,過程肯定顯得有些怪異。
用=代替{或:尤其奇怪。 但是,在單線過程中看起來更好一些:
此外,您還可以從以下函數(shù)返回:
感覺您仍然應(yīng)該返回結(jié)果,但結(jié)果不是變量,而是一個關(guān)鍵字。 上面的代碼段是完全有效的Nim。
而且您還可以重載過程:
控制流
很像Python。
要遍歷某個范圍,可以使用countup(start,finish)或countdown(start,finish)代替一個范圍。 或者,您可以簡化整個過程并使用:for i in start..finish。
打印并獲取用戶輸入
與Python比較時,readLine(stdin)等效于input(),echo等效于print。
echo可以帶或不帶括號。
我的目標(biāo)是給您帶來Nim的品味,而不是通讀其完整手冊。 因此,我想我將在此處停止使用簡單的語法,然后略過一些其他功能。
附加功能
面向?qū)ο缶幊?/p>
Nim不是面向?qū)ο蟮?,但是對對象的支持極簡。 但是,它們不像Python類那么整潔。
宏
Nim支持宏和元編程,實(shí)際上,它似乎非常強(qiáng)調(diào)它。 由三部分組成的教程系列的整個部分都專門針對它。
這是一個簡單的示例:
基本類型
Nim中的基本類型為:字符串,字符,布爾,整數(shù),整數(shù)和浮點(diǎn)數(shù)。
這些也是有效的:
int8 int16 int32 int64 uint8 uint16 uint32 uint64 float32 float64
另外,與Python不同,字符串在Nim中是可變的。
注釋
您可能已經(jīng)在上面的Python語法中看到了我的注釋,但是與Python不同,多行注釋也使用了哈希符號(后接):
JavaScript編譯
從Nim網(wǎng)站:
" Nim包括一流的JavaScript后端,因此您可以輕松地同時定位客戶端和服務(wù)器托管。"
盡管我不確定有多少人會實(shí)際使用它,但是這很酷。 但是,如果您要播放用Nim編寫的Browser Snake,則可以這樣做。 不過這次我沒有建造它。
迭代器
除了定義一個proc之外,還可以定義一個迭代器。 但是,Nim迭代器實(shí)際上更像Python生成器。 這是一個例子:
不區(qū)分Case和下劃線
Nim不區(qū)分大小寫和下劃線(第一個字符除外)。
因此,HelloWorld和helloWorld是不同的,但是helloWorld,helloworld和hello_world都相同,因此有效:
人氣度
也許您閱讀了標(biāo)題并對自己說:嗯,我聽說過Nim或使用Nim!
那樣的話,嘿,我為你感到高興。 但是,我確實(shí)嘗試獲得了有關(guān)該語言受歡迎程度的一些信息,而且肯定不是那么高。
例如,在2020年堆棧溢出調(diào)查中甚至沒有提到Nim。 我在LinkedIn上找不到Nim開發(fā)人員的工作(位置設(shè)置為Worldwide),并且該語言的Stack Overflow標(biāo)簽只有349個問題。 (與Python的1,500,000或更新語言(例如Swift的270,000)進(jìn)行比較。)
因此,可以肯定地說,大多數(shù)開發(fā)人員都沒有使用過它,而且許多開發(fā)人員甚至從未聽說過Nim這個名字。
真正的Python替代品?
我對你說老實(shí)話,我覺得Nim很酷。
在撰寫本文時,我已經(jīng)研究了最低限度,因此還沒有深入到最低限度,但是我可以看到自己將來會用到它。
但是,盡管基本語法與Python非常相似,但是它變得相當(dāng)復(fù)雜,而且速度很快,我相信這會吸引很多 Python用戶/開發(fā)人員。
就我個人而言,我是Python的忠實(shí)擁護(hù)者,也是靜態(tài)類型語言的忠實(shí)擁護(hù)者,因此對我而言,在某些情況下,性能的提高將足以彌補(bǔ)所增加的冗長性。
然后,通過撰寫本文,我意識到:Go呢?
我敢肯定,你們中的許多人在閱讀時都在考慮這一點(diǎn),這是有道理的。 盡管Nim的語法可能更接近于Python,但它確實(shí)在Go語言主導(dǎo)的高性能但比C ++語言更激烈的競爭中。
有趣的事實(shí):我還偷偷地用Go進(jìn)行了速度測試。 特別是對于fibonacci(40),它的速度與C一樣快。
那么,Nim可以與Python競爭嗎? 我對此表示高度懷疑。 正如我所指出的那樣,我們看到了計(jì)算機(jī)變得越來越快,編程變得越來越容易的趨勢,以至于即使Nim提供了很好的權(quán)衡,我也認(rèn)為采用干凈而通用的Python還不夠。
編輯:我與Nim Core Devs的一位發(fā)言人交談,他告訴我他認(rèn)為Nim比從Python過渡的人更適合從C ++過渡的人。
但是,它可以與Go競爭嗎? 也許(如果Google不落后于Go)。 語法友好,語言功能強(qiáng)大,并且比Go提供的功能(例如宏和重載)更好地支持C / C ++功能。
也許那是我接下來要寫的文章。
謝謝閱讀!
新聞名稱:Python的替代品?我嘗試了你從未聽說過的優(yōu)秀編程語言
文章URL:http://www.rwnh.cn/article10/sosdgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、云服務(wù)器、建站公司、動態(tài)網(wǎng)站、靜態(tài)網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)