熟悉Nim:具有相似Python語法和C效率的語言
幾周前,我在GitHub上閱讀時遭遇了一個引起我留心的回購。 它托管了一個徹底用Nim編寫的項目。
Nim究竟是什麼? 我想。
我馬上得出結論,這是許多人採用的很多編程語言之一,不過我只是一個愚昧的人,無知道它。 不過我沒有把它放在一邊,而是決擇:讓我們對此有所了解。
然后,我有了兩個重要熟悉:
-
不,許多人不採用這種語言。
但也許應當如此。
因此,這里簡要介紹了我在快速編程教程Nim方面運彩投注站的經歷,以及為什麼該語言對我來說極度有出路。
給我看代碼!
這是我在Nim中編寫的一個無用的步驟:
看起來很干凈。 它也是如此簡樸,縱然您以前可能未曾據說過Nim,您也可以絕不吃力地弄清晰它的作用。 (提示:它打印數字:5我:5。)
因此,讓我們分離一下這里好像認識的內容:
變量宣示
JavaScript開闢人員極度認識。 固然某些語言採用var,有些語言採用let,不過JS和Nim都許可採用兩者之一進行宣示。 請務必留心,兩種語言的寓意并不雷同。 不過稍后會更多。
塊語法
要在Nim中標誌一個新塊,我們採用冒號,后跟縮進線。 那即是Python。
要害詞
這兩個輪迴以及if語句看起來都像是從Python中拔出來的。 實質上,從第5行開端的所有內容實質上都是有效的Python(假設我們定義了echo函數)。
因此,是的,Python中的很多要害字和運算符在Nim中也有效,比如not,is,and或or等。
到目前為止,Nim徹底沒有什麼獨特的。 由于我們需求採用let或var,因此它看起來像是Python的較差版本(在語法上)。
不過,假如我通知您的話,該怎麼辦:Nim是一種靜態類型的語言,其運行速度幾乎與C一樣快。
哦,此刻我們在開口。
一場友善的賽事
在深入探討Nim語法(尤其是靜態類型的部門,我們仍運彩 網路投注 申請然沒有看到它)之前,讓我們嘗試備份有關其速度的宣示。 為此,我編寫了一個步驟來天真地(即不進舉動態編程)算計Nim,Python和C中的第n個斐波那契數。
為了公正起見,我依據針對此疑問的建議Leetcode解決計劃(想法1)對實現進行了尺度化,并確保在三種語言中盡可能地堅定下去。
為了計時執行時間,我在Bash shell中採用了時間輸出中的”真理”值。
以下是算計第40個斐波那契數的結局:
是的,那件事發作了。
此刻,這長短常有限的,并且離科學試驗還很迢遙,但這與其他進行了更嚴峻基準測試的人的發明一致 。
但是,我將在本文中運行的所有代碼都可以在GitHub上找到,包含有有關如何進行此試驗的說明。
那麼,為什麼Nim比Python快得多?
好吧,我要說有兩個重要來由。 大大簡化,這些是:
-
Nim是在辯白Python時編譯的(差異意?請單擊鏈接)。 這意味著在運行Python步驟時,除了僅運行該步驟外,還有更多的任務要做,由於在實質執行之前需求對其進行辯白。 這一般會使語言慢許多。
Nim是靜態鍵入的。 固然我之前顯示的示例沒有單一的類型宣示或注釋,但稍后我們將看到它的確是靜態類型的語言。 對于動態類型的Python,辯白器需求做更多的任務來找出并恰當地處置類型,這會減慢執行速度。
運行更快,編寫速度更慢
這是Python文檔關于辯白語言必要說的話:
“盡管辯白型語言的步驟運行一般也較慢,但它們一般具有比編譯型語言更短的開闢調試周期。”
比如,這句話很好地結算了Python和C之間的折衷。 您可以採用Python進行的任何操縱,也可以採用C進行的操縱,步驟的運行速度將提高多個數目級。
不過,您將消費更多的時間用C編寫和調試代碼,并且代碼更長且可讀性更差。 這即是為什麼C不再流行的來由,Python如此流行。 簡而言之:Python是”簡樸的”(當然,相對而言)。
因此,假如Python在頻譜的一端,而C在另一端,則Nim試圖處于中間位置:有點快又輕易嗎? 這樣的事務。
不過,使Nim脫穎而出的來由是,乍一看,它好像已使權衡最小化。 換句話說,它比Python快得多,不過編程起來卻不像C那樣難題(或者感到像途經簡短查驗一樣)。
為了說明這一點,讓我們看一下斐波那契試驗中的代碼。
這是C代碼:
Python:
和Nim:
盡管Nim佔有不尋常的proc物品,親愛的上帝,還是採用=宣示函數(或過程,稱謂它們),但它仍然比C干凈得多。
因此,也許這是一個值得權衡的疑問? 比Python難寫一點,不過要快幾十倍-我可以承受。
Nim語法
以下是有關Nim語法的一些要害點的簡要概述:
變量
變量採用var,let或const宣示。
var和const根本上就像JavaScript一樣任務,不過讓我們有一個差異的故事。
盡管JavaScript中的let與var在范今天世足賠率圍上有所差異,但Nim中的let表明一個變量,其值在初始化后不可更換。 有人通知我,這顯然相似于Sift。
但這不是常數嗎?
好吧,在Nim中,區別如下:
對于const,編譯器必要或許在編譯時確認該值,而let可以在運行時確認。
文檔提供了以下示例:
此外,您還可以像這樣宣示變量:
函數
Nim中的函數稱為過程,它們的宣示是這樣辦妥的:
鑒于該語言在許多方面看起來都像Python,因此當您首次看到它們時,過程肯定顯得有些怪異。
用=取代{或:尤其不尋常。 不過,在單線過程中看起來更好一些:
此外,您還可以從以下函數回去:
感到您仍然應當回去結局,但結局不是變量,而是一個要害字。 上面的代碼運彩 美金盤段是徹底有效的Nim。
並且您還可以重載過程:
管理流
很像Python。
要遍歷某個范圍,可以採用countup(start,finish)或countdon(start,finish)取代一個范圍。 或者,您可以簡化整個過程并採用:for i in start..finish。
打印并獲取用戶輸入
與Python對照時,readLine(stdin)等效于input(),echo等效于print。
echo可以帶或不帶括號。
我的目的是給您帶來Nim的品味,而不是通讀其完整手冊。 因此,我想我將在此處休止採用簡樸的語法,然后略過一些其他性能。
附加性能
面向對象編程
Nim不是面向對象的,不過對對象的支持極簡。 不過,它們不像Python類那麼整齊。
宏
Nim支持宏和元編程,實質上,它好像極度強調它。 由三部門構造的教程系列的整個部門都專門針對它。
這是一個簡樸的示例:
根本類型
Nim中的根本類型為:字符串,字符,布爾,整數,整數和浮點數。
這些也是有效的:
int8 int16 int32 int64 uint8 uint16 uint32 uint64 float32 float64
另有,與Python差異,字符串在Nim中是可變的。
注釋
您可能已經在上面的Python語法中看到了我的注釋,不過與Python差異,多行注釋也採用了哈希符號(后接):
JavaScript編譯
從Nim站:
” Nim包含有一流的JavaScript后端,因此您可以輕松地同時定位客戶端和辦事器。”
盡管我不確認有幾多人會實質採用它,不過這很酷。 不過,假如您要播放用Nim編寫的Broser Snake,則可以這樣做。 但是這一次我沒有建造它。
迭代器
除了定義一個proc之外,還可以定義一個迭代器。 不過,Nim迭代器實質上更像Python生成器。 這是一個範例:
不分辨Case和下劃線
Nim不分辨大小寫和下劃線(第一個字符除外)。
因此,HelloWorld和helloWorld是差異的,不過helloWorld,helloorld和hello_orld都雷同,因此有效:
人氣量
也許您瀏覽了題目并對個人說:嗯,我據說過Nim或採用Nim!
那樣的話,嘿,我為你感覺開心。 不過,我的確嘗試牟取了有關該語言受迎接水平的一些信息,並且肯定不是那麼高。
比如,在2024年堆棧溢出查訪中甚至沒有提到Nim。 我在LinkedIn上找不到Nim開闢人員的任務(位置建置為Worlde),并且該語言的Stack Overflo標簽只有349個疑問。 (與Python的1,500,000或除舊語言(比如Sift的270,000)進行對照。)
因此,可以肯定地說,多數開闢人員都沒有採用過它,並且很多開闢人員甚至未曾據說過Nim這個名字。
真正的Python替換品?
我對你說厚道話,我覺得Nim很酷。
在撰寫本文時,我已經研討了最低限度,因此還沒有深入到最低限度,不過我可以看到個人他日會用到它。
不過,盡管根本語法與Python極度類似,不過它變得相當復雜,並且速度很快,我相信這會吸收許多 Python用戶開闢人員。
就我自己而言,我是Python的忠實擁護者,也是靜態類型語言的忠實擁護者,因此對我而言,在某些場合下,功能的提高將足以補救所提升的冗長性。
然后,通過撰寫本文,我意識到:Go呢?
我敢肯定,你們中的很多人在瀏覽時都在斟酌這一點,這是有道理的。 盡管Nim的語法可能更靠攏于Python,但它的確在Go語言主導的高功能但比C ++語言更劇烈的競爭中。
有趣的事實:我還偷偷地用Go進行了速度測試。 獨特是對于fibonacci(40),它的速度與C一樣快。
那麼,Nim可以與Python競爭嗎? 我對此表明高度懷疑。 正如我所指出的那樣,我們看到了算計機變得越來越快,編程變得越來越輕易的趨勢,以至于縱然Nim提供了很好的權衡,我也以為采用干凈而通用的Python還不夠。
編制:我與Nim Core Devs的一位講話人對話,他通知我他以為Nim比從Python過渡的人更合適從C ++過渡的人。
不過,它可以與Go競爭嗎? 也許(假如Google不落后于Go)。 語法友善,語言性能強盛,并且比Go提供的性能(比如宏和重載)更好地支持C C ++性能。
也許那是我接下來要寫的詞nba 運彩 冠軍章。
謝謝瀏覽!