标签: rakudo

随着Perl 6实现的成熟,我们可以期待什么性能提升?

每次我下载Rakudo Perl 6的新副本时,我都运行以下表达式,只是为了了解它当前的性能:

say [+] 1 .. 100000;
Run Code Online (Sandbox Code Playgroud)

并且速度一直在增加,但每次计算都有明显的延迟(几秒).作为比较,Perl 5(或其他解释语言)中的类似内容几乎立即返回:

use List::Util 'sum';

print sum(1 .. 100000), "\n";
Run Code Online (Sandbox Code Playgroud)

或者在Ruby中(也几乎是即时的):

(1 .. 100000).inject(0) {|sum,x| sum+x}
Run Code Online (Sandbox Code Playgroud)

将表达式重写为Perl6的loop速度大约是缩小范围的两倍,但对于简单的计算,它仍然是一个非常明显的延迟(超过一秒):

my $sum;
loop (my $x = 1; $x <= 100000; $x++) {$sum += $x}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,Perl6实现的哪些方面导致了这些性能问题?并且这应该随着时间的推移而改善,还是这个开销是Perl6使用的"一切都是对象"模型的不幸副作用?

最后,loop构造比[+]减速算子更快吗?我认为循环将导致更多的总操作而不是减少.

编辑:

我会接受这两个mortiz年代和hobbs'如果我能的回答.一切都是作为一个方法调用处理更直接地回答为什么[+]慢,所以一个人得到它.

perl performance rakudo perl6 raku

27
推荐指数
4
解决办法
2971
查看次数

是否可以在Raspberry Pi 3上编译/安装Perl6?

我正在尝试在Raspberry Pi 3上安装Rakudo Star 2018.04.

我做:

sudo perl Configure.pl --gen-moar --gen-nqp --prefix ~/rakudo
Run Code Online (Sandbox Code Playgroud)

它成功完成.

然后我尝试:

sudo make-install
Run Code Online (Sandbox Code Playgroud)

但它失败了:

The following step can take a long time, please be patient.
/home/pi/rakudo/bin/moar --libpath="blib" --libpath="/home/pi/rakudo/share/nqp/lib" --libpath="/home/pi/rakudo/share/nqp/lib" perl6.moarvm --nqp-lib=blib --setting=NULL --ll-exception --optimize=3 --target=mbc --stagestats --output=CORE.setting.moarvm gen/moar/CORE.setting
Stage start      :   0.000
Stage parse      : 459.019
Stage syntaxcheck:   0.000
Stage ast        :   0.000
Stage optimize   : Killed
Makefile:504: recipe for target 'CORE.setting.moarvm' failed
make[1]: *** [CORE.setting.moarvm] Error 137
make[1]: Leaving directory '/home/pi/rakudo-star-2018.04/rakudo'
Makefile:43: recipe for target …
Run Code Online (Sandbox Code Playgroud)

rakudo perl6 rakudo-star raspberry-pi raku

16
推荐指数
2
解决办法
455
查看次数

为什么源文件名不是人类可读的?

我安装了Perl6 rakudobrew并且浏览已安装的文件以查看十六进制文件名列表~/.rakudobrew/moar-2018.08/install/share/perl6/site/sources以及~/.rakudobrew/moar-2018.08/install/share/perl6/sources/.

例如

> ls ~/.rakudobrew/moar-2018.08/install/share/perl6/sources/
09A0291155A88760B69483D7F27D1FBD8A131A35  AAC61C0EC6F88780427830443A057030CAA33846
24DD121B5B4774C04A7084827BFAD92199756E03  C57EBB9F7A3922A4DA48EE8FCF34A4DC55942942
2ACCA56EF5582D3ED623105F00BD76D7449263F7  C712FE6969F786C9380D643DF17E85D06868219E
51E302443A2C8FF185ABC10CA1E5520EFEE885A1  FBA542C3C62C08EB82C1F4D25BE7B4696F41B923
522BE83A1D821D8844E8579B32BA04966BAB7B87  FE7156F9200E802D3DB8FA628CF91AD6B020539B
5DD1D8B49C838828E13504545C427D3D157E56EC
Run Code Online (Sandbox Code Playgroud)

这些文件包含软件包的源代码,但这种方式并不容易访问.那是什么理由?

rakudo perl6 raku

16
推荐指数
1
解决办法
407
查看次数

如何使用新的JS后端从Perl 6调用JavaScript内置函数?

我知道在Perl 6使用该后端时可以调用Java:如何从perl6调用Java方法

有没有办法访问例如Perl 6中的JavaScript DOM接口,并在浏览器中运行新的Rakudo JavaScript VM?

也许是这样的:

use v6;
use javascript::dom:from<JavaScript>;
Run Code Online (Sandbox Code Playgroud)

javascript rakudo perl6 raku

16
推荐指数
1
解决办法
375
查看次数

Perl6是否支持与Perl5的__DATA__和__END__部分相同的内容?

perl6/Rakudo是否有相当于perl5 __DATA____END__部分的东西?

perl rakudo perl6 raku

14
推荐指数
2
解决办法
739
查看次数

如何在perl6中执行外部命令并捕获其输出?

如何在Perl6中执行外部命令并捕获其输出?

Perl5风格的后退功能似乎不起作用:

> my $results = `ls`;
Confused at line 1, near "my $results"
Run Code Online (Sandbox Code Playgroud)

概要16记录了run方法,但是它返回退出状态而不是stdout的输出.

我正在使用Rakudo实现(rakudo-star-2010.12).

process rakudo perl6 raku

14
推荐指数
3
解决办法
1099
查看次数

如何使用Perl 6中的Perl 5模块?

是从Rakudo Perl 6使用CPAN的Perl 5模块的方法吗?

例如,如何在Perl 6中使用尚未移植的古老的Perl 5模块CGI.

更新:

这个早期Perl 6模块的这个时髦代码是什么:

use CGI:from<perl5>;
Run Code Online (Sandbox Code Playgroud)

是否使用":from"指令来唤起某种Perl 5兼容层.似乎找不到任何关于它的文档.

perl cpan rakudo raku

14
推荐指数
2
解决办法
1548
查看次数

Raku(do) 所依赖的延续的具体细节是什么?

在 1990 年代和 2000 年代,编程语言爱好者几乎没有讨论过分隔延续的话题。它最近重新成为编程语言讨论中的一个主要问题。

我希望有人至少可以权威地说出 Rakudo 背后的延续(与 Raku 相比)是否具有下面列出的六个特征中的每一个。在列表之后,我会多说一些我希望得到的答案。

从在线消息[1] 中逐字引用(带有格式修饰),该消息由推动向 JVM 添加延续的工作的人撰写:

  • 非对称:当延续挂起或让步时,执行返回到调用者(of Continuation.run())。对称延续没有调用者的概念。当他们让步时,他们必须指定另一个延续以将执行转移到。对称延续和非对称延续都不比彼此更强大,每个都可以用来模拟另一个。

  • Stackful:延续可以在调用堆栈中的任何深度挂起,而不是在延续是无堆栈时(如 C# 中的情况)在分隔上下文开始的同一子例程中。即延续有自己的堆栈,而不仅仅是单个子程序帧。有堆栈的延续比无堆栈的更强大。

  • Delimited:continuation 捕获从特定调用开始的执行上下文(在我们的例子中,是某个 runnable 的主体),而不是一直到 的整个执行状态main()。带分隔符的延续严格来说比未分隔的延续更强大 ( http://okmij.org/ftp/continuations/undelimited.html ),后者被认为“没有实际用处”( http://okmij.org/ftp/continuations/against- callcc.html)。

  • Multi-prompt:Continuations 可以嵌套,并且在调用堆栈中的任何地方,任何封闭的 continuations 都可以被挂起。这类似于 try/catch 块的嵌套,并抛出某种类型的异常,将堆栈展开到最近的处理它的catch而不仅仅是最近的 catch。嵌套延续的一个例子是在虚拟线程中使用类似 Python 的生成器。生成器代码可以做一个阻塞 IO 调用,这将挂起封闭线程的延续,而不仅仅是生成器:https : //youtu.be/9vupFNsND6o?t=2188

  • 一次性/不可重入:每次我们继续一个暂停的延续时,它的状态都会发生变化,我们不能从同一个暂停状态多次继续它(即我们不能回到过去)。这与可重入延续不同,每次我们暂停它们时,都会返回一个表示特定暂停点的新的不可变延续对象。即延续是一个时间点,每次我们继续它时,我们都会回到那个状态。可重入的延续严格来说比不可重入的更强大;即他们可以做一些完全不可能的事情,只需一次连续即可。

  • Cloneable:如果我们能够克隆一次性延续,我们可以提供与可重入延续相同的能力。即使每次我们继续它时延续都会发生变化,我们可以在继续创建该时间点的快照之前克隆它的状态,以便稍后返回。


Aiui continuations 没有直接暴露在 Raku 中,所以可能与 Raku 相关的正确答案(与 Rakudo 相对)是“没有延续”。但这对我来说并不清楚,所以在下文中,如果我很幸运,我会在其中描述我希望答案中的内容,我会假装在 Raku 的上下文中谈论它们是有道理的和乐堂是两个截然不同的领域。

这是我想象的那种答案是可能的(尽管我只是有点疯狂地猜测实际情况):

  • “作为“100 年”语言设计,Raku当前的底层语义 [执行?] 模型至少需要无 …

rakudo delimited-continuations raku

14
推荐指数
1
解决办法
344
查看次数

Raku 正则表达式:不一致的最长令牌匹配

Raku 的正则表达式预计将匹配最长的令牌。

事实上,在这段代码中可以看到这种行为:

raku -e "'AA' ~~ m/A {say 1}|AA {say 2}/"
# 2
Run Code Online (Sandbox Code Playgroud)

但是,当文本在变量中时,它的工作方式似乎不同:

raku -e "my $a = 'A'; my $b = 'AA'; 'AA' ~~ m/$a {say 1}|$b {say 2}/"
# 1
Run Code Online (Sandbox Code Playgroud)

为什么他们以不同的方式工作?有没有办法使用变量并仍然匹配最长的令牌?

regex rakudo regex-alternation raku

14
推荐指数
1
解决办法
182
查看次数

Raku/Rakudo 包含哪些持久数据结构?

Raku 提供了许多不可变的类型,因此在创建后无法修改。直到我最近开始研究这个领域,我的理解是这些类型不是 持久数据结构——也就是说,与 Clojure 或 Haskell 中的核心类型不同,我相信 Raku 的不可变类型没有利用结构共享来允许廉价的副本。我认为该语句my List $new = (|$old-list, 42);从字面上复制了 中的值$old-list,而没有持久数据结构的数据共享功能。

但是,由于以下代码,我对我的理解的描述是过去时:

my Array $a = do {
    $_ = [rand xx 10_000_000];
    say "Initialized an Array in $((now - ENTER now).round: .001) seconds"; $_}
my List $l = do {
    $_ = |(rand xx 10_000_000);
    say "Initialized the List in $((now - ENTER now).round: .001) seconds"; $_}
do { $a.push: rand;  
     say "Pushed the element to …
Run Code Online (Sandbox Code Playgroud)

functional-programming immutability rakudo raku

14
推荐指数
1
解决办法
269
查看次数