Native Modules#
PetaPerl does not support XS (C extensions). Instead, performance-critical CPAN modules are reimplemented natively in Rust. These ”native modules“ provide the same Perl-level API as their XS counterparts but integrate directly with PetaPerl’s runtime — enabling JIT compilation, auto-parallelization, and zero FFI overhead.
How It Works#
When you write use List::Util qw(sum min max), PetaPerl’s module loader detects that List::Util has a native implementation and registers Rust function pointers directly. There is no compilation step, no .so loading, and no XS glue code.
Native functions are dispatched via NativeFn — a direct function pointer with O(1) call overhead, identical to built-in operators.
Available Native Modules#
Core Utilities#
Module | Functions | Notes |
|---|---|---|
Scalar::Util | blessed, reftype, refaddr, weaken, isweak, looks_like_number, … | Full API |
List::Util | sum, min, max, first, any, all, none, reduce, … | MULTICALL optimized |
Sub::Util | subname, set_subname | |
Hash::Util | lock_keys, lock_hash, … |
Digest / Crypto#
Module | Functions | Notes |
|---|---|---|
Digest::MD5 | md5, md5_hex, md5_base64, OO interface | Full API |
Digest::SHA | sha1, sha256, sha512, OO interface | Full API |
MIME::Base64 | encode_base64, decode_base64 | |
MIME::QuotedPrint | encode_qp, decode_qp |
File / System#
Module | Functions | Notes |
|---|---|---|
File::Basename | basename, dirname, fileparse | |
File::Copy | copy, move | |
File::Find | find, finddepth | |
File::Glob | bsd_glob | |
File::Path | make_path, remove_tree | |
File::Spec | catdir, catfile, rel2abs, … | |
File::Temp | tempfile, tempdir | OO + functional |
File::stat | stat (OO) | |
Cwd | cwd, getcwd, abs_path | |
Sys::Hostname | hostname |
I/O#
Module | Functions | Notes |
|---|---|---|
IO::File | OO file handle | |
IO::Handle | OO handle base | |
IO::Dir | OO directory handle | |
IO::Pipe | OO pipe handle | |
IO::Select | select wrapper | |
IO::Socket | OO socket handle | |
IO::Seekable | seek/tell mixin | |
FileHandle | Legacy OO handle | |
Socket | socket primitives |
Data / Encoding#
Module | Functions | Notes |
|---|---|---|
Data::Dumper | Dumper | |
Storable | freeze, thaw, nstore, retrieve | |
Encode | encode, decode, find_encoding | |
JSON::PP | encode_json, decode_json | Via Pure Perl |
Numeric / Math#
Module | Functions | Notes |
|---|---|---|
POSIX | floor, ceil, fmod, strtod, strftime, … | Subset |
Math::GMP | Arbitrary precision integers | Via Peta::FFI::GMP |
Build / Config#
Module | Functions | Notes |
|---|---|---|
Config | %Config hash | Build configuration |
Fcntl | O_RDONLY, O_WRONLY, … | Constants auto-loaded |
Errno | ENOENT, EACCES, … | Constants auto-loaded |
Introspection#
Module | Functions | Notes |
|---|---|---|
B | Compiler backend introspection | Minimal |
PadWalker | peek_my, peek_our | |
mro | get_linear_isa, set_mro | |
version | Version object handling | Full OO API |
Performance#
Native modules run at the same speed as built-in operators since they share the same dispatch mechanism. For block-taking functions (first, any, all, reduce), PetaPerl uses MULTICALL optimization to avoid per-element subroutine call overhead.
Benchmarks (vs perl5 with XS):
Function | PetaPerl native | perl5 XS | Ratio |
|---|---|---|---|
List::Util::sum | 1.7x faster | baseline | |
List::Util::min/max | 2.9x faster | baseline | |
List::Util::first | ~1x | baseline | MULTICALL parity |
Adding Native Modules#
Native module documentation is extracted from the module’s Rust source (//! module docs and /// function docs) by docs/sphinx/bin/02-reference during the docs build.