Nim
編程範型 | 多範式: 編譯, 並行, 程序式, 指令式, 函數式, 物件導向 |
---|---|
設計者 | Andreas Rumpf |
釋出時間 | 2008年 |
目前版本 |
|
型態系統 | 靜態[2], 強型別[3], 類型推論, 結構化 |
系統平台 | IA-32, x86-64 |
作業系統 | 跨平台[4] |
許可證 | MIT[5][6] |
副檔名 | .nim |
網站 | nim-lang |
啟發語言 | |
Ada, Modula-3, Lisp, C++, Object Pascal, Python, Oberon |
Nim是一個指令式、通用、多範式、靜態型別、編譯型的程式語言,由Andreas Rumpf設計和開發,設計目標是高效、富有表現力以及優雅。Nim支援元程式設計、函數式、訊息傳遞、程序式以及物件導向編程。
語言設計
Nim的設計目標是像C一樣快速,像Python一樣有表達力,並像Lisp一樣有擴充性。具體地說,它受以下語言的影響:
- Modula-3:有跟蹤的和無跟蹤的指標
- Delphi:類型安全的字元集
- Ada:子範圍類型、distinct類型、安全變體/case對象
- C++:運算子多載、泛型
- Python:越位規則
- Lisp:巨集系統、包羅AST、同像性
- Oberon:成員匯出標記
- C#:async/await、lambda巨集
- Go:延遲執行
另外,Nim支援統一函數呼叫語法[7],即並未區分函數、方法的調用語法。亦支援等價標識符,即不同的變數名稱可能被視為相同,其忽略非首字母的大小寫以及底線。[8]
編譯器
Nim編譯器可生成最佳化過的C程式碼並將編譯推遲給外部的編譯器[9](包括 Clang 及 GCC 在內的眾多編譯器都受支援)。編譯器還可生成 C++、Objective-C 以及JavaScript的程式碼來便捷地與其他語言的應用程式介面(API)互動。這使得Nim可用以編寫iOS和Android的應用程式。
Nim編譯器自身是自舉的,也就是使用Nim語言自身編寫的。[10]
庫
Nim程式可使用眾多來自C語言和C++的函式庫。語言繫結可用於許多函式庫,例如GTK+2、OpenGL、WinAPI、zlib、libzip、OpenSSL 以及 cURL。[11] Nim 可與 PostgreSQL、MySQL 以及 SQLite 資料庫共同工作,可與 Lua 和 Python 語言的直譯器互動。
例子
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.0 1.1 https://github.com/nim-lang/Nim/releases/tag/v2.2.0.
- ^ Nim by example. GitHub. [2014-07-20]. (原始內容存檔於2014-12-29).
- ^ Караджов, Захари; Станимиров, Борислав. Метапрограмиране с Nimrod. VarnaConf. 2014 [2014-07-27]. (原始內容存檔於2015-02-17) (保加利亞語).
- ^ Install Nim. [2018-10-12]. (原始內容存檔於2018-10-10).
- ^ FAQ. Nim-lang.org. [2015-03-27]. (原始內容存檔於2017-07-11).
- ^ copying.txt. GitHub. [2015-03-27]. (原始內容存檔於2018-09-26).
- ^ Nim Manual:Method call syntax. [2017-10-01]. (原始內容存檔於2017-09-24).
- ^ Nim Manual:Identifier equality. [2017-10-01]. (原始內容存檔於2017-09-24).
- ^ Rumpf, Andreas. Nimrod: A New Approach to Metaprogramming. InfoQ. 2014-01-15. 事件發生在 2:23 [2014-07-20]. (原始內容存檔於2014-10-10).
- ^ 存档副本. [2017-05-05]. (原始內容存檔於2015-04-24).
- ^ Nim Standard Library. Nim documentation. [2015-04-04]. (原始內容存檔於2015-04-06).
- ^ gintro (頁面存檔備份,存於互聯網檔案館)