Nim语言入门:高效、优雅的系统编程新选择

Nim语言入门:高效、优雅的系统编程新选择

【免费下载链接】Nim Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority). 【免费下载链接】Nim 项目地址: https://gitcode.com/gh_mirrors/ni/Nim

Nim是一门静态类型、编译型的系统编程语言,其设计哲学围绕效率(Efficiency)、表达力(Expressiveness)和优雅性(Elegance)三个核心原则展开。本文全面介绍了Nim语言的概述与设计理念、与其他系统编程语言的对比、开发环境搭建方法以及基础语法与核心特性,帮助读者深入了解这门高效而优雅的编程语言。

Nim语言概述与设计理念

Nim是一门静态类型、编译型的系统编程语言,其设计哲学围绕三个核心原则展开:效率(Efficiency)、表达力(Expressiveness)和优雅性(Elegance)。这三个原则按照优先级顺序排列,体现了Nim语言在设计决策上的价值取向。

设计哲学的三重奏

Nim的设计理念可以用以下流程图来展示其核心设计原则的层次关系:

mermaid

效率优先的设计取向

效率是Nim设计的首要考虑因素。语言通过多种机制确保生成的代码具有接近C/C++的性能表现:

编译策略优势

  • 编译到C、C++或JavaScript,利用成熟的编译器后端优化
  • 生成不依赖虚拟机的原生可执行文件
  • 支持所有主流平台(Windows、Linux、BSD、macOS)

内存管理创新

# 确定性的内存管理示例
type
  Resource = object
    data: string

proc `=destroy`(r: var Resource) =
  echo "释放资源: ", r.data
  r.data = ""

proc createResource(): Resource =
  result = Resource(data: "重要数据")
  echo "创建资源"

# 使用作用域结束时的自动清理
block:
  let res = createResource()
  echo "使用资源: ", res.data
# 此处自动调用=destroy

表达力的多维度实现

Nim从多种成熟语言中汲取灵感,形成了独特的表达能力:

语言特性融合表

特性来源具体特性Nim实现方式
Python缩进语法、简洁性基于缩进的代码块结构
Ada/Modula强类型系统、模块化严格的类型检查和模块系统
Lisp元编程能力强大的宏系统
C++性能控制低级内存操作和零开销抽象

元编程能力示例

import macros

macro debugPrint(args: varargs[untyped]): untyped =
  # 在编译时生成调试输出代码
  result = newStmtList()
  for arg in args:
    result.add quote do:
      echo `arg`.astToStr & " = " & $`arg`

# 使用宏
let x = 42
let name = "Nim"
debugPrint(x, name)
# 编译时展开为:echo "x = " & $x; echo "name = " & $name

优雅性的语法设计

Nim的语法设计追求简洁性和可读性,减少了样板代码的需求:

语法简洁性对比

语言特性传统语言实现Nim优雅实现
变量声明int x = 5;let x = 5
函数定义多行复杂语法简洁的proc语法
类型推断需要显式类型声明局部类型推断
字符串插值繁琐的拼接操作内插表达式

现代类型系统特性

# 代数数据类型
type
  ShapeKind = enum
    Circle, Rectangle, Triangle
  
  Shape = object
    case kind: ShapeKind
    of Circle:
      radius: float
    of Rectangle:
      width, height: float
    of Triangle:
      base, height: float

# 使用模式匹配处理不同形状
proc area(shape: Shape): float =
  case shape.kind
  of Circle: PI * shape.radius * shape.radius
  of Rectangle: shape.width * shape.height
  of Triangle: 0.5 * shape.base * shape.height

多范式编程支持

Nim支持多种编程范式,让开发者可以根据问题域选择最合适的编程风格:

范式支持矩阵

编程范式支持程度关键特性
过程式完全支持proc、模块系统
面向对象完全支持对象、方法、继承
函数式高度支持一等函数、不可变性
元编程业界领先编译时函数执行、宏
并发编程现代支持async/await、线程
# 函数式编程示例
import sequtils, sugar

let numbers = @[1, 2, 3, 4, 5]

# 使用高阶函数处理数据
let squared = numbers.map(x => x * x)
let evenNumbers = numbers.filter(x => x mod 2 == 0)
let sum = numbers.foldl(a + b)

echo squared    # @[1, 4, 9, 16, 25]
echo evenNumbers # @[2, 4]
echo sum        # 15

编译时与运行时的平衡

Nim独特地平衡了编译时能力和运行时性能,通过编译时函数执行(CTFE)将很多计算转移到编译阶段:

# 编译时计算示例
const 
  MaxSize = 100
  # 在编译时计算斐波那契数列
  Fibonacci10 = fib(10)

proc fib(n: int): int =
  if n <= 1: n
  else: fib(n-1) + fib(n-2)

# 编译时生成的查找表
const 
  SquareTable = block:
    var table: array[1..10, int]
    for i in 1..10:
      table[i] = i * i
    table

echo Fibonacci10   # 55 (编译时计算)
echo SquareTable[5] # 25 (编译时生成)

跨平台与互操作性

Nim的设计充分考虑到了现代软件开发的需求,特别是在跨平台和与现有代码库互操作方面:

后端支持对比

编译目标支持特性应用场景
C成熟稳定、优化充分系统编程、高性能应用
C++OOP特性、现代C++特性游戏开发、大型系统
JavaScript前端开发、Node.jsWeb应用、全栈开发
Objective-CmacOS/iOS开发苹果平台应用
# C互操作示例
{.passL: "-lm".}  # 链接数学库

proc sqrt(x: cdouble): cdouble {.importc, header: "<math.h>".}
proc printf(format: cstring) {.importc, varargs, header: "<stdio.h>".}

let result = sqrt(25.0)
printf("平方根: %f\n", result)

Nim语言的设计理念体现了对传统语言智慧的尊重与现代编程需求的完美结合,通过精心平衡效率、表达力和优雅性,为开发者提供了一个既强大又愉悦的编程工具。其独特的设计选择使得Nim在系统编程、脚本编写、Web开发和嵌入式系统等多个领域都能表现出色。

Nim与其他系统编程语言对比

在系统编程语言的竞技场上,Nim以其独特的定位和设计理念脱颖而出。与传统的C/C++、现代的Rust、以及简洁的Go等语言相比,Nim在性能、开发效率和语言特性之间找到了一个精妙的平衡点。让我们通过详细的对比分析,深入了解Nim在系统编程领域的独特优势。

性能对比:Nim vs C/C++

Nim在设计之初就将性能作为首要目标,其编译模型使其能够达到与C/C++相媲美的性能水平。Nim编译器将代码转换为优化的C、C++或JavaScript代码,然后使用本地编译器进行最终编译。

性能特征对比表:

特性NimC++RustGo
编译目标C/C++/JS原生LLVM IR原生
运行时性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
编译速度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
内存占用中等
二进制大小中等

mermaid

Nim的性能优势体现在多个层面:

  • 零成本抽象:像C++一样,Nim的高级特性在编译时被优化掉
  • 内存控制:提供手动内存管理选项,同时支持多种GC策略
  • 内联优化:过程和方法可以内联,减少函数调用开销

语法和开发体验对比

Nim的语法设计借鉴了Python的简洁性和Pascal的严谨性,提供了出色的开发体验。

语法简洁性对比示例:

# Nim - 简洁而表达力强
type
  Person = object
    name: string
    age: int

proc greet(p: Person) =
  echo "Hello, ", p.name, "! You are ", p.age, " years old."

let person = Person(name: "Alice", age: 30)
person.greet()
// C++ - 相对冗长
#include <iostream>
#include <string>

struct Person {
    std::string name;
    int age;
};

void greet(const Person& p) {
    std::cout << "Hello, " << p.name << "! You are " << p.age << " years old." << std::endl;
}

int main() {
    Person person{"Alice", 30};
    greet(person);
    return 0;
}
// Rust - 安全性优先但语法复杂
struct Person {
    name: String,
    age: u32,
}

impl Person {
    fn greet(&self) {
        println!("Hello, {}! You are {} years old.", self.name, self.age);
    }
}

fn main() {
    let person = Person {
        name: String::from("Alice"),
        age: 30,
    };
    person.greet();
}

内存安全与并发模型

在内存安全方面,Nim采取了与Rust不同的策略。Rust通过所有权系统和借用检查器在编译时保证内存安全,而Nim提供了多种内存管理选项:

内存管理策略对比:

策略NimRustGo
编译时检查可选强制
垃圾收集多种GC可选强制GC
手动管理支持支持(unsafe)不支持
内存安全运行时可选编译时保证运行时保证

Nim的并发模型基于消息传递和异步I/O,与Go的goroutine和Rust的async/await各有优势:

# Nim的异步编程示例
import asyncdispatch

proc asyncTask(): Future[string] {.async.} =
  await sleepAsync(1000)
  return "Task completed"

proc main() {.async.} =
  let result = await asyncTask()
  echo result

waitFor main()

元编程和编译时特性

Nim在元编程方面具有显著优势,其模板和宏系统提供了强大的编译时代码生成能力:

# Nim的模板和宏示例
template measureTime(body: untyped) =
  let start = cpuTime()
  body
  let duration = cpuTime() - start
  echo "Execution time: ", duration, " seconds"

measureTime:
  # 需要计时的代码
  for i in 0..1000000:
    discard i * i

# 编译时计算示例
const
  MaxSize = 1024
  BufferSize = MaxSize * sizeof(int)

var buffer: array[BufferSize, byte]

元编程能力对比:

特性NimC++RustGo
模板强大强大有限
宏系统非常强大有限过程宏
编译时执行完整Nimconstexprconst fn
代码生成优秀模板元编程过程宏生成工具

生态系统和工具链

Nim的生态系统虽然相对年轻,但提供了完整的开发工具链:

mermaid

跨平台能力

Nim在跨平台开发方面表现出色,支持多种后端和目标平台:

跨平台支持对比表:

平台NimC++RustGo
Windows
Linux
macOS
Android
iOS
WebAssembly
嵌入式

Nim的交叉编译支持非常完善,可以轻松地为不同目标平台生成代码:

# 交叉编译示例
nim c --cpu:arm --os:linux --passC:-march=armv7-a program.nim
nim c --cpu:wasm32 --os:any --passC:-nostdlib webapp.nim

适用场景分析

基于以上对比,Nim在以下场景中具有明显优势:

  1. 高性能计算:需要C++级别性能但希望更简洁语法的场景
  2. 系统工具开发:命令行工具、系统监控工具等
  3. 游戏开发:特别是需要高性能和跨平台支持的场景
  4. Web后端:需要高性能HTTP服务和异步处理
  5. 嵌入式开发:资源受限环境下的系统编程
  6. 教学和研究:语法简洁但功能强大的教学语言

Nim的设计哲学是在不牺牲性能的前提下提供最佳的开发体验,这使得它在系统编程语言中占据了一个独特的位置。虽然在某些领域(如内存安全保证)可能不如Rust严格,在生态系统成熟度方面可能不如Go,但Nim在性能、开发效率和语言优雅性之间找到了一个出色的平衡点。

对于寻求高性能、简洁语法和强大元编程能力的开发者来说,Nim提供了一个极具吸引力的选择。其多后端支持和丰富的特性集使其能够适应从底层系统编程到高级应用开发的广泛场景。

Nim开发环境搭建与第一个程序

Nim语言以其简洁的语法和强大的性能吸引了众多开发者。要开始Nim编程之旅,首先需要搭建合适的开发环境。本节将详细介绍如何在主流操作系统上安装Nim编译器,配置开发环境,并编写运行第一个Nim程序。

环境要求与准备

在安装Nim之前,确保系统满足以下基本要求:

操作系统架构支持依赖工具
Windows (XP+)x86, x86_64C编译器 (GCC/Clang/MSVC)
Linux (主流发行版)x86, x86_64, ppc64, armv6lGCC/Clang, curl/wget
macOS (10.04+)x86, x86_64, ppc64, ARM64Xcode Command Line Tools

Nim编译器需要C编译器作为后端,因为Nim代码最终会被编译为C代码。对于Windows用户,推荐使用MinGW或Visual Studio;Linux和macOS用户通常已经安装了GCC或Clang。

安装Nim编译器

方法一:使用choosenim(推荐)

choosenim是Nim官方的版本管理工具,可以轻松安装和管理多个Nim版本。

Unix/Linux/macOS安装:

# 使用curl安装
curl https://nim-lang.org/choosenim/init.sh -sSf | sh

# 或使用wget安装
wget -qO - https://nim-lang.org/choosenim/init.sh | sh

Windows安装:

  1. choosenim releases页面下载最新的Windows版本
  2. 解压zip文件并运行runme.bat脚本
  3. 按照屏幕提示完成安装

安装完成后,choosenim会自动配置环境变量。验证安装:

nim --version
方法二:手动安装

从Nim官网下载预编译的二进制包:

  1. 访问Nim下载页面
  2. 选择适合操作系统的版本下载
  3. 解压到合适目录
  4. 将bin目录添加到系统PATH环境变量中
方法三:包管理器安装

Ubuntu/Debian:

sudo apt-get install nim

macOS (Homebrew):

brew install nim

Arch Linux:

sudo pacman -S nim

开发工具配置

代码编辑器推荐

Nim拥有良好的编辑器支持,以下是一些推荐选择:

编辑器插件/扩展特点
Visual Studio CodeNim扩展包智能提示、调试支持
Sublime TextNimLime语法高亮、代码补全
Vim/Neovimnim.vim轻量级、高效
Emacsnim-mode高度可定制
VS Code配置示例

安装Nim扩展:

  1. 打开VS Code扩展市场
  2. 搜索"Nim"
  3. 安装官方Nim扩展包

配置settings.json:

{
    "nim.buildCommand": "c",
    "nim.buildOnSave": false,
    "nim.lintOnSave": true,
    "nim.projectMapping": [
        {
            "projectFile": "src/main.nim",
            "compilationTarget": "bin/main"
        }
    ]
}

第一个Nim程序

现在让我们创建第一个Nim程序——经典的"Hello, World!"。

创建项目目录结构

mermaid

创建项目文件结构:

mkdir myfirstnim
cd myfirstnim
mkdir src bin
编写Hello World程序

创建src/main.nim文件:

# 这是第一个Nim程序
echo "Hello, World!"
echo "欢迎来到Nim编程世界!"

# 获取用户输入
stdout.write "请输入你的名字: "
let name = readLine(stdin)
echo "你好, ", name, "!"
编译和运行

方法一:直接编译运行

# 编译并立即运行
nim c -r src/main.nim

# 简写形式
nim c -r src/main.nim

方法二:分步编译

# 编译为可执行文件
nim c -o:bin/main src/main.nim

# 运行编译后的程序
./bin/main

方法三:发布版本编译

# 编译优化版本(去除调试信息,启用优化)
nim c -d:release -o:bin/main_release src/main.nim

# 极致性能版本(禁用所有安全检查)
nim c -d:danger -o:bin/main_danger src/main.nim

编译选项详解

Nim编译器提供了丰富的编译选项:

选项说明示例
c编译为可执行文件nim c file.nim
-r编译后立即运行nim c -r file.nim
-o:path指定输出路径nim c -o:bin/app file.nim
-d:release发布模式编译nim c -d:release file.nim
-d:danger极致性能模式nim c -d:danger file.nim
--threads:on启用线程支持nim c --threads:on file.nim

项目配置管理

nim.cfg配置文件

创建项目级的nim.cfg文件来管理编译设置:

# 编译器选项
-d:release
--opt:speed
--threads:on

# 路径配置
--path:src
--out:bin/main

# 警告设置
--hint[Performance]:off
--warning[Deprecated]:on
使用Nimble包管理器

Nimble是Nim的官方包管理器,可以管理项目依赖:

# 初始化新项目
nimble init

# 安装依赖包
nimble install package_name

# 运行项目
nimble run

跨平台编译

Nim支持交叉编译,可以在一个平台上编译其他平台的可执行文件:

# 编译Windows版本(需要在Linux/macOS上)
nim c --cpu:amd64 --os:windows -o:bin/main.exe src/main.nim

# 编译Linux版本(需要在Windows上使用WSL)
nim c --cpu:amd64 --os:linux -o:bin/main_linux src/main.nim

调试和测试

调试支持
# 启用调试信息
nim c --debuginfo --linedir:on src/main.nim

# 使用GDB调试
gdb ./bin/main
单元测试

Nim内置测试框架支持:

# 在main.nim中添加测试代码
when isMainModule:
  # 这里是主程序入口
  echo "程序启动"
else:
  # 这里可以编写测试代码
  assert 1 + 1 == 2
  echo "测试通过"

常见问题解决

环境变量配置

如果遇到"nim命令未找到"错误,需要配置PATH环境变量:

Windows:

set PATH=%PATH%;C:\nim\bin

Unix/Linux:

echo 'export PATH=$PATH:~/.nimble/bin' >> ~/.bashrc
source ~/.bashrc
C编译器问题

如果编译时出现C编译器错误:

Windows: 安装MinGW或Visual Studio Build Tools Linux: 安装build-essential包

sudo apt-get install build-essential

macOS: 安装Xcode Command Line Tools

xcode-select --install

进阶示例:计算器程序

让我们创建一个更复杂的示例程序:

# 简单计算器程序
import strutils

proc calculate(a: float, b: float, op: string): float =
  case op
  of "+": result = a + b
  of "-": result = a - b
  of "*": result = a * b
  of "/": 
    if b != 0:
      result = a / b
    else:
      echo "错误:除数不能为零"
      result = 0
  else:
    echo "错误:不支持的操作符 ", op
    result = 0

# 主程序
echo "简单计算器"
echo "=========="

while true:
  try:
    stdout.write "请输入第一个数字 (或输入'quit'退出): "
    let input1 = readLine(stdin)
    
    if input1.toLowerAscii == "quit":
      break
      
    stdout.write "请输入操作符 (+, -, *, /): "
    let op = readLine(stdin)
    
    stdout.write "请输入第二个数字: "
    let input2 = readLine(stdin)
    
    let num1 = parseFloat(input1)
    let num2 = parseFloat(input2)
    let result = calculate(num1, num2, op)
    
    echo "结果: ", num1, " ", op, " ", num2, " = ", result
    echo ""
    
  except ValueError:
    echo "错误:请输入有效的数字"
  except EOFError:
    break

echo "感谢使用计算器!"

编译运行:

nim c -r src/calculator.nim

通过本节的学习,你已经成功搭建了Nim开发环境,编写并运行了第一个Nim程序。Nim语言的简洁语法和强大功能将为你的编程之旅提供良好的开端。接下来可以继续探索Nim更多的语言特性和高级功能。

Nim基础语法与核心特性

Nim语言以其独特的设计哲学融合了Python的简洁语法、C的性能效率和强大的元编程能力。作为一门静态类型的编译型系统编程语言,Nim在语法设计上追求表达力、效率和优雅的完美平衡。

变量声明与类型系统

Nim提供了三种变量声明方式,每种都有其特定的使用场景:

# 可变变量声明
var
  x: int = 10
  y = "Hello"  # 类型推断
  z: float

# 不可变变量(单次赋值)
let 
  pi = 3.14159
  name = "Nim"

# 编译时常量
const
  MaxSize = 1024
  AppName = "MyApp"

Nim的类型系统既强大又灵活,支持基本类型、复合类型和高级类型特性:

类型类别示例描述
基本类型int, float, bool, char, string基础数据类型
复合类型array[5, int], seq[string], tuple[name: string, age: int]集合类型
引用类型ref object, ptr int指针和引用类型
元类型typedesc, static[T]编译时类型操作

过程(函数)定义

Nim中的函数称为过程(procedure),使用 proc 关键字定义:

# 基本过程定义
proc add(a: int, b: int): int =
  result = a + b  # 隐式返回值变量

# 简化语法(表达式体)
proc multiply(x, y: int): int = x * y

# 默认参数和命名参数
proc greet(name: string = "Guest", times: int = 1) =
  for i in 1..times:
    echo "Hello, ", name, "!"

# 过程重载
proc process(data: string) = echo "String: ", data
proc process(data: int) = echo "Integer: ", data

控制流结构

Nim的控制流语句借鉴了Python的缩进语法,但更加严格和一致:

# if-elif-else 语句
let score = 85
if score >= 90:
  echo "优秀"
elif score >= 80:
  echo "良好"
else:
  echo "需努力"

# case 语句(模式匹配)
case score
of 90..100: echo "A"
of 80..89: echo "B"
of 70..79: echo "C"
else: echo "D"

# for 循环
for i in 0..4:  # 包含范围
  echo i

for i in 0..<5: # 不包含上限
  echo i

# while 循环
var count = 0
while count < 5:
  echo count
  inc count

复合数据类型

Nim提供了丰富的复合数据类型,用于构建复杂的数据结构:

# 数组 - 固定大小,栈分配
var numbers: array[5, int] = [1, 2, 3, 4, 5]

# 序列 - 动态大小,堆分配
var names: seq[string] = @["Alice", "Bob", "Charlie"]
names.add("David")

# 元组 - 命名字段
type
  Person = tuple
    name: string
    age: int

var person: Person = (name: "John", age: 30)

# 对象 - 面向对象编程
type
  Animal = object
    name: string
    age: int
    sound: string

proc makeSound(a: Animal) =
  echo a.sound

错误处理机制

Nim提供了多种错误处理方式,从简单的返回码到现代的异常处理:

# Option类型 - 函数式风格
import std/options

proc findIndex(arr: seq[int], value: int): Option[int] =
  for i, v in arr:
    if v == value:
      return some(i)
  return none(int)

# 异常处理
try:
  let file = open("data.txt")
  echo file.readAll()
  file.close()
except IOError:
  echo "文件操作错误"
except:
  echo "未知错误"
finally:
  echo "清理资源"

泛型编程

Nim的泛型系统非常强大,支持类型参数化和约束:

# 基本泛型过程
proc max[T](a, b: T): T =
  if a > b: a else: b

# 类型约束
proc sum[T: SomeNumber](items: seq[T]): T =
  for item in items:
    result += item

# 泛型对象
type
  Container[T] = object
    data: seq[T]
    size: int

proc add[T](c: var Container[T], item: T) =
  c.data.add(item)
  inc c.size

元编程能力

Nim最强大的特性之一是其编译时元编程能力:

# 模板 - 代码替换
template `!=` (a, b: untyped): bool = not (a == b)

# 宏 - 编译时代码生成
import macros

macro debugPrint(args: varargs[untyped]): untyped =
  result = newStmtList()
  for arg in args:
    result.add quote do:
      echo `arg`, " = ", `arg`

# 使用示例
let x = 10
let y = 20
debugPrint(x, y)  # 编译时生成: echo "x = ", x; echo "y = ", y

内存管理

Nim提供多种内存管理策略,满足不同场景需求:

# 引用计数(默认)
var s: seq[int] = @[1, 2, 3]  # 自动内存管理

# 手动内存管理
type
  Node = ref object
    data: int
    next: Node

var n = Node(data: 10)  # 堆分配,自动管理

# 指针操作(低级编程)
var 
  p: ptr int
  arr = cast[ptr array[5, int]](alloc(sizeof(int) * 5))

模块系统

Nim的模块系统支持代码组织和封装:

# 模块导出控制
module mymodule

# 公开接口
proc publicProc*() = echo "公开过程"

# 私有实现
proc privateProc() = echo "私有过程"

# 导入其他模块
import std/strutils, std/sequtils

# 从模块导入特定符号
from std/math import PI, sin, cos

Nim语言的语法设计体现了其"表达力优先"的设计理念,通过简洁的语法、强大的类型系统和元编程能力,让开发者能够编写出既高效又易于维护的代码。其独特的缩进语法、丰富的标准库和跨平台编译能力,使其成为系统编程和应用程序开发的优秀选择。

总结

Nim语言通过精心平衡效率、表达力和优雅性三大设计原则,为开发者提供了一个既强大又愉悦的编程工具。其独特的语法设计融合了Python的简洁性和Pascal的严谨性,强大的类型系统和元编程能力使其在系统编程领域脱颖而出。与C/C++、Rust、Go等语言相比,Nim在性能、开发效率和语言特性之间找到了精妙的平衡点,适合高性能计算、系统工具开发、游戏开发、Web后端等多种场景。通过简洁的语法、丰富的标准库和跨平台编译能力,Nim正在成为系统编程和应用程序开发的优秀新选择。

【免费下载链接】Nim Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority). 【免费下载链接】Nim 项目地址: https://gitcode.com/gh_mirrors/ni/Nim

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值