How does it work?

使Nim变得独特之一事情是它的实现.每一个编程语言都有一个实现应用程序的形式,或者是解释源程序,或者将源程序编译成一个可执行文件.这些实现分别称作一个解释器和编译器.虽然一些语言可能有多个实现,但Nim的唯一的实现是一个编译器.Nim编译器编译Nim源代码首先将源代码转换成另一个称作C的编程语言,然后传递C源代码到C编译器,C编译器将C代码编译成一个二进制可执行文件.该可执行文件是一个包含指示计算机应该执行特定任务的指令文件,这些指令包含在原始Nim源代码中指定的源代码.假设你写了一个计算器程序,在编译过程中可执行文件是程序本身,它是为了运行你的计算器而执行的并且你希望开始执行的计算. 图 1.1 展示了Nim代码的编译过程

图1.1:Nim编译器怎样编译源代码

大多数编程语言的编译器没有这个额外的步骤,它们自身将源代码编译成一个二进制可执行文件.一些编程语言的实现甚至不用编译代码.

图1.2 展示了不同的编程语言将源代码转换成一个可以执行的任务程序的源代码.

图1.2 Nim编译器与其他编程语言编译器的比较

正如你所看到的Nim的编译过程加入到C的编译过程,为了编译C的源代码生成作为Nim编译过程的一部分.这意味着Nim的编译器依赖一个外部的C编译器如GCC或者clang.但是尽管如此,编译过程依然很快.编译的结果是一个可执行文件.它可以开始为了执行包含在初始源代码中的指令.这些指令导致一些动作被执行,动作之一可能是从网络下载文件或者添加两个输入.

编译型的编程语言如Nim,C,Go,D以及Rust产生一个可执行的本机操作系统上运行的编译器.在Windows上编译一个Nim应用将会产生一个仅可在Windows上运行的可执行文件.类似的,在Mac OS X编译将会产生一个仅可以在Mac OS X上运行的可执行文件.CPU架构也产生在这,在ARM上编译将导致产生一个仅兼容ARM CPUS的可执行文件.这是默认的工作方式,可以指示编译器通过一个过程结合一个不同的操作系统和CPU编译执行,称作交叉编译.

这个问题是为什么JVM被创建的主要原因之一.你可能听过"一次编写,到处执行".这是Sun Microsystems创建的一个口号来说明Java编程语言跨平台的好处.一个Java应用程序只需要编译一次,编译的结果是一个JAR文件,它包含所有编译的Java类文件.为了执行程序的行为就可以通过Java虚拟机执行JAR文件.JAR文件可以被Java虚拟机在任何平台和结构上执行.JAR文件是一个平台和结构无关的可执行文件.该缺点是为了运行JAR文件必须在用户系统上安装Java虚拟机.添加另一个依赖不是一个好主意,JVM非常大,并且不一定适合特定的用户用例,它还增加了另一个软件可能包含漏洞和安全问题.

Python与这非常相似,它也使用一个虚拟机来执行代码.但是在Python的用例中,虚拟机用来优化Python的代码执行,它通常仅仅是一个实现细节.基本上,Python通过一个Python解释器解释执行.Python解释器解析代码,决定了代码描述的行为,并立即执行这些行为.这没有像Java,C,或者Nim一样的编译步骤.但是缺点是相同的,为了执行一个Python应用程序,系统需要安装一个Python解释器.除此之外,任何打破Python语言的变化意味写入应用程序可能停止执行.当Python 3被释放时会发生,并且仍存在为Python 2编写的库不能Python 3的解释器公工作.

Footnote 3mhttp://py3readiness.org/

类似于"编写一次,到处运行"标语,其他的一些语言采取"编写一次,到处编译"的哲学,描述的事实是这些编程语言仅是在源代码层级是跨平台的.换句话说,你不需要写平台特定代码.这应用与语言如,C++,pascal,以及Ada.但是这些语言在处理更专业的系统特性时仍要求平台特定代码,如,创建新线程或者从web页面下载内容.Nim更进一步,它的标准库抽象了操作系统间的差异,并允许你使用很多现代操作系统提供的特性.

这应该给了你一个好主意有关Nim源代码转换成工作应用程序的方式以及这个过程如何不同的用于其他编程语言的.下个部分将评价Nim的优点和缺点.