【问题标题】:How does Perl react during compile time and run time?Perl 在编译时和运行时如何反应?
【发布时间】:2012-03-15 09:14:22
【问题描述】:

我对此的理解是:

编译时间期间,错误是导致 Perl 无法解析文件的错误;例如缺少分号。

运行时错误是在代码运行之前无法检测到的错误;例如除以零错误或调用未定义的子例程。

由于 Perl 是一种解释性语言,整个代码或脚本会编译一次然后运行,还是会为每一行编译然后运行?

解释是什么?

【问题讨论】:

    标签: perl


    【解决方案1】:

    程序将被编译一次到一个optree。遍历并执行optree。

    在运行时,可能需要额外的编译阶段。通常的罪魁祸首是字符串eval 和代码单元的延迟/动态加载,例如require, do.

    【讨论】:

      【解决方案2】:

      Perl 是一种解释型语言,这意味着每次尝试启动脚本时,编译阶段和运行阶段都会依次发生。

      另一方面,

      编译语言(C、Pascal等)将这两个阶段分开,通常有一个称为链接的中间阶段,它将连接在一起object fileslibraries放到最终的executable文件中。

      在编译语言中,检测未定义函数可能发生在 compile 阶段或 linking 阶段,具体取决于语言规范的严格程度。在原始 C 中调用未定义函数会被链接器找到,但在 C++ 中,它会被编译器找到。

      为了更复杂的事情,一些语言,如Java,有独立的编译和执行阶段,但编译实际上是一个中间“字节码”,然后由运行时系统解释(即 Java 虚拟机)。

      严格来说,Perl 也使用了中间字节码,但阶段的分离大多是不可见的。

      【讨论】:

      • Java 遵循 Perl 的解释中间表示的模型。
      • @daxim 确实如此,但在作为单独阶段公开的 Java 中,在 Perl 中则不是。
      • 相分离不是不可见的。它是复杂的。试试BEGIN{} 块。
      • @J-16SDiZ 伙计们,OP是新手,我试图让解释变得简单。
      • 通过省略材料而不是通过说错话或误导来使事情变得更简单。
      猜你喜欢
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多