gpt4 book ai didi

perl - 解析树和字节码是一回事吗?

转载 作者:行者123 更新时间:2023-12-04 05:33:12 26 4
gpt4 key购买 nike

字节码和解析树之间到底有什么区别,特别是 Perl 使用的那个?它们实际上指的是同一个概念,还是有区别?

我熟悉 Python 和 Java 中的字节码概念,但是在阅读 Perl 时,我了解到它应该在其解释器中执行解析树(而不是字节码)。

如果真的有区别,Perl 不使用字节码(或 Python 不使用解析树)的原因是什么?主要是历史原因,还是需要不同编译/执行模型的语言之间存在差异?可以通过使用字节码解释器来实现 Perl(以合理的努力和执行性能)吗?

最佳答案

Perl 使用的不是 parse tree ,至少不是维基百科如何定义它。这是一个操作码树。

>perl -MO=Concise -E"for (1..10) { say $i }"
g <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 49 -e:1) v:%,{,2048 ->3
f <2> leaveloop vK/2 ->g
7 <{> enteriter(next->c last->f redo->8) lKS/8 ->d
- <0> ex-pushmark s ->3
- <1> ex-list lK ->6
3 <0> pushmark s ->4
4 <$> const[IV 1] s ->5
5 <$> const[IV 10] s ->6
6 <#> gv[*_] s ->7
- <1> null vK/1 ->f
e <|> and(other->8) vK/1 ->f
d <0> iter s ->e
- <@> lineseq vK ->-
8 <;> nextstate(main 47 -e:1) v:%,2048 ->9
b <@> say vK ->c
9 <0> pushmark s ->a
- <1> ex-rv2sv sK/1 ->b
a <#> gvsv[*i] s ->b
c <0> unstack v ->d
-e syntax OK

除了,尽管被称为树,但它并不是真正的树。注意到箭头了吗?这是因为它实际上是一个类似列表的操作码图(就像任何其他可执行文件一样)。
>perl -MO=Concise,-exec -E"for (1..10) { say $i }"
1 <0> enter
2 <;> nextstate(main 49 -e:1) v:%,{,2048
3 <0> pushmark s
4 <$> const[IV 1] s
5 <$> const[IV 10] s
6 <#> gv[*_] s
7 <{> enteriter(next->c last->f redo->8) lKS/8
d <0> iter s
e <|> and(other->8) vK/1
8 <;> nextstate(main 47 -e:1) v:%,2048
9 <0> pushmark s
a <#> gvsv[*i] s
b <@> say vK
c <0> unstack v
goto d
f <2> leaveloop vK/2
g <@> leave[1 ref] vKP/REFC
-e syntax OK

Perl 的操作码和 Java 的字节码之间的区别在于 Java 的字节码被设计为可序列化(存储在文件中)。

关于perl - 解析树和字节码是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com