只能'perl6'解析Perl 6吗?

Mar*_*las 37 perl parsing jit perl6 raku

有(相对)众所周知的Perl公理,"只有perl可以解析Perl." 我想知道,Perl 6会保持这种情况吗?

扩展讨论......考虑到PyPy最近的更新,我想到了这个问题.Perl的独特解析能否阻止它进行类似的工作?在Perl代码(PPI?)的受限制的静态视图中有多大价值?Perl 6可以有一个JIT编译器吗?*

*我不确定这些概念是否相关.是吗?

bri*_*foy 36

没有perl6,并且有许多Perl 6编译器.Perl 6有一个语法,虽然它是用Perl 6编写的,所以只要你能理解它,它就会告诉你需要知道的一切.

我刚问拉里这个问题,因为我在圣保罗佩尔工作室的午餐时坐在他对面.他说现在"只有Perl 6可以解析Perl 6",Perls上都有大写字母,这意味着与原始声明不同.

虽然Perl 6的目标是一个标准和许多实现,但您不需要特定的程序来执行此操作.没有"perl6",尽管Larry在今天的演讲中对他的Rakudo有别名,尽管他在这些例子中使用了一些不同的实现.


Ran*_*rtz 9

最后我看,Perl 6继承了Perl 5的/字符,这可能意味着在预期一个术语时"正则表达式的开始",或者在预期运算符时"分开".鉴于此,原型和Perl 6至少与Perl 5在同一阵营中用于静态标记化.标记化Perl 6程序的唯一方法是在Perl 6编译器中运行Perl 6解释器.海龟一路下来,一次又一次.

  • (迟到了,但不论),这是不是在perl6问题,因为/是中缀操作符,你永远无法启动,其中一个管道符预期正则表达式.但是,如果同时定义前缀:</>和后缀:</>,则可以将以前为regex/1 + 1/parse的内容作为1和1的总和.但是,解析器会知道这一点并相应地更正自己.在编译时不需要运行代码来确保这一点. (5认同)

Eri*_*rom 8

公理"只有perl可以解析Perl",其中"perl"是解释器二进制文件,"Perl"是语言主要源于解析规则在解析文件时可以更改的事实.在Perl 5中,它来自原型子例程声明,来自各种编译指示和源过滤器.

在我看来,这只会在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中,内省的级别更高,因此解释器本身可以提供所有必要的工具.

  • @Eric Storm你提出了一个强有力的论据,但我并没有完全买入它.perl5仅解析Perl 5的问题是Perl 6人员所熟知的,也是设计目标之一.与Perl 5不同,Perl 6语言扩展是根据Perl 6语法定义的,这是一个单独的,更小的规范.至于运算符的问题,你可以定义新的ops而不是新的*类型的ops.也就是说,股票语法可以看到它有一个中缀运算符而不需要知道它是否存在.最后,如果ops只能在编译时定义,那么这一切都会消失,我正在检查. (11认同)
  • 这是一个令人难以置信的无知答案,由那些不知道发生了什么的人提出. (10认同)
  • 是的,您无法在运行时定义适用于已编译代码的新运算符.所以`if condition {eval'...定义一个新的op或宏......"}`对解析没有影响.此外,您无法在条件中有用地定义新运算符.`if condition {multi sub postfix:...}`没有达到预期的效果. (5认同)
  • @Eric Strom,是的,他们谈到"解析器规则可以改变的地方数量",定义运算符,宏等的能力.这些都不相关.例如,它们都适用于C++,但C++解析器不需要运行任意C++代码来编译C++程序. (4认同)
  • 以下是解析Perl5所需的perl5示例:`BEGIN {if(rand()<.5){*f = sub(){3}; } else {*f = sub {3}; 打印f + 1`.需要运行任意Perl代码来确定产品是否等同于'print(f()+ 1)`或`print(f(+1))` (4认同)

Bil*_*ert 5

Perl 6是一个规范,遵循该规范的任何程序都是Perl 6,就像大多数其他语言一样.在工作中有许多Perl 6实现.