Current priorities and future plans for PerlOnJava. See the Changelog for release history and the Feature Matrix for detailed feature support.
- Current Project Status
- Guiding Principles
- Recently Completed
- Current Priorities
- Objective 1: Language Correctness & Perl5 Alignment
- Objective 2: Java Platform Alignment
- Objective 3: Ecosystem & Module Compatibility
- Objective 4: Performance & Optimization
- Objective 5: Developer Tooling
- Objective 6: Concurrency & Runtime Isolation
- Objective 7: Distribution & Packaging
- Exploratory / Research
- Features Intentionally Deferred
PerlOnJava is actively developed and is in its compatibility and performance phase. The broad Perl language implementation and JVM runtime are in place. The project is not finished, frozen, or limited to critical fixes: development now concentrates on the long tail of language compatibility, real-world CPAN support, and runtime efficiency.
The latest measured snapshots are:
- Imported upstream Perl tests: 669,688 of 673,847 checks pass across 585 imported test files (99.4%), measured on 2026-09-03. This is the imported compatibility corpus, not every test distributed with upstream Perl.
- CPAN sample: 8,315 of 16,443 tested modules pass their complete test suites (50.6%), as reported on 2026-09-02. Modules are selected randomly from the CPAN index, and dependencies encountered during testing are also recorded.
These figures are dated progress measurements, not guarantees that an individual script or distribution will work. Check the Feature Matrix for language boundaries and the current CPAN compatibility report for module results. The testing guide explains how the project calculates these measurements.
Current development has three primary goals:
- Close the remaining upstream Perl compatibility gaps and keep both execution backends aligned.
- Broaden CPAN coverage and fix reusable compiler, runtime, tooling, and Java-backed XS blockers.
- Reduce CPU time, memory use, and startup overhead without sacrificing correctness.
Bug reports, reproducible CPAN test results, benchmarks, documentation fixes, and pull requests are welcome; see the support guide and contribution guide.
- Perl5 compatibility first — nail language correctness, then leverage JVM advantages
- Java platform alignment — follow JDK evolution, use standard APIs, publish to Maven Central
- Ecosystem over features — working CPAN modules matter more than exotic new capabilities
- Dual-backend architecture — JVM bytecode for performance, interpreter for flexibility
- Measure progress — track the imported upstream Perl suite and sampled CPAN results with dated, reproducible measurements
These capabilities are implemented and available in the current release:
-
Dual Compilation Backends — JVM bytecode (via ASM) and a fast register-based interpreter that share the same runtime. The interpreter handles large code blocks and fast eval-string compilation. See
dev/design/interpreter.md. -
CPAN Client (
jcpan) — Install, test, and manage pure-Perl CPAN modules. Working with DateTime (99.7% tests), Log::Log4perl (98.9% tests), Moo, Template, DBIx::Class, and many others. See Using CPAN modules and Patch and CPAN prefs layout. -
Bundled Moose 2.4000 and Class::MOP — the upstream Moose source tree ships in the JAR. Used as the runtime dependency for installing CPAN modules — for example
DBIx::Class0.082843 (which usesMoo, fetched from CPAN) passes 100% of its test suite under PerlOnJava. Upstream Moose's own tests pass ~99%. See bundled modules anddev/modules/moose_support.md. -
Java XS Fallback Mechanism —
XSLoader::loadtransparently loads Java implementations for modules that normally use C XS code (e.g., DateTime, DBI, Digest::MD5, Digest::SHA). Seedev/design/xs_fallback.md. -
Perl Debugger (
-d) — Interactive debugger with breakpoints, step/next/return, stack traces, expression evaluation. See Feature Matrix — Perl Debugger. -
classKeyword — Full support forclass,method,field,:param,:reader,:isa,ADJUSTblocks, lexical method calls. -
deferBlocks —use feature 'defer'with LIFO execution, exception safety, and all exit mechanisms. Seedev/design/defer_blocks.md. -
Overload Pragma — Arithmetic, comparison, string, dereference, and regex overloading. Method name resolution for
overload::nilpattern. See Feature Matrix — overload. - DBI with JDBC — Full DBI API backed by JDBC drivers. See Feature Matrix — DBI.
-
I/O Subsystem — Sockets, I/O layers (
:raw,:utf8,:crlf,:encoding()), in-memory files, pipes, file descriptor duplication,flock, tied handles. -
Multiplicity and Perl ithreads — Mutable interpreter state is owned by
PerlRuntime;Configadvertisesuseithreads,usethreads, andusemultiplicity. The bundledthreads,threads::shared,Thread::Queue, andThread::Semaphoredistributions pass unchanged on both backends and both Java carrier policies. See the Perl threads reference. -
Native regex implementation — The maintained Joni fork is the sole
production matcher across both backends, including dynamic regex programs,
bounded recursion, variable-length lookbehind, grapheme clusters, advanced
Unicode properties, control verbs, and lexical
repolicy. See the regex feature matrix. -
Native Async/Await — The bundled
Future::AsyncAwaitimplementation supports suspension, resumption, cancellation, signatures,defer, andCANCELblocks; all 52 upstream files and 221 assertions pass. -
Pack/Unpack — Full template support for binary data manipulation. See
dev/design/pack_unpack_architecture.md. - Subroutine Prototypes and Signatures — All prototype characters supported; formal parameter signatures implemented.
-
format/write— Report generation withformlineand$^Aaccumulator. -
SBOM Generation — CycloneDX Software Bill of Materials for both Java and Perl dependencies. See
dev/design/sbom.md. -
JSR-223 Script Engine —
ScriptEngine,ScriptEngineFactory, andCompilable/CompiledScriptinterfaces implemented. Compile-once, execute-many viaPerlCompiledScriptwith MethodHandle invocation. ServiceLoader auto-discovery. - CI/CD Pipeline — GitHub Actions testing on Ubuntu and Windows.
-
Startup Performance — Lazy initialization of expensive JNA calls (
$( and $ ) variables). Seedev/design/pr328-startup-performance.md. -
FFM Migration — Replaced JNR-POSIX with Java's Foreign Function & Memory API (JEP 454), eliminating
sun.misc.Unsafewarnings on Java 24+. Migratedchmod,kill,stat,lstat,link,fcntl,isatty,getpwnam,umask,waitpid, and other POSIX calls. Seedev/design/ffm_migration.mdand PR #380. -
Docker Image — Multi-stage
Dockerfilewith Eclipse Temurin JDK 24. Includesjperl,jcpan,jperldoc,jprovein/usr/local/bin. -
Debian Package —
.debpackaging via Gradleospackageplugin (make deb). Installs to/opt/perlonjavawith symlinks in/usr/local/binand bundled SBOM.
Work currently in progress is organized around the compatibility and performance goals above:
- Perl compatibility — Close incomplete and failing cases in the imported upstream suite, including diagnostic, compiler, runtime, and standard-library differences, while keeping the JVM and interpreter backends aligned. The Feature Matrix records known boundaries.
- CPAN compatibility — Use sampled distribution results to find reusable blockers, expand Java replacements for XS dependencies, and validate representative applications and libraries.
- CPU and memory performance — Profile real workloads, remove allocation and dispatch hot spots, reduce startup overhead, and retain correctness gates for every optimization.
Priority: High — These items directly affect compatibility with existing Perl code.
— Implemented with selective reference counting. Supports cascading destruction, closure capture tracking, and global destruction phase.DESTROYSupportWeak References— Implemented:Scalar::Util::weaken/isweak/unweakenwith external WeakRefRegistry.Taint Mode (— Implemented on both backends. External input is marked tainted, taint propagates through supported operations, capture-based untainting works, and security-sensitive operations reject tainted values. Warning-mode-T)-tsemantics remain incomplete. Seedev/design/TAINT_MODE.md.
The maintained Joni fork is the sole production matcher. Current supported capability families and their narrow diagnostic or representation boundaries are recorded in the Feature Matrix; the implementation and delivery record is preserved in the regex implementation plan.
no strict refs— Extend to work with lexical (my) variables, not just globals.bignum/bigint— Complete transparent arbitrary-precision arithmetic on both backends.bigratis implemented.locale— Locale-aware string operations.attributes— Variable and subroutine attributes beyond:lvalueandprototype.overloading— Fine-grained overload control pragma.COREOperator References —\&CORE::pushand similar.- Smartmatch /
given/when— Evaluate community demand before implementing.
-
— Lexical compile-time state and extended$^H,%^H, and${^WARNING_BITS}snapshotscallerfields are implemented on both backends. Exact compatibility for every pragma-specific mutation and warning bit remains ongoing. -
Extended— The full 11-element return fromcallerinfocaller($level)is implemented on both backends.
Priority: Ongoing platform stewardship.
Publish PerlOnJava as a Maven artifact so Java developers can embed it as a dependency. See dev/design/maven-central-publishing.md.
- Add POM metadata:
<description>,<licenses>,<developers>,<scm>. - Generate sources JAR and Javadoc JAR.
- Set up GPG signing and Central Portal account.
- Claim
org.perlonjavanamespace.
The core JSR-223 ScriptEngine, ScriptEngineFactory, and Compilable/CompiledScript interfaces are implemented. Remaining gaps:
- Implement
Invocablefor calling individual Perl subs from Java (invokeFunction,invokeMethod). - Respect
ScriptContextI/O bindings — redirect Perl stdout/stderr tocontext.getWriter()/context.getErrorWriter(). - Bridge
Bindingsto Perl variables — pass Java-side bindings into the Perl runtime as globals. - Declare
THREADINGparameter inScriptEngineFactory.getParameter()(currently returnsnull). - Thread-safety via configurable global lock or runtime isolation (depends on Objective 6 Multiplicity).
See dev/design/jsr223-perlonjava-web.md.
PerlOnJava requires Java 24+. Remaining work:
- Test and document compatibility with JDK 24 and future releases.
- Ensure CI runs against multiple JDK versions.
- Track JDK deprecations that affect PerlOnJava (e.g.,
sun.misc.Unsaferemoval timeline).
Priority: High — Working CPAN modules drive adoption more than any other factor.
- File::stat — Needed for DateTime::Locale installation.
- Safe.pm — Move beyond stub; evaluate feasibility of compartment restrictions on JVM.
- Module::Build — Improve support beyond current stub for modules that don't use MakeMaker.
- Test::Harness — Fix UTF-8 handling for test output parsing.
- Exporter — Support
*globexports.
The goal is 100% test suite pass rate for representative CPAN modules used as adoption benchmarks: DateTime, Log::Log4perl, Moo, Image::ExifTool, Try::Tiny, Path::Tiny, and JSON::PP.
Extend the Java XS fallback mechanism to more modules:
- List::Util / Scalar::Util — Java implementations for performance-critical functions.
- Encode — Leverage Java's
Charsetfor encoding operations. - Storable — Java serialization backend.
- Clone — Deep clone using Java reflection.
Ensure seamless installation of key pure-Perl modules via jcpan:
- Text::CSV, YAML::PP, JSON, HTTP::Tiny, URI, MIME::Base64 (already working).
- Expand to: Path::Tiny, Try::Tiny, Type::Tiny, Specio, namespace::clean.
Priority: High — Runtime efficiency is a current development focus alongside correctness.
- Superoperators — Combine frequent multi-instruction sequences into single optimized opcodes (e.g.,
DEREF_HASH + LOAD_STRING + HASH_GET). Seedev/design/superoperators.md. - Inline Constant Subroutines — Fold constant sub calls at compile time.
- Eval-String Heuristic — Switch to interpreter mode when the same eval site is called with different strings repeatedly.
- Inline
map/grepBlocks — Avoid subroutine call overhead for simple blocks. - Prefetch Named Subroutines — Resolve frequently called subs to direct references.
- Buffer Pooling — Reuse
ByteBufferinstances in I/O operations. - I/O Layer Optimization — Extract buffering into a dedicated layer for better throughput.
Introduce a normalization pass between parsing and code generation to eliminate parity issues between the JVM and interpreter backends. See dev/design/shared_ast_transformer.md.
- Context resolution, lvalue analysis, and variable resolution done once in the AST.
- Both backends consume a fully-annotated, normalized AST.
- Eliminates the class of bugs caused by duplicated compilation logic.
- Profile and reduce JVM cold-start overhead for CLI scripts.
- Evaluate CDS (Class Data Sharing) and AOT caching for frequently-used modules.
- Investigate GraalVM native image when
SupportRuntimeClassLoadingbecomes available.
- Maintain a benchmark suite comparing PerlOnJava vs. native Perl for key workloads.
- Track performance over time to catch regressions.
Priority: Medium — Improves developer experience and adoption.
- Conditional Breakpoints —
b line condition. - Watch Expressions —
w expr. - Command History — JLine integration for readline support.
- Custom Debugger Modules —
-d:Modulesupport. perl5db.plCompatibility — Enable existing Perl debugger scripts.
- IntelliJ IDEA Plugin — Syntax highlighting, run configurations, debugger integration.
- VSCode Extension — Language server, syntax highlighting, inline diagnostics.
- Command history and JLine-based line editing.
- Tab completion for variables, functions, and module names.
- Result history variables.
- Migration Guide — What works, what doesn't, what's different from native Perl.
- Java Interop Cookbook — Examples of calling Java from Perl via XSLoader.
- Embedding Guide — JSR-223 integration patterns for Java applications.
- Feature Matrix — Keep Feature Matrix current as the canonical compatibility reference.
Priority: Compatibility and ecosystem hardening.
See dev/design/concurrency.md for the comprehensive design covering multiplicity, fork emulation, and threads.
Multiple independent PerlRuntime instances and snapshot cloning are
implemented. The bounded PSGI runtime pool is opt-in and replaces returned app
snapshots from an authoritative template; it does not partially reset and reuse
an entered runtime. Multiplicity alone does not make one JSR-223 engine or one
captured PSGI app concurrently callable.
Implement fork() via runtime cloning + thread. Currently returns undef.
- Support common fork patterns:
if (fork() == 0) { ... exit; }. - Deep-copy runtime state for child "process".
- True OS-level fork remains impossible on JVM.
Perl ithreads are shipped: snapshot-based variable isolation, lifecycle and
signals, nested threads and child exit, threads::shared graphs and proxies,
locks and conditions, Thread::Queue, and Thread::Semaphore. Java 24 virtual
threads are the default; platform carriers remain selectable.
Remaining work:
- Keep the permanent PR and release matrices green.
- Broaden CPAN/native ecosystem coverage, including opt-in Test2 and Moose thread suites and Net::SSLeay callback stress.
- Track direct regex-language/Joni work in the regex implementation plan while thread wrappers preserve the behavior of their direct companions.
Priority: Long-term — Lowers the barrier to adoption.
Docker image and Debian .deb package are already available (see Recently Completed). Remaining work:
- Windows — MSI installer via
jpackagewith bundled JRE, PATH setup, Start Menu shortcuts. Seedev/design/windows_installer.md. - macOS — Homebrew formula or DMG package.
- Linux —
.rpmpackage; evaluate Snap or Flatpak.
- Publish Docker image to Docker Hub or GitHub Container Registry.
- Add variant with common CPAN modules pre-installed.
- Homebrew tap for macOS.
- Evaluate SDKMAN! for JVM-centric distribution.
- Chocolatey package for Windows.
These items require further investigation before committing to implementation.
- GraalVM Native Image — Currently blocked by
SupportRuntimeClassLoadingnot being available. Monitor GraalVM releases. The interpreter mode may work with native image. Seedev/design/graalvm.md. - Modular Extensions — ServiceLoader-based plugin system for Java-implemented Perl modules distributed as separate JARs. See
dev/design/dynamic_loading.md. - Foundation Incubation — Evaluate Apache Software Foundation or The Perl Foundation for governance, sustainability, and enterprise credibility. See
dev/design/incubating.md. - Polyglot Integration — Investigate GraalVM Truffle for interop with JavaScript, Python, Ruby.
- Log4j/SLF4J Integration — Bridge Perl
warn/dieto Java logging frameworks for enterprise observability. Inline::JavaEquivalent — Direct Perl-to-Java interoperability for calling arbitrary Java APIs from Perl code.
These features are unlikely to be implemented due to fundamental JVM constraints or low demand:
- True
fork()— JVM cannot split into two OS processes. Fork emulation via threads is planned instead. - Perl XS (C code) — C extensions cannot run on JVM. Java XS fallback mechanism is the replacement strategy.
dumpoperator — Core dump functionality has no JVM equivalent.- DBM file support —
dbmclose/dbmopennot implemented; use DBI instead. - Source filters beyond the supported subset — Closure filters installed
through
Filter::Util::Call,Filter::Simple::FILTER, andFILTER_ONLYwork. Object/method filters and Perl-compatible incremental streaming remain deferred; seedev/design/source_filters.md. Opcode.pm— Requires Perl opcode tree internals that don't exist in PerlOnJava's compilation model.