develooper Front page | perl.perl5.porters | Postings from August 2023

PPC Elevator Pitch for Perl::Types

Thread Previous | Thread Next
Oodler 577 via perl5-porters
August 16, 2023 04:37
PPC Elevator Pitch for Perl::Types
Message ID:
# Proposed Perl Changes Elevator Pitch for Perl::Types

This document is the first step in the Proposed Perl Changes process:

Respectfully submitted by the _Perl::Types Committee_:
* Will Braswell (WBRASWELL), Co-Founder & Chairman
* Brett Estrade (OODLER), Co-Founder & 1st Vice Chairman
* Zakariyya Mughal (ZMUGHAL), Co-Founder & 2nd Vice Chairman
* John Napiorkowski (JJNAPIORK)
* Darren Duncan (DUNCAND)
* Nedzad Hrnjica (NHRNJICA)
* Rohit Manjrekar (MANJREKAR)
* Paul Millard (MAGUDAS)
* Joshua Day (HAX)
* Tyler Bird (BIRDTY)
* Robbie Hatley (HATLEYSFT)
* David Warner (WESTBASE)
* Daniel Mera (DMERA)
* Duong Vu (DVU)
* Rajan Shah (RSHAH)

## Here is a problem

Perl lacks sufficient exposure of the already-existing real natural
Perl data types for use by the programmer.  This has lead to false
claims that the Perl interpreter "has no data types".  This has
also lead to countless programmer-hours spent devising synthetic
or unnatural type systems that rely entirely on fuzzy data guessing
via regular expressions, etc.

Fortunately, the Perl compiler already provides the capability to
expose the underlying real native C data types which can be used
by Perl programmers to incrementally improve performance, eventually
achieving the full native speed of compiled C code.  Among other
features, the Perl compiler also enables real natural data type
checking with identical behavior in both dynamic (intrepreted) mode
and static (compiled) mode.

The data type subsystem of the Perl compiler is currently in the
process of being extracted and refactored as an independant CPAN
distribution called `Perl::Types`.  This distribution provides new,
core capabilities and thus should be included in the Perl core
distribution as a "Dual-Life" module.

## Here is the syntax that we're proposing

The Perl interpreter already has an unused slot in the grammar for
this very purpose:

`my TYPE $var;`

The Perl interpreter and the Perl compiler already provide the
basic data types to be used in the grammar slot above:

* `boolean` (`SV` when `SvIsBOOL(sv)` is true, new in 5.36)
* `integer` (`IV`)
* `number` (`NV`)
* `string` (`PV`)
* `array` (`AV`) & `arrayref` (`RV(AV)`)
* `hash` (`HV`) & `hashref` (`RV(HV)`)
* user-defined classes

Custom data structures are declared with compound or nested data
types composed from the basic types above, for example:

* `integer::arrayref`
* `integer::arrayref::arrayref`
* `integer::arrayref::hashref`
* `integer::arrayref::arrayref::hashref`
* `string::arrayref`
* `MyClass::arrayref`
* etc.

Attempting to utilize incompatible data types gives the same behavior
and same errors in both interpreted mode and compiled mode, for

use Perl::Types;

sub squared {
    { my number $RETURN_TYPE };
    ( my number $base ) = @ARG;
    return $base ** 2;

squared(2);     # FINE
squared(2.3);   # FINE
squared(to_number('2'));  # FINE
my number $foo = 23;
squared($foo);  # FINE

squared();      # ERROR ENVxx, TYPE-CHECKING MISMATCH: number value expected but ...
squared('2');   # ERROR ENVxx, TYPE-CHECKING MISMATCH: number value expected but ...
my string $bar = 'howdy';
squared($bar);  # ERROR ENVxx, TYPE-CHECKING MISMATCH: number value expected but ...
squared([2]);   # ERROR ENVxx, TYPE-CHECKING MISMATCH: number value expected but ...

The syntax for arrays and hashes is similarly straightforward:
sub multiply_array {
    { my number::arrayref $RETURN_TYPE };        
    ( my integer $input_integer, my number::arrayref $input_array ) = @ARG;
    my number::arrayref $output_array = [
        $input_integer * $input_array->[0],
        $input_integer * $input_array->[1],
        $input_integer * $input_array->[2]
    return $output_array;

sub multiply_hash {
    { my number::hashref $RETURN_TYPE };        
    ( my integer $input_integer, my number::hashref $input_hash ) = @ARG;
    my number::hashref $output_hash = {
        a => $input_integer * $input_hash->{a},
        b => $input_integer * $input_hash->{b},
        c => $input_integer * $input_hash->{c}
    return $output_hash;

## Here are the benefits of this

The primary benefit of including `Perl::Types` in the Perl core
distribution is that it will provide a greatly-needed capability
of exposing the underlying C-level data types and data structures
to every Perl programmer, so they may utilize Perl data types to
achieve a number of benefits including but not limited to:

* increased performance
* code correctness
* type safety (type checking)
* memory safety (bounds checking)
* documentation of code intent
* potential for polymorphism
* potential for derived or synthetic types

Additionally, this foundational support for enabling Perl data
types at the interpreter level will allow for the creation of
synthetic or unnatural data types and data structures to be built
on top of `Perl::Types` itself.  For example, the capabilities
provided in `Perl::Types` are necessary for any effort to introduce
real natural type checking constraints related to Perl's new `class`

## Here are potential problems

Because the Perl interpreter has already implemented both the real
natural Perl data types, as well as the required `my TYPE $var`
syntax construct, we therefore do not foresee the introduction of
any significant issues by including `Perl::Types` in the Perl core

The largest barrier to adoption for the Perl compiler is the need
for numerous non-Perl dependencies, such as the C++ compiler and
other libraries.  This barrier will be completely removed for the
`Perl::Types` distribution, due to being refactored out of the
compiler distribution and removal of all non-core dependencies.

On Behalf of the _Perl::Types Committee_,
Brett Estrade 

SDF-EU Public Access UNIX System - #openmp #pdl #native

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About