Nim

维基百科,自由的百科全书
跳转到导航 跳转到搜索
Nim
File:Nim-logo.png
The Nim crown logo
编程范型多范式: 编译, 并发, 过程式, 指令式, 函数式, 面向对象
設計者Andreas Rumpf
发行时间2008年,​18年前​(2008
当前版本
    Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    型態系統静态[1], 强类型[2], 类型推论, 结构化
    系统平台IA-32, x86-64
    操作系统跨平台[3]
    許可證MIT[4][5]
    文件扩展名.nim
    網站nim-lang.org
    受影响于
    Ada, Modula-3, Lisp, C++, Object Pascal, Python, Oberon

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

    语言设计[编辑]

    Nim的设计目标是像C一样快速,像Python一样有表达力,并像Lisp一样有扩展性。具体地说,它受以下语言的影响:

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

    编译器[编辑]

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

    Nim编译器自身是自举英语Self-hosting (compilers)的,也就是使用Nim语言自身编写的。[9]

    [编辑]

    Nim程序可使用众多来自C语言C++函式庫语言绑定可用于许多函式庫,例如GTK+2、OpenGLWinAPIzliblibzip英语libzipOpenSSL 以及 cURL[10] 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[11]模块使用具有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. ^ Nim by example. GitHub. [2014-07-20]. (原始内容存档于2014-12-29). 
    2. ^ Караджов, Захари; Станимиров, Борислав. Метапрограмиране с Nimrod. VarnaConf. 2014 [2014-07-27]. (原始内容存档于2015-02-17) (български). 
    3. ^ Install Nim. [2018-10-12]. (原始内容存档于2018-10-10). 
    4. ^ FAQ. Nim-lang.org. [2015-03-27]. (原始内容存档于2017-07-11). 
    5. ^ copying.txt. GitHub. [2015-03-27]. (原始内容存档于2018-09-26). 
    6. ^ Nim Manual:Method call syntax. [2017-10-01]. (原始内容存档于2017-09-24). 
    7. ^ Nim Manual:Identifier equality. [2017-10-01]. (原始内容存档于2017-09-24). 
    8. ^ Rumpf, Andreas. Nimrod: A New Approach to Metaprogramming. InfoQ. 2014-01-15. 事件发生在 2:23 [2014-07-20]. (原始内容存档于2014-10-10). 
    9. ^ 存档副本. [2017-05-05]. (原始内容存档于2015-04-24). 
    10. ^ Nim Standard Library. Nim documentation. [2015-04-04]. (原始内容存档于2015-04-06). 
    11. ^ gintro页面存档备份,存于互联网档案馆

    外部链接[编辑]