编译时和运行时之间的差异

时间:2013-05-14 23:39:33

标签: sml read-eval-print-loop

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

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

3 个答案:

答案 0 :(得分:3)

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

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

对于您的显式示例:在编译时期间,仅检查您的输入在语法上是否正确并且推断出len的类型。在运行时期间,执行由您的输入表示的程序,但由于该程序中没有计算(它只是定义了新函数len而没有调用它),所以没有必要完成。

答案 1 :(得分:1)

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

希望你理解

答案 2 :(得分:0)

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

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

总体思路相当陈旧,来自古代LISP时代,但LISP最初并没有编译器,而且通常只是在没有编译的情况下进行解释。