【问题标题】:Difference between compile time and run time编译时间和运行时间的区别
【发布时间】:2013-05-09 09:39:03
【问题描述】:

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

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

【问题讨论】:

    标签: sml read-eval-print-loop


    【解决方案1】:

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

    希望你理解

    【讨论】:

      【解决方案2】:

      在您的示例中,您似乎使用了解释器,那么 compile timerun time 之间的区别可能并不那么明显。原则上是:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-10
          • 2010-12-29
          • 2013-01-23
          • 2020-06-25
          • 1970-01-01
          相关资源
          最近更新 更多