SPVM اکنون از برنامه نویسی شی گرا در پرل پشتیبانی می کند
SPVM اکنون از برنامه نویسی شی گرا در پرل پشتیبانی می کند.
یکی از اهداف SPVM تحقق برنامه نویسی شی گرا در Perl به عنوان یک زبان تایپ ایستا است.
برای دستیابی به این هدف، لازم بود که برنامهنویسی شیگرا در پرل را به درستی درک کنیم و سپس ببینیم که چگونه میتوان آن را در یک زبان تایپ استاتیک، از طریق تعدادی پیادهسازی، تحقق بخشید.
اولین چالش این است که هیچ کس نمی داند که آیا می توان آن را انجام داد یا نه، زیرا هیچ زبان برنامه نویسی تا به حال برنامه نویسی شی گرا پرل را در یک زبان تایپ ایستا درک نکرده است.
این وظیفه ای است که ما حتی نمی دانیم می توانیم انجام دهیم یا خیر.
ما داشتیم به روش شی گرا پرل برای انجام کارها نزدیک می شدیم، اما آزمون و خطاهای زیادی وجود داشت و سازگاری با عقب را شکست.
شنبه و یکشنبه گذشته، من به آخرین قطعه رسیدم که SPVM را در پرل شی گرا می کرد. و این همان چیزی است که من این دوشنبه اجرا کردم. سپس آن را روی SPVM::File::Spec و SPVM::IO اعمال کردم.
لطفاً کد منبع را بخوانید و خواهید دید که شی گرایی SPVM را می توان دقیقاً به همان شیوه شی گرایی پرل توصیف کرد.
بررسی اجمالی شی گرایی SPVM
برای درک شی گرایی SPVM، Point3D و Point مثال های خوبی هستند. Class::Accessor(::Fast)، پیاده سازی های Moose/Moo-based، Mojo::Base پیاده سازی، و پیاده سازی هایی با استفاده از bless. احساس شخصی من این است که در 90٪ مواقع، اینها راحت ترین پورت ها به SPVM هستند.
class Point {
# Interfaces
interface Stringable;
interface Cloneable;
# Fields
has x : rw protected int;
has y : rw protected int;
# Class methods
static method new : Point ($x = 0 : int, $y = 0 : int) {
my $self = new Point;
$self->init($x, $y);
return $self;
}
# Instance methods
protected method init : Point ($x = 0 : int, $y = 0 : int) {
$self->{x} = $x;
$self->{y} = $y;
}
method clear : void () {
$self->{x} = 0;
$self->{y} = 0;
}
method clone : Point () {
my $self_clone = Point->new($self->x, $self->y);
return $self_clone;
}
method to_string : string () {
my $x = $self->x;
my $y = $self->y;
my $string = "($x,$y)";
return $string;
}
}
class Point3D extends Point {
# Fields
has z : rw protected int;
# Class method
static method new : Point3D ($x = 0 : int, $y = 0 : int, $z = 0 : int) {
my $self = new Point3D;
$self->init($x, $y, $z);
return $self;
}
protected method init : Point3D ($x = 0 : int, $y = 0 : int, $z = 0 : int) {
$self->SUPER::init($x, $y);
$self->{z} = $z;
}
method clear : void () {
$self->SUPER::clear;
$self->{z} = 0;
}
method clone : Point3D () {
my $self_clone = Point3D->new($self->x, $self->y, $self->z);
return $self_clone;
}
method to_string : string () {
my $x = $self->x;
my $y = $self->y;
my $z = $self->z;
my $string = "($x,$y,$z)";
return $string;
}
}
پشتیبانی از پیوند نمادین
همانطور که هفته گذشته اشاره کردیم، این هفته روی یک پیوند قابل حمل و نمادین کار می کنیم که روی ویندوز نیز کار می کند. شما می توانید پیشرفت ما را در اینجا ببینید. برای پیاده سازی این، کد منبع Perl win32/win32.c بسیار قدردانی می شود.
هنگامی که پیوندهای نمادین کار می کنند، می توانیم به قابلیت حمل و نقل زیادی بین Windows/Linux/Mac دست پیدا کنیم. من مشتاقانه منتظر پیاده سازی مرورگری هستم که روی Windows/Mac/Linux/Android/iPhone/iPad همراه با SPVM کار می کند. هدف من این است که در عرض 5 سال یک بازی کارآمد داشته باشم.
ترجمه شده با www.DeepL.com/Translator (نسخه رایگان)