有一个(相对)众所周知的 Perl 公理,“只有 perl 可以解析 Perl”。我想知道,对于 Perl 6 是否仍然如此?
扩大讨论...鉴于 PyPy 的最新更新,我想到了这个问题。Perl 独特的可解析性是否会阻止它进行类似的努力?Perl 代码 (PPI?) 的受限静态视图有多大价值?Perl 6 可以有 JIT 编译器吗?*
* 我不确定这些概念是否相关。他们是吗?
没有 perl6,有很多 Perl 6 编译器。Perl 6 有一个语法,虽然它是用 Perl 6 编写的,所以只要你能理解它,它就会告诉你你需要知道的一切。
我刚刚问了拉里这个问题,因为我在圣保罗 Perl 工作室吃午饭时坐在他对面。他说现在是“只有 Perl 6 可以解析 Perl 6”,两个 Perl 上都有大写字母,这意味着与原始声明不同的东西。
您不需要特定的程序来执行此操作,因为 Perl 6 的目标是一个标准和多个实现。没有“perl6”,尽管 Larry 在今天的演讲中使用了他的 Rakudo 别名,尽管他在示例中使用了一些不同的实现。
最后我看了一下,Perl 6 继承了 Perl 5 的 / 字符,当需要一个术语时,它可以表示“正则表达式的开头”,或者当需要一个运算符时表示“除法”。鉴于此,以及原型,Perl 6 至少与 Perl 5 在静态标记化方面处于同一阵营。标记 Perl 6 程序的唯一方法是在 Perl 6 编译器中运行 Perl 6 解释器。乌龟一路向下,再一次。
公理“只有 perl 可以解析 Perl”,其中“perl”是解释器二进制文件,而“Perl”是语言,很大程度上源于这样一个事实,即在解析文件时解析规则可能会发生变化。在 Perl 5 中,这来自原型子例程声明、各种 pragma 和源过滤器。
在我看来,这只会在 Perl 6 中成为更大的问题。在 Perl 5 中,解析器规则可以更改的地方的数量是有限的,而在 Perl 6 中,它们是广泛而多样的。除了 Perl 5 的所有功能之外,Perl 6 还允许您定义自己的运算符,并且由于此定义是在 Perl 代码中完成的,因此需要 Perl 解释器来理解它。
据我所知,目前还没有实现支持它,但是 Perl 6 规范还包括真正的语言级宏,它可以以文本方式或通过操作 AST 来重构 Perl 6 代码。这两者都需要有一个 Perl 解释器来执行它们的魔法。
所以总而言之,我有一种感觉,Perl 6 将使公理比 Perl 5 更强大。(对于语法荧光笔的作者来说,这将是一场噩梦 :))当然,这一切都是为了增加表现力语言的力量,所以我同意让步。
上述推论是,与 Perl 5 不同,Perl 6 有一个正式的规范,因此公理可能必须更改为“只有实现 Perl 6 规范的解释器才能解析 Perl 6”,但这有点迂腐。
根据更新:
我不认为以上内容排除了 Perl 6 的 JIT 编译器的想法,因为根据定义,这样的编译器还必须包含 Perl 6 解释器。就静态编译而言,它可能是可能的,但它会严重限制语言的运行时能力,因为任何涉及 eval 的构造都不起作用。
PPI 在 Perl 5 领域很有用,因为 perl 解释器没有为其 AST 提供许多丰富且易于使用的接口。在 Perl 6 中,自省的级别要高得多,因此解释器本身可以提供所有必要的工具。
Perl 6 是一个规范,任何遵循该规范的程序都是 Perl 6,就像大多数其他语言一样。有许多 Perl 6 实现正在开发中。
Perl6 可以有 JIT 编译器吗?
您暗示 Perl5 不能基于“只能perl
解析 Perl5”进行 JITted,但事实并非如此。即使 Perl5 程序每次运行时都可以进行不同的编译,但这并不妨碍它进行 JITted。
所以,如果 Perl5(定义最松散的语言之一)可以 JITted,为什么 Perl6 不能。