我知道Parrot是一个虚拟机,但我觉得我并没有完全理解它背后的想法.
据我所知,它是一个虚拟机,可以处理多种语言.它是否正确?
使用虚拟机而不仅仅是解释器有什么好处?
Parrot做的具体是什么让它变得如此重要?
Parrot是一个专门用于处理多种语言的虚拟机,尤其是动态语言.尽管涉及一些有趣的技术,但由于它可以处理多种语言,因此它将能够跨越语言边界.例如,一旦它可以编译Ruby,Perl和Python,就应该很容易跨越这些边界让我在Python中使用Ruby库,一个Python的Perl库,所以无论我喜欢什么组合.
Parrot开始于Perl世界,很多人都是经验丰富的Perl人.Parrot不是使用当前显示其年龄的Perl解释器,而是允许Perl具有诸如可分发的预编译模块(其他人都已经拥有很长时间)和更智能的垃圾收集器等功能.
克里斯覆盖了面向用户的差异,所以我将覆盖另一方.
Parrot是基于寄存器而不是基于堆栈的.这意味着编译器开发人员可以更轻松地优化为给定代码段分配寄存器的方式.此外,从Parrot字节码到机器代码的编译理论上可以比基于堆栈的代码更快,因为我们运行基于寄存器的系统并且具有更多的优化经验.
Parrot是一个字节码解释器(可能在未来阶段使用JIT).想想Java及其虚拟机,除了Java(目前)更倾向于静态语言,而Parrot从一开始就面向动态语言.
另见Cody的优秀答案!强烈推荐.
其他人给出了很好的答案,所以对我而言,解释什么是"动态"语言实际上意味着什么.
在虚拟机的上下文中,这意味着在编译时不知道变量的类型.在"静态"语言中,类型(或至少是它的父类)在编译时是已知的,并且许多优化建立在该知识的基础上.
另一方面,在动态语言中,您可能知道变量是保存容器类型(如数组)还是标量(字符串,数字......),但在编译时您的类型信息要少得多.
另一个特点是动态语言通常使类型转换更容易,例如在perl和javascript中如果使用字符串作为数字,它会自动转换为数字.
Parrot旨在使这些操作变得简单快速,并且允许在编译时不知道类型信息进行优化.