定义

Nim代码指定一个计算,该计算作用于由称为 位置 的组件组成的内存。 变量基本上是位置的名称。每个变量和位置都是某种 类型 。 变量类型叫做 静态类型 ,位置的类型叫做 动态类型 。 如果静态类型和动态类型不一样,它是动态类型的一个超类型或子类型。

标识符 是声明为变量,类型,过程等的名称的符号。

声明适用的程序区域叫做 作用域 。作用域可以嵌套。 标识符的含义由声明标识符的最小封闭范围确定,除非重载解析规则另有说明。

表达式指定生成值或位置的计算。产生位置的表达式叫 左值 。左值可以表示位置或位置包含的值,具体取决于上下文。

Nim 程序 由一个或多个包含Nim代码的文本 源文件 构成。 它由Nim 编译器 处理成一个 可执行文件 。 可执行文件的类型取决于编译器实现; 例如它可以是原生二进制或JavaScript源代码。

在典型的Nim程序中,多数代码编译成可执行文件。 但是,某些代码可以在 编译期 执行 。 这可以包括宏定义使用的常量表达式,宏定义,和Nim过程。 编译期支持大部分Nim语言,但有一些限制 — 详见 Restrictions on Compile-Time Execution 。 我们用术语 进行时 来涵盖可执行文件中的编译时执行和代码执行。

编译器把Nim源代码解析为称为 抽象语法树 (AST) 的内部数据结构 。 然后,在执行代码或编译成可执行文件前,通过 语义分析 变换AST。 这会添加语义信息,诸如表达式类型、标识符含义,以及某些情况下的表达式值。 语义分析期间的错误叫做 静态错误 。 未另行指定时,本手册中描述的错误是静态错误。

运行时检查错误 是实现在运行时检查并报告的错误。 报错此类错误的方法是通过 引发异常以致命错误退出 。 但是,该实现提供了禁用这些 运行时检查 的方法 . 有关详细信息,请参阅 pragmas 部分。

检查的运行时错误是导致异常还是致命错误取决于实现。 因此以下程序无效;即使代码声称从越界数组访问中捕获 IndexError ,编译器也可以选择允许程序退出致命错误。

  1. var a: array[0..1, char]
  2. let i = 5
  3. try:
  4. a[i] = 'N'
  5. except IndexError:
  6. echo "invalid index"

未经检查的运行时错误 是一个不能保证被检测到的错误,并且可能导致任意的计算后续行为。 如果仅使用 safe 语言功能并且未禁用运行时检查,则不会发生未经检查的运行时错误。

常量表达式 是一个表达式,其值可以在出现的代码的语义分析期间计算。 它不是左值也没有副作用。 常量表达式不仅限于语义分析的功能,例如常量折叠;他们可以使用编译时执行所支持的所有Nim语言功能。 由于常量表达式可以用作语义分析的输入(例如用于定义数组边界),因此这种灵活性要求编译器交错语义分析和编译时代码执行。

在源代码中从上到下和从左到右进行图像语义分析是非常准确的,在必要时交错编译时代码执行以计算后续语义分析所需的值。 我们将在本文档后面看到,宏调用不仅需要这种交错,而且还会产生语义分析不能完全从上到下,从左到右进行的情况。