1

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结果。这是运行时结果还是编译时结果?

我真的不明白幕后发生了什么。

4

3 回答 3

3

在您的示例中,您似乎使用了解释器,那么编译时间运行时间之间的差异可能并不那么明显。原则上是:

  • 编译时间:源代码被编译成更底层指令(例如机器代码)的阶段。在此阶段还完成了类型推断和语法检查等工作。保证在此阶段捕获的所有错误(如标准 ML 的类型错误)永远不会在运行时发生,这是一件非常好的事情,因为您知道在成功编译后某些类型的错误永远不会发生。(编译时间也是应用编译器优化的时间。)
  • 运行时间:这是您的程序实际执行的时间(无论是机器代码还是其他表示形式):为程序提供输入并计算结果。

对于您的明确示例:在编译期间,仅检查您的输入在语法上是否正确并len推断出类型。在运行期间,由您的输入表示的程序将被执行,但由于该程序中没有计算(它只是定义新函数len而不调用它),因此无需执行任何操作。

于 2013-05-15T02:16:59.480 回答
1

首先要记住,在你的代码可以运行之前,它必须被编译。所以应该发生两个过程 - 编译和运行 - 。因此,编译时间是编译代码所需的时间,而运行时间是实际运行所需的时间。

希望你能理解

于 2013-05-14T23:44:09.940 回答
0

ML 的大多数实现都将“增量编译器”作为 read-eval-print 循环的一部分。因此,当您输入一个新的顶级声明时,首先会对其进行编译(包括静态类型检查和代码生成),然后运行生成的本机代码。

对于习惯于以 C 或 C++ 方式进行批处理模式编译的人来说,像这样可以在运行时编译的系统可能看起来很奇怪。甚至 Java 在这方面也更加静态,但 Scala 的 read-eval-print 循环表明它不仅可以在 ML 中完成。请注意,这可能看起来像一个解释器,但实际上是一个在运行时生成代码的编译器。

总的想法相当古老,来自古老的 LISP 时代,但 LISP 最初没有编译器,通常只是在没有编译的情况下进行解释。

于 2013-10-08T20:00:27.623 回答