繁体   English   中英

perl解释器是逐行还是一起解析代码?

[英]Does the perl interpreter parse code line-by-line or all together?

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

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

如果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

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

通常,程序是逐个字符地编译然后执行的,但是如果编译器遇到BEGIN块(或use语句,其作用类似于BEGIN ),则将调用Perl解释器以在其余部分之前立即执行该块。程序被编译

编译器到达文件末尾后,代码将由thge解释器执行。 但是运行时Perl也可以使用eval来调用编译器

如果主源文件中的任何地方都存在致命错误,例如缺少分号,那么Perl编译器将在解释程序开始执行编译的代码之前立即报告该错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM