SML 中的编译时间和运行时间有什么区别?
在编写了一些 SML 代码后,我们按回车键。但我不明白,我们实际上是在编译它还是在运行它?例如
- fun len [] = 0 | len (x::xs) = 1 + len xs; /* hit enter*/
val len = fn : 'a list -> int
按回车后,我们得到val len = fn : 'a list -> int
结果。这是运行时结果还是编译时结果?
我真的不明白幕后发生了什么。
SML 中的编译时间和运行时间有什么区别?
在编写了一些 SML 代码后,我们按回车键。但我不明白,我们实际上是在编译它还是在运行它?例如
- fun len [] = 0 | len (x::xs) = 1 + len xs; /* hit enter*/
val len = fn : 'a list -> int
按回车后,我们得到val len = fn : 'a list -> int
结果。这是运行时结果还是编译时结果?
我真的不明白幕后发生了什么。
在您的示例中,您似乎使用了解释器,那么编译时间和运行时间之间的差异可能并不那么明显。原则上是:
对于您的明确示例:在编译期间,仅检查您的输入在语法上是否正确并len
推断出类型。在运行期间,由您的输入表示的程序将被执行,但由于该程序中没有计算(它只是定义新函数len
而不调用它),因此无需执行任何操作。
首先要记住,在你的代码可以运行之前,它必须被编译。所以应该发生两个过程 - 编译和运行 - 。因此,编译时间是编译代码所需的时间,而运行时间是实际运行所需的时间。
希望你能理解
ML 的大多数实现都将“增量编译器”作为 read-eval-print 循环的一部分。因此,当您输入一个新的顶级声明时,首先会对其进行编译(包括静态类型检查和代码生成),然后运行生成的本机代码。
对于习惯于以 C 或 C++ 方式进行批处理模式编译的人来说,像这样可以在运行时编译的系统可能看起来很奇怪。甚至 Java 在这方面也更加静态,但 Scala 的 read-eval-print 循环表明它不仅可以在 ML 中完成。请注意,这可能看起来像一个解释器,但实际上是一个在运行时生成代码的编译器。
总的想法相当古老,来自古老的 LISP 时代,但 LISP 最初没有编译器,通常只是在没有编译的情况下进行解释。