我正在使用基于Windows上的MoarVM构建的perl6版本.我创建了一些perl6文件,并希望将其编译为exe.我尝试了以下方法:
perl6 --target=MAST r.pl>r
Run Code Online (Sandbox Code Playgroud)
现在我想将r编译为可执行文件
我找到了这个链接,讨论如何使用Parrot,但我正在使用MoarVM目标:http://perlgeek.de/blog-en/perl-6/my-first-executable.writeback
我的问题如何将MoarvVM目标文件编译为Windows可执行文件?
我正在使用IO :: Socket :: Async在P6中重写我的P5套接字服务器,但收到的数据在结尾处被截断1个字符,并且在下一个连接上收到1个字符.来自Perl6 Facebook组的人(Jonathan Worthington)指出,这可能是由于字符串的性质和字节在P6中的处理方式截然不同.引:
在Perl 6中,字符串和字节的处理方式截然不同.值得注意的是,字符串在字形级别上起作用.接收Unicode数据时,不仅可能将多字节序列分组,还可以分割多码点序列.例如,一个数据包的末尾可能包含字母"a",而下一个数据包可能是组合的重音符号.因此,它不能安全地传递"a",直到看到下一个数据包如何开始.
我的P6正在MoarVM上运行
use Data::Dump;
use experimental :pack;
my $socket = IO::Socket::Async.listen('0.0.0.0', 7000);
react {
whenever $socket -> $conn {
my $line = '';
whenever $conn {
say "Received --> "~$_;
$conn.print: &translate($_) if $_.chars ge 100;
$conn.close;
}
}
CATCH {
default {
say .^name, ': ', .Str;
say "handled in $?LINE";
}
}
}
sub translate($raw) {
my $rawdata = $raw;
$raw ~~ s/^\s+|\s+$//; # remove heading/trailing whitespace
my $minus_checksum …Run Code Online (Sandbox Code Playgroud) 在呐喊下奔跑(2016.10)
考虑构造一个集合并测试成员资格的代码:
my $num_set = set( < 1 2 3 4 > );
say "set: ", $num_set.perl;
say "4 is in set: ", 4 ? $num_set;
say "IntStr 4 is in set: ", IntStr.new(4, "Four") ? $num_set;
say "IntStr(4,...) is 4: ", IntStr.new(4, "Four") == 4;
say "5 is in set: ", 5 ? $num_set;
Run Code Online (Sandbox Code Playgroud)
直接4不在集合中,但IntStr版本是:
set: set(IntStr.new(4, "4"),IntStr.new(1, "1"),IntStr.new(2, "2"),IntStr.new(3, "3"))
4 is in set: False
IntStr 4 is in set: True
IntStr(4,...) is 4: …Run Code Online (Sandbox Code Playgroud) raku -version 这是基于实施 Perl 6.d 的 MoarVM 2020.01.1 版构建的 Rakudo 2020.01 版。
目前看起来我无法启动任何运行时间低于 130 毫秒(主要是启动时间)的 Raku Perl6 程序。
- Raku 总是在程序启动时重新解析完整的源代码吗?
- Raku 缓存任何字节码吗?
- 所以即使是在线运行也总是需要 >= 130 毫秒?
time raku --stagestats hello_world.pl
Stage start : 0.000
Stage parse : 0.133
Stage syntaxcheck: 0.000
Stage ast : 0.000
Stage optimize : 0.002
Stage mast : 0.006
Stage mbc : 0.001
Stage moar : 0.000
hello world
hello world
TEST
hello world
real 0m0,183s
user 0m0,231s
sys 0m0,016s
Run Code Online (Sandbox Code Playgroud) 我想知道如何调试 Moarvm 字节码。是否有文档描述例如如何将 raku 转换为 moarvm 以及如何转储生成的字节码。如果我尝试运行:
rakudo-m --target=mbc c.p6
===SORRY!===
Cannot dump this object; no dump method
Run Code Online (Sandbox Code Playgroud)
我在某处读到了“--dump”开关,但这似乎不可用。我从 github 自定义编译 rakudo/nqp/moarvm。
我必须对大约200万行数据进行数据分析,每行大约250字节.总共大约500兆字节的数据.我在带有4G内存的Virtualbox Linux上运行最新的Rakudo.
大约8个小时后,由于内存不足,我得到了MoarVM的恐慌.如何为MoarVM提供更多内存?不幸的是,由于部分数据分析需要整个2米的行,所以我不能将2百万分成块并写入文件.
非常感谢你 !!!
lisprog
我想知道是否可能只有预编译模块或某种 MoarVM 字节码。这个想法是在某个级别保护源代码 - 至少我不想在纯文本中
我正在编写一个使用 的库NativeCall,如果能够Hash从导出函数返回 Raku 对我来说会非常方便。我怎样才能做到这一点?
例如,在 Ruby 中,如果我想Hash从 C 返回 a,我会这样做:
#include "ruby.h"
VALUE make_hash() {
VALUE hash = rb_hash_new();
return hash;
}
Run Code Online (Sandbox Code Playgroud)
我有兴趣看看这是否可以完成,我在想也许我需要使用 MoarVM 标头或其他东西。但我不确定。
我想做的是编写一个 C 函数,它接受一个 String 来做一些事情,然后返回一个 Raku 哈希。
我有一个使用IO :: Socket :: Async和Redis :: Async进行消息发布的套接字服务器.只要服务器收到消息,脚本就会转换消息并生成确认消息以发送回发送方,以便发送方发送后续消息.由于翻译消息非常昂贵,因此脚本将在"start"方法下运行该部分.但是,我注意到Moar进程正在运行我的RAM.有什么想法我应该在哪里解决这个问题?谢谢!
use v6;
use Data::Dump;
use experimental :pack;
use JSON::Tiny;
use Redis::Async;
constant $SOCKET_PORT = 7000;
constant $SOCKET_ADDR = '0.0.0.0';
constant $REDIS_PORT = 6379;
constant $REDIS_ADDR = '127.0.0.1';
constant $REDIS_AUTH = 'xxxxxxxx';
constant $IDLING_PERIOD_MIN = 180 - 2; # 3 minutes - 2 secs
constant $CACHE_EXPIRE_IN = 86400; # 24h hours
# create socket
my $socket = IO::Socket::Async.listen($SOCKET_ADDR, $SOCKET_PORT);
# connnect to Redis ...
my $redis;
try {
my $error-code = "110";
$redis …Run Code Online (Sandbox Code Playgroud) 当使用 MoarVM 后端在 Rakudo 上运行 Raku 代码时,是否有任何方法可以从正在运行的程序内部打印有关给定 Str 如何存储在内存中的信息?特别是,我很好奇是否有一种方法,看看有多少钢绞线目前弥补STR(无论是通过乐自省,NQP,或者一些访问MoarVM水平(不这样的话,即使在运行时存在吗?)。
如果在运行时无法访问此信息,是否有办法通过 Rakudo 的命令行标志之一(例如--target, 或 )的输出来获取它--tracing?还是通过调试器?
最后,MoarVM 是否管理给定 Str 中的 Strands 数量?我经常听到(或说)Raku 的超能力之一是可以在 O(1) 时间内索引到 Unicode 字符串,但我一直在考虑病理情况,感觉就像是 O(n) . 例如,
(^$n).map({~rand}).join
Run Code Online (Sandbox Code Playgroud)
似乎它会创建一个长度与$n由$nStrands组成的长度成正比的 Str – 如果我正确理解数据结构,这意味着进入这个 Str 需要检查每个 Strand 的长度,时间复杂度为 O( n)。但我知道可以压平 Strand-ed Str;在这种情况下,MoarVM 会做类似的事情吗?还是我误解了更基本的东西?
也就是说,诸如$*scalar、@*array和 之类的变量%*hash。我问这个问题主要是因为我想了解它们对语法/正则表达式引擎的整体性能有多大负担。
为了使我的问题更加精确,我想知道会发生什么:
查找时,
my $var-1 = $*scalar
my $var-2 = @*array[3]
my $var-3 = %*hash<key>
Run Code Online (Sandbox Code Playgroud)
并在插入时,
$*scalar = "new value 1"
@*array[3] = "new value 2"
%*hash{"existing key"} = "new value 3"
%*hash{"new key"} = "new value 3"
Run Code Online (Sandbox Code Playgroud)
与符号表、调用堆栈或任何涉及的数据结构(例如用于处理动态作用域的特殊堆栈,或者可能是堆栈的哈希表)的关系。
我的主要兴趣是数组和哈希,以及每次我们推送/弹出/修改/插入数组元素或插入/修改/删除哈希的键/值对时它们是否完全重复。
编辑:
我对动态范围的假设是错误的。我认为,当修改动态范围的散列时,更改将在进行更改的词法范围的末尾被撤消,类似于 Perl 中使用关键字及其local关联的“临时堆栈”发生的情况,因此我的“数据结构是否重复?” 问题。但这并不是动态范围的含义。
我的假设是以下 Raku 代码等效于以下 Perl 代码。相反,为了复制 Perl 代码的行为,我们必须执行第二段 Raku 代码的操作。
乐1:
my %*hash = (key => "value");
sub test() { …Run Code Online (Sandbox Code Playgroud) 当我从源安装rakudo时:
$ git clone git@github.com:rakudo/rakudo.git
$ cd rakudo
$ perl Configure.pl --gen-moar --gen-nqp --backends=moar
$ make
$ make install
Run Code Online (Sandbox Code Playgroud)
它生成以下文件./install/bin:
$ ls -1 install/bin
moar
nqp
nqp-m
perl6
perl6-debug
perl6-debug-m
perl6-gdb-m
perl6-lldb-m
perl6-m
perl6-valgrind-m
raku
raku-debug
rakudo
rakudo-debug
rakudo-debug-m
rakudo-gdb-m
rakudo-lldb-m
rakudo-m
rakudo-valgrind-m
Run Code Online (Sandbox Code Playgroud)
我知道raku,rakudo和perl6是用于运行一个命令.raku脚本,但什么是其他命令,我如何使用它们?