自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python的替代品?我嘗試了你從未聽說(shuō)過(guò)的優(yōu)秀編程語(yǔ)言

開發(fā)
幾周前,我在GitHub上瀏覽時(shí)遇到了一個(gè)引起我注意的回購(gòu)。 它托管了一個(gè)完全用Nim編寫的項(xiàng)目。

 認(rèn)識(shí)Nim:具有類似Python語(yǔ)法和C效率的語(yǔ)言

 

[[334199]]

幾周前,我在GitHub上瀏覽時(shí)遇到了一個(gè)引起我注意的回購(gòu)。 它托管了一個(gè)完全用Nim編寫的項(xiàng)目。

Nim到底是什么? 我想。

我立刻得出結(jié)論,這是很多人使用的許多編程語(yǔ)言之一,但是我只是一個(gè)愚蠢的人,不知道它。 但是我沒有把它放在一邊,而是決定:讓我們對(duì)此有所了解。

然后,我有了兩個(gè)主要認(rèn)識(shí):

  • 不,很多人不使用這種語(yǔ)言。
  • 但也許應(yīng)該如此。

因此,這里簡(jiǎn)要介紹了我在快速編程教程N(yùn)im方面的經(jīng)驗(yàn),以及為什么該語(yǔ)言對(duì)我來(lái)說(shuō)非常有前途。

給我看代碼!

這是我在Nim中編寫的一個(gè)無(wú)用的程序:

 

Python的替代品?我嘗試了你從未聽說(shuō)過(guò)的最佳編程語(yǔ)言

 

看起來(lái)很干凈。 它也是如此簡(jiǎn)單,即使您以前可能從未聽說(shuō)過(guò)Nim,您也可以毫不費(fèi)力地弄清楚它的作用。 (提示:它打印數(shù)字:5我:5。)

因此,讓我們分解一下這里似乎熟悉的內(nèi)容:

變量聲明

JavaScript開發(fā)人員非常熟悉。 雖然某些語(yǔ)言使用var,有些語(yǔ)言使用let,但是JS和Nim都允許使用兩者之一進(jìn)行聲明。 請(qǐng)務(wù)必注意,兩種語(yǔ)言的含義并不相同。 但是稍后會(huì)更多。

塊語(yǔ)法

要在Nim中標(biāo)記一個(gè)新塊,我們使用冒號(hào),后跟縮進(jìn)線。 那就是Python。

關(guān)鍵詞

這兩個(gè)循環(huán)以及if語(yǔ)句看起來(lái)都像是從Python中拔出來(lái)的。 實(shí)際上,從第5行開始的所有內(nèi)容實(shí)際上都是有效的Python(假設(shè)我們定義了echo函數(shù))。

因此,是的,Python中的許多關(guān)鍵字和運(yùn)算符在Nim中也有效,例如not,is,and或or等。

到目前為止,Nim完全沒有什么特別的。 由于我們需要使用let或var,因此它看起來(lái)像是Python的較差版本(在語(yǔ)法上)。

但是,如果我告訴您的話,該怎么辦:Nim是一種靜態(tài)類型的語(yǔ)言,其運(yùn)行速度幾乎與C一樣快。

哦,現(xiàn)在我們?cè)谡f(shuō)話。

一場(chǎng)友好的比賽

在深入探討Nim語(yǔ)法(尤其是靜態(tài)類型的部分,我們?nèi)匀粵]有看到它)之前,讓我們嘗試備份有關(guān)其速度的聲明。 為此,我編寫了一個(gè)程序來(lái)天真地(即不進(jìn)行動(dòng)態(tài)編程)計(jì)算Nim,Python和C中的第n個(gè)斐波那契數(shù)。

為了公平起見,我根據(jù)針對(duì)此問題的建議Leetcode解決方案(方法1)對(duì)實(shí)現(xiàn)進(jìn)行了標(biāo)準(zhǔn)化,并確保在三種語(yǔ)言中盡可能地堅(jiān)持下去。

為了計(jì)時(shí)執(zhí)行時(shí)間,我在Bash shell中使用了時(shí)間輸出中的"真實(shí)"值。

以下是計(jì)算第40個(gè)斐波那契數(shù)的結(jié)果:

 

Python的替代品?我嘗試了你從未聽說(shuō)過(guò)的最佳編程語(yǔ)言

是的,那件事發(fā)生了。

現(xiàn)在,這是非常有限的,并且離科學(xué)實(shí)驗(yàn)還很遙遠(yuǎn),但這與其他進(jìn)行了更嚴(yán)格基準(zhǔn)測(cè)試的人的發(fā)現(xiàn)一致[1] [2] [3]。

不過(guò),我將在本文中運(yùn)行的所有代碼都可以在GitHub上找到,包括有關(guān)如何進(jìn)行此實(shí)驗(yàn)的說(shuō)明。

那么,為什么Nim比Python快得多?

好吧,我要說(shuō)有兩個(gè)主要原因。 大大簡(jiǎn)化,這些是:

  • Nim是在解釋Python時(shí)編譯的(不同意?請(qǐng)單擊鏈接)。 這意味著在運(yùn)行Python程序時(shí),除了僅運(yùn)行該程序外,還有更多的工作要做,因?yàn)樵趯?shí)際執(zhí)行之前需要對(duì)其進(jìn)行解釋。 這通常會(huì)使語(yǔ)言慢很多。
  • Nim是靜態(tài)鍵入的。 雖然我之前顯示的示例沒有單一的類型聲明或注釋,但稍后我們將看到它確實(shí)是靜態(tài)類型的語(yǔ)言。 對(duì)于動(dòng)態(tài)類型的Python,解釋器需要做更多的工作來(lái)找出并適當(dāng)?shù)靥幚眍愋?,這會(huì)減慢執(zhí)行速度。

運(yùn)行更快,編寫速度更慢

這是Python文檔關(guān)于解釋語(yǔ)言必須說(shuō)的話:

"盡管解釋型語(yǔ)言的程序運(yùn)行通常也較慢,但它們通常具有比編譯型語(yǔ)言更短的開發(fā)/調(diào)試周期。"

例如,這句話很好地總結(jié)了Python和C之間的折衷。 您可以使用Python進(jìn)行的任何操作,也可以使用C進(jìn)行的操作,程序的運(yùn)行速度將提高多個(gè)數(shù)量級(jí)。

但是,您將花費(fèi)更多的時(shí)間用C編寫和調(diào)試代碼,并且代碼更長(zhǎng)且可讀性更差。 這就是為什么C不再流行的原因,Python如此流行。 簡(jiǎn)而言之:Python是"簡(jiǎn)單的"(當(dāng)然,相對(duì)而言)。

因此,如果Python在頻譜的一端,而C在另一端,則Nim試圖處于中間位置:有點(diǎn)快又容易嗎? 這樣的事情。

但是,使Nim脫穎而出的原因是,乍一看,它似乎已使權(quán)衡最小化。 換句話說(shuō),它比Python快得多,但是編程起來(lái)卻不像C那樣困難(或者感覺像經(jīng)過(guò)簡(jiǎn)短檢查一樣)。

為了說(shuō)明這一點(diǎn),讓我們看一下斐波那契實(shí)驗(yàn)中的代碼。

這是C代碼:

 

  1. #include <stdio.h> 
  2.  
  3. int fibonacci(int n) { 
  4.     if (n <= 1) { 
  5.         return n; 
  6.     }  
  7.     return fibonacci(n-1) + fibonacci(n-2); 
  8.  
  9. int main(void) { 
  10.     printf("%i", fibonacci(40)); 
  11. }  

Python:

 

  1. def fibonacci(n): 
  2.     if n <= 1: 
  3.         return n 
  4.     return fibonacci(n-1) + fibonacci(n-2) 
  5.  
  6. print(fibonacci(40)) 

和Nim:

 

  1. proc fibonacci(n: int): int =  
  2.     if n <= 1: 
  3.         return n 
  4.     return fibonacci(n-1) + fibonacci(n-2) 
  5.  
  6. echo(fibonacci(40)) 

盡管Nim擁有奇怪的proc東西,親愛的上帝,還是使用=聲明函數(shù)(或過(guò)程,稱呼它們),但它仍然比C干凈得多。

因此,也許這是一個(gè)值得權(quán)衡的問題? 比Python難寫一點(diǎn),但是要快幾十倍-我可以接受。

Nim語(yǔ)法

以下是有關(guān)Nim語(yǔ)法的一些關(guān)鍵點(diǎn)的簡(jiǎn)要概述:

 

  1. import strformat 
  2.  
  3. # Example taken from the Nim Website: https://nim-lang.org/ 
  4.  
  5. type 
  6.   Person = object 
  7.     name: string 
  8.     age: Natural # Ensures the age is positive 
  9.  
  10. let people = [ 
  11.   Person(name"John", age: 45), 
  12.   Person(name"Kate", age: 30) 
  13.  
  14. for person in people: 
  15.   # Type-safe string interpolation, 
  16.   # evaluated at compile time
  17.   echo(fmt"{person.name} is {person.age} years old"

變量

變量使用var,let或const聲明。

var和const基本上就像JavaScript一樣工作,但是讓我們有一個(gè)不同的故事。

盡管JavaScript中的let與var在范圍上有所不同,但Nim中的let表示一個(gè)變量,其值在初始化后不能更改。 有人告訴我,這顯然類似于Swift。

但這不是常數(shù)嗎?

好吧,在Nim中,區(qū)別如下:

對(duì)于const,編譯器必須能夠在編譯時(shí)確定該值,而let可以在運(yùn)行時(shí)確定。

文檔提供了以下示例:

 

  1. const input = readLine(stdin) # Error: constant expression expected 
  2.  
  3. let input = readLine(stdin) # works 

 

此外,您還可以像這樣聲明變量:

  1. var 
  2.  
  3. a = 1 
  4.  
  5. b = 2 
  6.  
  7. c = 3 
  8.  
  9. x, y = 10 # Both x, y are assigned to 10 

函數(shù)

Nim中的函數(shù)稱為過(guò)程,它們的聲明是這樣完成的:

 

  1. proc procedureName(parameterName: parameterType):returnType = 
  2.  
  3. return returnVar 

鑒于該語(yǔ)言在很多方面看起來(lái)都像Python,因此當(dāng)您初次看到它們時(shí),過(guò)程肯定顯得有些怪異。

用=代替{或:尤其奇怪。 但是,在單線過(guò)程中看起來(lái)更好一些:

 

  1. proc hello(s: string) = echo s 

此外,您還可以從以下函數(shù)返回:

 

  1. proc toString(x: int): string = 
  2.  
  3. result = 
  4.  
  5. if x < 0: "negative" 
  6.  
  7. elif x > 0: "positive" 
  8.  
  9. else"zero" 

 

感覺您仍然應(yīng)該返回結(jié)果,但結(jié)果不是變量,而是一個(gè)關(guān)鍵字。 上面的代碼段是完全有效的Nim。

而且您還可以重載過(guò)程:

 

  1. proc toString(x: int): string =    
  2.     result =      
  3.         if x < 0: "negative"      
  4.         elif x > 0: "positive"      
  5.         else"zero"   
  6. proc toString(x: bool): string =    
  7.     result =      
  8.         if x: "yep"      
  9.         else"nope" 
  10. echo toString(true) # Calls the second version, prints "yep" 
  11. echo toString(5) # Calls the first version, prints "positive" 

控制流

很像Python。

 

  1. # if true
  2.  
  3. # while true
  4.  
  5. for num in nums: 

 

要遍歷某個(gè)范圍,可以使用countup(start,finish)或countdown(start,finish)代替一個(gè)范圍。 或者,您可以簡(jiǎn)化整個(gè)過(guò)程并使用:for i in start..finish。

打印并獲取用戶輸入

 

  1. let input = readLine(stdin) 
  2.  
  3. echo input 

 

與Python比較時(shí),readLine(stdin)等效于input(),echo等效于print。

echo可以帶或不帶括號(hào)。

我的目標(biāo)是給您帶來(lái)Nim的品味,而不是通讀其完整手冊(cè)。 因此,我想我將在此處停止使用簡(jiǎn)單的語(yǔ)法,然后略過(guò)一些其他功能。

附加功能

面向?qū)ο缶幊?/strong>

Nim不是面向?qū)ο蟮模菍?duì)對(duì)象的支持極簡(jiǎn)。 但是,它們不像Python類那么整潔。

Nim支持宏和元編程,實(shí)際上,它似乎非常強(qiáng)調(diào)它。 由三部分組成的教程系列的整個(gè)部分都專門針對(duì)它。

這是一個(gè)簡(jiǎn)單的示例:

 

  1. import macros 
  2.  
  3. macro myMacro(arg: static[int]): untyped = 
  4.  
  5. echo arg 
  6.  
  7.  
  8.  
  9. myMacro(1 + 2 * 3) 

 

基本類型

Nim中的基本類型為:字符串,字符,布爾,整數(shù),整數(shù)和浮點(diǎn)數(shù)。

這些也是有效的:

int8 int16 int32 int64 uint8 uint16 uint32 uint64 float32 float64

另外,與Python不同,字符串在Nim中是可變的。

注釋

您可能已經(jīng)在上面的Python語(yǔ)法中看到了我的注釋,但是與Python不同,多行注釋也使用了哈希符號(hào)(后接[或]):

 

  1. # a comment#[ 
  2. multi 
  3. line 
  4. comment 
  5. ]# 

JavaScript編譯

從Nim網(wǎng)站:

" Nim包括一流的JavaScript后端,因此您可以輕松地同時(shí)定位客戶端和服務(wù)器。"

盡管我不確定有多少人會(huì)實(shí)際使用它,但是這很酷。 但是,如果您要播放用Nim編寫的Browser Snake,則可以這樣做。 不過(guò)這次我沒有建造它。

迭代器

除了定義一個(gè)proc之外,還可以定義一個(gè)迭代器。 但是,Nim迭代器實(shí)際上更像Python生成器。 這是一個(gè)例子:

 

  1. iterator countup(a, b: int): int =  
  2.     var res = a  
  3.     while res <= b:  
  4.         yield res  
  5.         inc(res) 

不區(qū)分Case和下劃線

Nim不區(qū)分大小寫和下劃線(第一個(gè)字符除外)。

因此,HelloWorld和helloWorld是不同的,但是helloWorld,helloworld和hello_world都相同,因此有效:

 

  1. proc my_func(s: string) = 
  2.     echo s 
  3. myFunc("hello"

人氣度

 

Python的替代品?我嘗試了你從未聽說(shuō)過(guò)的最佳編程語(yǔ)言

也許您閱讀了標(biāo)題并對(duì)自己說(shuō):嗯,我聽說(shuō)過(guò)Nim或使用Nim!

那樣的話,嘿,我為你感到高興。 但是,我確實(shí)嘗試獲得了有關(guān)該語(yǔ)言受歡迎程度的一些信息,而且肯定不是那么高。

例如,在2020年堆棧溢出調(diào)查中甚至沒有提到Nim。 我在LinkedIn上找不到Nim開發(fā)人員的工作(位置設(shè)置為Worldwide),并且該語(yǔ)言的Stack Overflow標(biāo)簽只有349個(gè)問題。 (與Python的1,500,000或更新語(yǔ)言(例如Swift的270,000)進(jìn)行比較。)

因此,可以肯定地說(shuō),大多數(shù)開發(fā)人員都沒有使用過(guò)它,而且許多開發(fā)人員甚至從未聽說(shuō)過(guò)Nim這個(gè)名字。

真正的Python替代品?

我對(duì)你說(shuō)老實(shí)話,我覺得Nim很酷。

在撰寫本文時(shí),我已經(jīng)研究了最低限度,因此還沒有深入到最低限度,但是我可以看到自己將來(lái)會(huì)用到它。

但是,盡管基本語(yǔ)法與Python非常相似,但是它變得相當(dāng)復(fù)雜,而且速度很快,我相信這會(huì)吸引很多Python用戶/開發(fā)人員。

就我個(gè)人而言,我是Python的忠實(shí)擁護(hù)者,也是靜態(tài)類型語(yǔ)言的忠實(shí)擁護(hù)者,因此對(duì)我而言,在某些情況下,性能的提高將足以彌補(bǔ)所增加的冗長(zhǎng)性。

然后,通過(guò)撰寫本文,我意識(shí)到:Go呢?

我敢肯定,你們中的許多人在閱讀時(shí)都在考慮這一點(diǎn),這是有道理的。 盡管Nim的語(yǔ)法可能更接近于Python,但它確實(shí)在Go語(yǔ)言主導(dǎo)的高性能但比C ++語(yǔ)言更激烈的競(jìng)爭(zhēng)中。

有趣的事實(shí):我還偷偷地用Go進(jìn)行了速度測(cè)試。 特別是對(duì)于fibonacci(40),它的速度與C一樣快。

那么,Nim可以與Python競(jìng)爭(zhēng)嗎? 我對(duì)此表示高度懷疑。 正如我所指出的那樣,我們看到了計(jì)算機(jī)變得越來(lái)越快,編程變得越來(lái)越容易的趨勢(shì),以至于即使Nim提供了很好的權(quán)衡,我也認(rèn)為采用干凈而通用的Python還不夠。

編輯:我與Nim Core Devs的一位發(fā)言人交談,他告訴我他認(rèn)為Nim比從Python過(guò)渡的人更適合從C ++過(guò)渡的人。

但是,它可以與Go競(jìng)爭(zhēng)嗎? 也許(如果Google不落后于Go)。 語(yǔ)法友好,語(yǔ)言功能強(qiáng)大,并且比Go提供的功能(例如宏和重載)更好地支持C / C ++功能。

也許那是我接下來(lái)要寫的文章。

謝謝閱讀!

 

責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2012-02-01 10:18:23

編程

2022-05-09 08:40:14

Python技巧代碼

2020-11-16 12:09:25

Python開發(fā)工具

2020-09-13 09:03:44

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

2021-06-07 09:55:58

JavaScript開發(fā) 技巧

2025-04-17 08:10:41

2021-07-28 08:00:00

Linux操作系統(tǒng)工具

2018-10-11 10:41:12

Go 開發(fā)技術(shù)

2018-09-28 07:00:03

編程語(yǔ)言Go語(yǔ)言

2023-11-10 08:22:09

雪花算法生成算法分布式

2022-01-05 11:21:19

開源工具操作系統(tǒng)

2024-01-15 14:19:34

開源ChatGPT

2020-12-09 10:28:10

Github開源編程代碼

2016-01-27 10:26:53

JavaScript操作系統(tǒng)

2016-01-26 15:33:07

JavaScriptNodeOS操作系統(tǒng)

2011-04-12 09:13:51

OpenIndianaSolaris替代品

2022-08-02 10:45:29

AppFlowyNotion開源

2016-07-11 00:40:30

2022-03-21 11:50:58

醫(yī)療物聯(lián)網(wǎng)物聯(lián)網(wǎng)

2020-12-04 09:41:36

C編程語(yǔ)言替換C
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)