特点

直观、干净的语法

Nim从多种语言中汲取了灵感,所以语法很容易被理解, 你可以轻易写出可读性和可维护性很高的代码。

  • 缩进优先的语法
  • 以Python为灵感的多重结构
  • 多行的lambda表达式
  • 源于Oberon的可视化标记
  • 用于精简声明的类型节则来自Pascal
      import strformat
      type
        Person = object
          name*: string # 字段通过`*`导出。
          age: Natural # 自然数类型确保年龄是正确的。

      var people = [
        Person(name: "John", age: 45),
        Person(name: "Kate", age: 30)
      ]

      for person in people:
        # 类型安全的字符串中变量赋值
        echo(fmt"{person.name} is {person.age} years old")

多操作系统支持

Nim支持所有主流的操作系统,以及多个小众系统。
我们为完美支持这三个主流操作系统而感到自豪。

更多的垃圾收集器选项

你可以选择快速、增量、不间断的延时垃圾收集器;
或者是一个确定性的软实时垃圾收集器,支持您指定其最大暂停时间;
还有很多其他方式供你选择。

最先进优化的原生性能

通过编译为C,Nim可以使用由现代C编译器提供的很多新特性。 这个编译模型获得了已经由不同的个人和有影响力的大公司实施了40多年的高可移植性和优化。

Nim产出小巧、零依赖的二进制文件, 不仅能让你分发更加简便, 还能让你的客户更加满意。

编译为JavaScript

Nim包含了一个一流的JavaScript后端, 这样您就可以毫不费力地同时开发客户端和服务器。

New Game: N Play/Pause: P Controls: ← → ↑ ↓

上面的游戏就是用Nim写成的, 使用JavaScript后端编译, 使用canvas API进行绘制。

源码: https://github.com/dom96/snake

体验网站: http://picheta.me/snake

      import dom

      proc onLoad(event: Event) =
        let p = document.createElement("p")
        p.innerHTML = "Click me!"
        p.style.fontFamily = "Helvetica"
        p.style.color = "red"

        p.addEventListener("click",
          proc (event: Event) =
            window.alert("Hello World!")
        )

        document.body.appendChild(p)

      window.onload = onLoad

核心更小,可扩展性更高

通过提供强大的元编程功能,Nim语言实现了更小的核心。

Nim中的元编程功能包括了对泛型、模板和宏的支持。 这使得Nim可以扩展和支持各种编程范例,并避免了开发人员使用样板。 通过使用这些元编程功能,标准库实现异步等待。 Nim社区还开发了各种实现不同编程范式的包。

        import macros, strutils

        macro toEnum(words: static[string]): untyped =
          result = newTree(nnkEnumTy, newEmptyNode())

          for w in splitWhitespace(words):
            result.add ident(w)

        type
          Color = toEnum"Red Green Blue Indigo"

        var color = Indigo

提供对零散的包进行管理

Nim的包管理器叫做Nimble。 通过Git和Mercurial存储库来分发软件包, 通过远程查询标签来确定版本信息。

包名和仓库URL在packages.json中声明,并存储于GitHub中。

软件包使用特殊的.nimble文件格式进行定义,.nimble格式会被Nim编译器评估。 这意味着它支持Nim编程语言的大部分子集, 支持各种强大的功能,包括能够指定操作系统和外部依赖项。

      # 包

      version = "v0.1.0"
      author = "Benedict Cumberbatch"
      description = "Sample package."
      license = "MIT"

      # 依赖
      requires "nim >= 0.13.0", "jester >= 0.1.0"

      import distros
      if detectOs(Ubuntu):
        foreignDep "libssl-dev"
      else:
        foreignDep "openssl"

      task test, "Run the tester!":
        withDir "tests":
          exec "nim c -r tester"

简便地对C、C++Objective C进行交互

        {.passL: "-lsfml-graphics -lsfml-system -lsfml-window".}

        type
          VideoMode* {.importcpp: "sf::VideoMode".} = object
          RenderWindowObj {.importcpp: "sf::RenderWindow".} = object
          RenderWindow* = ptr RenderWindowObj
          Color* {.importcpp: "sf::Color".} = object
          Event* {.importcpp: "sf::Event".} = object

        {.push cdecl, header: "<SFML/Graphics.hpp>".} 
        {.push importcpp.} 
        proc videoMode*(modeWidth, modeHeight: cuint,
                        modeBitsPerPixel: cuint=32): VideoMode
        proc newRenderWindow*(mode: VideoMode, title: cstring): RenderWindow
        proc pollEvent*(window: RenderWindow, event: var Event): bool
        proc newColor*(red, green, blue, alpha: uint8):Color 
        proc clear*(window: RenderWindow, color: Color) 
        proc display*(window: RenderWindow) 
        

Nim可以轻松绑定到C、C++和Objective C库。 开发者可以轻松访问由成熟且功能强大的库组成的大型生态系统。

实用的报错信息

灵感来源于Python。

当Nim应用程序因异常而崩溃时 它会在终止之前输出堆栈跟踪。 Nim的堆栈跟踪格式非常易于掌握, 因为它包含了调试异常所需的所有信息。

      Traceback (most recent call last)
      module.nim(10) module
      module.nim(8) readData
      strutils.nim parseInt
      Error: unhandled exception:
             invalid integer: Hello World [ValueError]

更多问题,请参阅 常见问题