【问题标题】:Does the perl interpreter parse code line-by-line or all together?perl 解释器是逐行解析代码还是一起解析代码?
【发布时间】:2016-04-04 19:03:46
【问题描述】:

根据我对perl解释器的理解,代码首先被解析成操作码。然后在执行期间解释此操作码图。我想知道解析是逐行进行还是一起进行。

我有一些代码开头带有exit 语句,但是当我运行脚本时,perl 报告了一个错误,该错误位于exit 语句的下方。 (错误是缺少分号。)如果 perl 解释器逐行工作,它如何报告位于 exit 语句下方的错误?还是解析阶段报错?

【问题讨论】:

  • 您在问一个关于非常低级 Perl 的问题。为什么你需要知道这个?
  • 阅读下面的答案后,比较perl -e'exit; if'perl -e'BEGIN{exit} if'

标签: perl interpreter


【解决方案1】:

如果 perl 解释器是逐行工作的,它如何报告位于 exit 语句下方的错误?还是解析阶段报错?

在解析/编译阶段报告了有问题的错误。即使您使用了-c,它也会被报告。这些被称为“编译时错误”。

在那个阶段无法检测到一些错误。这些被称为“运行时错误”。


根据我对perl解释器的理解,代码首先被解析成操作码。然后在执行期间解释此操作码图。我想知道解析是逐行进行还是一起进行。

文件作为一个整体编译,然后编译后的表单从头开始执行。 BEGINuse 语句与此不同;它们在编译后立即执行(即在编译文件的其余部分之前)。

$ perl -e'
    BEGIN { print "Start of compilation.\n"; }
            print "Start of execution.\n";
    # ...
    BEGIN { print "End of compilation.\n"; }
            print "End of execution.\n";
'
Start of compilation.
End of compilation.
Start of execution.
End of execution.

使用-c 会导致 Perl 在开始执行之前退出。 (BEGINuse 语句仍然正常执行。)

$ perl -c -e'
    print "This statement was executed.\n"
    my $x = 4;
    $x += 5;
    print "$x\n";
    BEGIN { print "This statement was compiled.\n"; }
'
This statement was compiled.
-e syntax OK

编译结果如下所示:

$ perl -MO=Concise,-exec -e'
    my $x = 4;
    $x += 5;
    print "$x\n";
'
1  <0> enter
2  <;> nextstate(main 1 -e:2) v:{
3  <$> const[IV 4] s
4  <0> padsv[$x:1,2] sRM*/LVINTRO
5  <2> sassign vKS/2
6  <;> nextstate(main 2 -e:3) v:{
7  <0> padsv[$x:1,2] sRM
8  <$> const[IV 5] s
9  <2> add[t2] vKS/2
a  <;> nextstate(main 2 -e:4) v:{
b  <0> pushmark s
c  <0> padsv[$x:1,2] s
d  <$> const[PV "\n"] s
e  <2> concat[t3] sK/2
f  <@> print vK
g  <@> leave[1 ref] vKP/REFC
-e syntax OK

【讨论】:

    【解决方案2】:

    Perl 的伟大之处在于编译器和解释器协同工作。编译后的代码可以在编译过程中部分执行,解释器可以要求在运行时编译代码

    一般来说,程序是逐个字符编译然后执行的,但如果编译器遇到BEGIN 块(或use 语句,其工作方式类似于BEGIN),则调用Perl 解释器在程序的其余部分被编译之前立即执行该块

    一旦编译器到达文件末尾,代码就会被thge解释器执行。但是运行时 Perl 也可以使用eval 来调用编译器

    如果主源文件中的任何地方出现致命错误,例如缺少分号,那么 Perl 编译器会在解释器开始执行编译后的代码之前立即报告错误

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2012-03-05
      • 2014-01-16
      • 1970-01-01
      • 2014-07-09
      • 2013-06-22
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多