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

Sml 编译时和运行时之间的差异,sml,read-eval-print-loop,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 在按下enter键后,我们得到val len=fn:'a list->int作为结果。这是运行时结果还是复杂时间结果 我真的不明白幕后发生了什么。首先要记住,在运行代

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

在编写了一些SML代码之后,我们按enter键。但我不明白,我们真的在编译吗 它还是运行它?比如说

- fun len [] = 0 | len (x::xs) = 1 + len xs;      /* hit enter*/
val len = fn : 'a list -> int
在按下enter键后,我们得到val len=fn:'a list->int作为结果。这是运行时结果还是复杂时间结果


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

首先要记住,在运行代码之前,必须先编译代码。因此,应该有两个过程——编译和运行。因此,编译时是编译代码所需的时间,而运行时是实际运行所需的时间


希望您理解

首先请记住,在运行代码之前,必须对其进行编译。因此,应该有两个过程——编译和运行。因此,编译时是编译代码所需的时间,而运行时是实际运行所需的时间


希望您理解

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

编译时:将源代码编译成低级指令的阶段,例如机器代码。在这个阶段,还将执行类型推断和语法检查等操作。所有保证在此阶段捕获的错误(如标准ML的类型错误)都不会在运行时发生,这是一件非常好的事情,因为您知道在成功编译之后,某些类型的错误永远不会发生。编译时也是应用编译器优化的时间。 运行时:这是您的程序实际执行的时间,无论是作为机器代码还是其他表示形式:向程序提供输入并计算结果。
对于您的显式示例:在编译时,只检查您的输入是否语法正确,以及是否推断出len的类型。在运行时,将执行由输入表示的程序,但由于该程序中没有计算,它只定义了新函数len而不调用它,因此无需执行任何操作。

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

编译时:将源代码编译成低级指令的阶段,例如机器代码。在这个阶段,还将执行类型推断和语法检查等操作。所有保证在此阶段捕获的错误(如标准ML的类型错误)都不会在运行时发生,这是一件非常好的事情,因为您知道在成功编译之后,某些类型的错误永远不会发生。编译时也是应用编译器优化的时间。 运行时:这是您的程序实际执行的时间,无论是作为机器代码还是其他表示形式:向程序提供输入并计算结果。
对于您的显式示例:在编译时,只检查您的输入是否语法正确,以及是否推断出len的类型。在运行时,将执行由输入表示的程序,但由于该程序中没有计算,它只定义了新函数len而不调用它,因此无需执行任何操作。

大多数ML实现的特点是作为读取-评估-打印循环一部分的增量编译器。因此,当您输入一个新的顶级声明时,首先编译它,包括静态类型检查和代码生成,然后运行生成的本机代码

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


一般的想法很古老,源于古代的LISP时代,但LISP最初没有编译器,通常只是在没有编译的情况下进行解释。

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

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

一般的想法是相当古老的,来自古老的LISP时代,但LISP最初没有编译器,通常只是 未经编译而解释