编译时和运行时的区别

use*_*605 1 sml read-eval-print-loop

SML 中的编译时和运行时有什么区别?

写完一些 SML 代码后,我们按下 Enter 键。但我不明白,我们实际上是编译它还是运行它?例如

- fun len [] = 0 | len (x::xs) = 1 + len xs;      /* hit enter*/
val len = fn : 'a list -> int
Run Code Online (Sandbox Code Playgroud)

按回车键后,我们得到val len = fn : 'a list -> int结果。这是运行时结果还是编译时结果?

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

chr*_*ris 5

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

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

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