Nim是一個指令式通用多範式靜態類型編譯型編程語言,由Andreas Rumpf設計和開發,設計目標是高效、富有表現力以及優雅。Nim支持元編程函數式消息傳遞過程式以及面向對象編程。

Nim
The Nim crown logo
編程範型多範式: 編譯, 並發, 過程式, 指令式, 函數式, 面向對象
設計者Andreas Rumpf
面市時間2008年,​16年前​(2008
當前版本
  • 2.2.0(2024年10月2日;穩定版本)[1]
編輯維基數據鏈接
型態系統靜態[2], 強類型[3], 類型推論, 結構化
系統平台IA-32, x86-64
操作系統跨平台[4]
許可證MIT[5][6]
文件擴展名.nim
網站nim-lang.org
啟發語言
Ada, Modula-3, Lisp, C++, Object Pascal, Python, Oberon

語言設計

編輯

Nim的設計目標是像C一樣快速,像Python一樣有表達力,並像Lisp一樣有擴展性。具體地說,它受以下語言的影響:

另外,Nim支持統一函數調用語法英語Uniform Function Call Syntax[7],即並未區分函數、方法的調用語法。亦支持等價標識符,即不同的變數名稱可能被視為相同,其忽略非首字母的大小寫以及底線。[8]

編譯器

編輯

Nim編譯器可生成優化過的C代碼並將編譯推遲給外部的編譯器[9](包括 ClangGCC 在內的眾多編譯器都受支持)。編譯器還可生成 C++Objective-C 以及JavaScript的代碼來便捷地與其他語言的應用程序接口(API)交互。這使得Nim可用以編寫iOSAndroid的應用程序。

Nim編譯器自身是自舉英語Self-hosting (compilers)的,也就是使用Nim語言自身編寫的。[10]

Nim程序可使用眾多來自C語言C++函式庫語言綁定可用於許多函式庫,例如GTK+2、OpenGLWinAPIzliblibzip英語libzipOpenSSL 以及 cURL[11] Nim 可與 PostgreSQLMySQL 以及 SQLite 數據庫共同工作,可與 LuaPython 語言的解釋器交互。

例子

編輯

Hello world

編輯

Hello, World!用Nim寫為:

echo("Hello, world!")
# Procedures can be called with no parentheses
echo "Hello, World!"

另一輸出"Hello World"的版本:

stdout.write("Hello, world!\n")

階乘

編輯

使用指令式方式計算正數的階乘

import strutils

var n = 0
try:
  stdout.write "Input positive integer number: "
  n = stdin.readline.parseInt
except ValueError:
  raise newException(ValueError, "You must enter a positive number")

var fact = 1
for i in 2..n:
  fact = fact * i

echo fact

使用來自Nim標準庫的math模塊:

import math
echo fac(x)

反轉字符串

編輯

簡單的一個例子展示了Nim的很多特徵:

func reverse(s: string): string =
  for i in countdown(s.high, 0):
    result.add s[i]

let str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)

很獨特的特徵之一是隱式result變量。在Nim中具有非空返回類型的所有過程都有一個隱式的結果變量表示被返回的值。在for循環中調用了countdown,它是迭代器。如果省略了迭代器,編譯器將嘗試使用items迭代器,如果為指定類型定義了一個的話。

圖形用戶界面

編輯

通過gintro[12]模塊使用具有gobject內省的GTK3:

import gintro/[gtk, glib, gobject, gio]

proc appActivate(app: Application) =
  let window = newApplicationWindow(app)
  window.title = "GTK3 application with gobject introspection"
  window.defaultSize = (400, 400)
  showAll(window)

proc main =
  let app = newApplication("org.gtk.example")
  connect(app, "activate", appActivate)
  discard run(app)

main()

這個代碼要求gintro模塊,它不是標準庫的一部份。要安裝模塊gintro和很多其他模塊可以使用工具nimble,它是nim的一部份。要用nimble安裝gintro模塊可以如下這樣:

nimble install gintro

參考文獻

編輯
  1. ^ 1.0 1.1 https://github.com/nim-lang/Nim/releases/tag/v2.2.0.
  2. ^ Nim by example. GitHub. [2014-07-20]. (原始內容存檔於2014-12-29). 
  3. ^ Караджов, Захари; Станимиров, Борислав. Метапрограмиране с Nimrod. VarnaConf. 2014 [2014-07-27]. (原始內容存檔於2015-02-17) (保加利亞語). 
  4. ^ Install Nim. [2018-10-12]. (原始內容存檔於2018-10-10). 
  5. ^ FAQ. Nim-lang.org. [2015-03-27]. (原始內容存檔於2017-07-11). 
  6. ^ copying.txt. GitHub. [2015-03-27]. (原始內容存檔於2018-09-26). 
  7. ^ Nim Manual:Method call syntax. [2017-10-01]. (原始內容存檔於2017-09-24). 
  8. ^ Nim Manual:Identifier equality. [2017-10-01]. (原始內容存檔於2017-09-24). 
  9. ^ Rumpf, Andreas. Nimrod: A New Approach to Metaprogramming. InfoQ. 2014-01-15. 事件發生在 2:23 [2014-07-20]. (原始內容存檔於2014-10-10). 
  10. ^ 存档副本. [2017-05-05]. (原始內容存檔於2015-04-24). 
  11. ^ Nim Standard Library. Nim documentation. [2015-04-04]. (原始內容存檔於2015-04-06). 
  12. ^ gintro頁面存檔備份,存於網際網路檔案館

外部連結

編輯