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结果?
我真的不明白幕后发生了什么。
答案 0 :(得分:3)
在您的示例中,您似乎使用了解释器,然后编译时和运行时之间的差异可能不那么明显。原则上是:
对于您的显式示例:在编译时期间,仅检查您的输入在语法上是否正确并且推断出len
的类型。在运行时期间,执行由您的输入表示的程序,但由于该程序中没有计算(它只是定义了新函数len
而没有调用它),所以没有必要完成。
答案 1 :(得分:1)
首先请记住,在运行代码之前,必须先编译它。因此,应该发生两个过程 - 编译和运行 - 。因此,编译时间是编译代码所需的时间,运行时间是运行所需的实际时间。
希望你理解
答案 2 :(得分:0)
ML的大多数实现都将“增量编译器”作为read-eval-print循环的一部分。因此,当您输入新的顶级声明时,首先编译它(包括静态类型检查和代码生成),然后运行生成的本机代码。
可以在运行时编译的系统对于习惯于以C或C ++方式进行批处理模式编译的人来说可能看起来很奇怪。甚至Java在这方面也比必要时更加静态,但Scala read-eval-print循环表明它不仅可以在ML中完成。请注意,这可能看起来像一个解释器,但实际上是一个在运行时生成代码的编译器。
总体思路相当陈旧,来自古代LISP时代,但LISP最初并没有编译器,而且通常只是在没有编译的情况下进行解释。