Nim

Nim是一个命令式多范式支持、静态类型编译型程序设计语言,由Andreas Rumpf设计和开发,设计目标是高效、富有表现力以及优雅。Nim支持元编程函数式消息传递面向过程以及面向对象编程。

Nim
The Nim crown logo
多范式: 编译, 并发, 过程式, 指令式, 函数式, 面向对象
設計者Andreas Rumpf
2008年2008
穩定版本
1.2.6[1]
(2020年7月30日2020-07-30
型態系統静态[2], 强类型[3], 类型推论, 结构化
系统平台IA-32, x86-64
作業系統跨平台[4]
許可證MIT[5][6]
文件扩展名.nim
網站nim-lang.org
啟發語言
Ada, Modula-3, Lisp, C++, Object Pascal, Python, Oberon

语言设计

Nim的语法与Python相似。具体地说,它受以下语言的影响:

  • Modula-3:受跟踪的和不受跟踪的指针
  • Delphi:类型安全的字符集
  • Ada:subrange types、distinct type、safe variants / case objects
  • C++:Excessive overloading、泛型
  • Python:越位规则
  • Lisp:宏系统、embrace the AST、homoiconicity
  • Oberon:成员导出标记
  • C#:Async / await、lambda 宏
  • Go:Defer

另外,Nim支持统一调用语法[7] 以及等价标识符。[8]

编译器

Nim编译器可生成优化过的C代码并将编译推迟给外部的编译器[9](包括 ClangGCC 在内的众多编译器都受支持)。编译器还可生成 C++Objective-C 以及JavaScript的代码来便捷地与其他语言的应用程序接口(API)交互。这使得Nim可用以编写iOSAndroid的应用程序。

Nim编译器自身是自举的,也就是使用Nim语言自身编写的。[10]

Nim程序可使用众多来自C语言C++类库语言绑定可用于许多类库,例如GTK+2、OpenGLWinAPIzliblibzipOpenSSL 以及 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模块使用具有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. . [2020-07-31]. (原始内容存档于2020-05-19).
  2. . GitHub. [2014-07-20]. (原始内容存档于2014-12-29).
  3. Караджов, Захари; Станимиров, Борислав. . VarnaConf. 2014 [2014-07-27]. (原始内容存档于2015-02-17) (保加利亚语).
  4. . [2018-10-12]. (原始内容存档于2018-10-10).
  5. . Nim-lang.org. [2015-03-27]. (原始内容存档于2017-07-11).
  6. . GitHub. [2015-03-27]. (原始内容存档于2018-09-26).
  7. . [2017-10-01]. (原始内容存档于2017-09-24).
  8. . [2017-10-01]. (原始内容存档于2017-09-24).
  9. Rumpf, Andreas. . InfoQ. 2014-01-15. 事件发生在 2:23 [2014-07-20]. (原始内容存档于2014-10-10).
  10. . [2017-05-05]. (原始内容存档于2015-04-24).
  11. . Nim documentation. [2015-04-04]. (原始内容存档于2015-04-06).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.