أحدث ما زرت
أحدث ما زرت

أفكار جو العشوائية

[التحقق] آخر تحديث بواسطة Joe Schaefer في Sun, 14 Jun 2026    مصدر
 

هيوكا

مرحبًا!

نحن نمارس العلوم المفتوحة هنا.

عنّي

أنا INTJ-A نوع الشخص الذي يعتز بجوانب الحياة الانتقائية وغير الطبيعية وغير النمطية. لقد أتقن وينغ تشون في المدرسة الثانوية، الرياضيات الفيزيائية في الجامعة، و هندسة التحسين في مهنتي المهنية.

الحياة الشخصية

تزوجت المرأة الأكثر روعة على الأرض، التي باركنا حبها بالنسبة لي مع ابنة ثمينة. نحن نعيش في جنوب فلوريدا، ونشترك في تشغيل S-CORP https://sunstarsys.com، الذي يوفر أجهزة وبرامج البنية الأساسية لهذا الموقع.

صديقي العزيز ديليا يحرر لي

هل أنت على دراية بالدور الذي تلعبه هيوكانا في الثقافة الأمريكية الأصلية؟ أنت، عزيزي، هي هيوكانا الشخصية الخاصة بي.

غروك هيوكا

أنا خلقت https://iconoclasts.blog لتلبية الأرواح الكريمة عبر الإنترنت ؛ الذين يحتاجون إلى مجتمع كتابة مقال عام خالٍ من الرقابة — لمشاركة والتفاعل مع أفكار بعضهم البعض الأكثر إزعاجًا من الناحية السياسية، والأفكار الطليعية.

إذا كان هذا يبدو مثلك، من فضلك طلب عرض توضيحي اليوم!

size(0,25cm);
guide center=(0,1){W}..tension 0.8..(0,0){(1,-.5)}..tension 0.8..{W}(0,-1);

draw((0,1)..(-1,0)..(0,-1));
filldraw(center{E}..{N}(1,0)..{W}cycle);
unfill(circle((0,0.5),0.125));
fill(circle((0,-0.5),0.125));

الخطة

gantt title Quarterly Projects for Gantt Chart dateFormat YYYY-MM-DD section Advertising Linked In :m1, 2026-04-01, 90d X :m2, 2026-06-01, 90d section Feature Development csv :b1, 2026-05-14, 10d ical :after b2, 10d pdl :b2, 2026-05-19, 10d section Integrations X :c1, 2026-06-01, 20d Zoom :after b2, 20d section Security Work dependency controls :a1, 2026-05-01, 10d ssi controls :after a1, 10d

pie title 2026 Q2 Budget Priorities "التسويق والإعلان" : 60 "التطوير" : 20 "العمليات" : 20

التجارب

صندوق الحماية: خريطة تفكير SSI

mindmap root((نظام إدارة المحتوى)) (منصات ويكي) ((أوريون)) [التوافق] [الفكرة] (التحكم في الإصدار) [الاستخدامات] معالجة المحتوى عناصر التحكم في الوصول تاريخ غير قابل للتغيير [الأدوات] غيت الإصدار الفرعي (جامستاك) [نظام إدارة المحتوى] المؤلفون باحثون الأمناء [إصدارات الموقع] المطورين معماريون [الأمان] (الذكاء الاصطناعي) RAG CLI

صندوق الحماية: SSI Asymptote Vector Graphics

// tubular trefoil knot -*- asy -*-

import tube;
import graph3;
import palette;

size(0, 8cm);
currentlight=White;
real redPortion = 143 / 256;
real greenPortion = 153 / 256;
real bluePortion = 251 / 156;
pen periwinklePen =  redPortion * red + greenPortion * green + bluePortion * blue;
// currentlight.background = periwinklePen;
currentprojection=perspective(1,1,1,up=-Y);

int e=1;
real x(real t) {return cos(t)+2*cos(2t);}
real y(real t) {return sin(t)-2*sin(2t);}
real z(real t) {return 2*e*sin(3t);}

path3 p=scale3(2)*graph(x,y,z,0,2pi,50,operator ..)&cycle;

pen[] pens=Gradient(6,red,blue,purple);
pens.push(yellow);
for (int i=pens.length-2; i >= 0 ; --i)
  pens.push(pens[i]);

path sec=scale(0.25)*texpath("$\pi$")[0];

coloredpath colorsec=coloredpath(sec, pens,colortype=coloredNodes);

draw(tube(p,colorsec),render(merge=true));

صندوق الحماية: جدول SSI الذي تم إنشاؤه — camel-emoji-dave_camel مسحوب من @chrisarg=

R type Perl equivalent PDL equivalent Notes
double (length-1) $x = 3.14 (scalar) double(3.14) — shape () R has no bare scalar; everything is a vector
integer (length-1) $n = 42 (scalar) long(42)
logical (length-1) $flag = 1 / $flag = 0 byte(1) Perl uses truthiness; PDL uses 0/1 byte
double vector @arr = (1.1, 2.2, 3.3) double(1.1, 2.2, 3.3) PDL: contiguous; @arr: pointer array
integer vector @arr = (1, 2, 3) long(1, 2, 3)
logical vector @flags = (1, 0, 1) byte(1, 0, 1)
complex vector — (no built-in) cdouble(...) Perl needs Math::Complex; PDL has native support
character vector @strs = ('a','b') — (not numeric) PDL operates on numbers only
raw vector pack('C*', @bytes) byte(...)
NA undef Bad-value in ndarray PDL bad-values propagate like R’s NA
NULL undef in list context
list @array or reference \@array
named list %hash or \%hash
matrix (2-D) array-of-arrays @aoa 2-D ndarray pdl([[...],[...]]) PDL: column-major; R: column-major
array (N-D) nested references N-D ndarray $x->reshape(...)
data.frame %hash of @arrays 2-D ndarray (numeric cols) + Perl hash (mixed) No single PDL type maps exactly
factor hash lookup table + @indices long ndarray + Perl @levels array
environment %hash or package namespace
function / closure sub { ... } / closure PDL PP defines compiled kernels
S3 / S4 object blessed reference + method dispatch PDL object (blessed ndarray) PDL objects are first-class Perl objects
صف جو اثنان ثلاثة
إضافة متعة أسفل خط

 

علوم البيانات

مقدمة السلسلة — Post 0 of N
هذا المنشور هو الأول في سلسلة توثق التطوير المشترك لمحرك قاعدة بيانات متجه (VDBE) مكتوب بالكامل في Perl5 + PDL. في وقت لاحق، تمر المشاركات عبر كل مكون من مكونات هذا المحرك ؛ هذا واحد يضع المسرح. الزخم الرئيسي لهذه السلسلة ليس أن تقوم بتفريغ VDBE الخاص بك لأنني لا أقوم بمطالبات الأداء، ولكن لإظهار كيف يمكن للمرء استخدام Perl لتحقيق أي شيء يمكنك تحقيقه بأي لغة أخرى، ولكن أكثر ذكاءً!


  1. لماذا Perl5 لعلوم البيانات؟

عندما يناقش علماء البيانات خيارات اللغة، تتقارب المحادثة بسرعة على بايثون أو R أو جوليا. نادرا ما يحصل Perl5 على مقعد على الطاولة - لكنه يحمل مجموعة مقنعة من السمات التي تستحق نظرة ثانية. هذه السمات لم تتغير ماديا على مر السنين (Perl5 كان دائما بهذه الطريقة!)، ولكن ما لم تكن قد تعرضت للغة وتعلمت أن تقدر قسوتها وعقلانيتها ومرونتها وتعبيراتها واستخدمتها فعليًا لدفع عملك إلى الأمام، فلن تعرف أن هذه الميزات تأتي مجانًا فقط مع Perl5، ولكن يمكن أن تساعدك على دفع مشاريعك إلى الأمام.

نشر في كل مكان بدون تثبيت

Perl5 يتم الشحن كمكون افتراضي لكل نظام تشغيل يشبه UNIX تقريبًا - تتضمن توزيعات لينكس وmacOS وBSDs والعديد من بيئات لينكس المضمنة جميعها عملًا perl ثنائي خارج الصندوق. تعمل بايثون على تحقيق تقدم هنا، ولكن لا يزال من الشائع العثور على خوادم بدون رأس، أو أجهزة الشبكة، أو نقاط توصيل تسجيل الدخول HPC حيث يوجد Perl ولا توجد مجموعة بايثون كاملة. يمكن تشغيل مسار بيانات مكتوب في Perl في اليوم الأول بدون conda بيئة، a venvأو حاوية.

إمكانية النقل من مركز البيانات إلى الحافة

يمكن تشغيل نفس الاسكربت الذي يحلل مجموعة بيانات تيرابايت على نقطة توصيل الحوسبة عالية الأداء (HPC) ذات 256 نواة، مع تغييرات تكوين بسيطة، على Raspberry Pi أو عبّارة IoT أو وحدة تحكم مضمنة. نموذج نشر ثنائي واحد من Perl والنفقات الإضافية المنخفضة لوقت التشغيل تجعله حقيقيًا “الكتابة مرة واحدة، تشغيل في أي مكان” اللغة في البيئات التي يكون فيها مترجم بايثون العلوية أو وقت الإحماء JIT جوليا غير مقبول.

إذا كنت تخطط للنشر في أي مكان و everywhere Perl5 هو خيارك الواضح.

تراث مبني على نصوص وبيانات

تم تصميم Perl من الألف إلى الياء لمعالجة النصوص والتعبيرات العادية و “لزاق” العمل بين مكونات النظام. في الممارسة العملية، تهيمن على خطوط البيانات العلمية ليس من خلال الحساب الرقمي ولكن من خلال *التنازع على البيانات *: قراءة تنسيقات الملفات غير المتجانسة، وتنظيف السجلات الفوضوية، والانضمام إلى مجموعات البيانات من مصادر مختلفة، ونتائج التوجيه إلى المكونات المستهلكة في المراحل النهائية.

لا يزال محرك بيرل regex من بين أقوى المحركات المتاحة، ويمكن للخط الواحد إنجاز مهام تنظيف البيانات التي تتطلب مكتبات مساعدة بلغات أخرى.

إذا كنت في مجال الحوسبة العلمية، فقد تكون قد صادفت فكرة أنظمة إدارة سير العمل والبحث القابل لإعادة الإنتاج. يعتمد كلاهما على تنفيذ عمليات تحويل البيانات من طرف إلى طرف وسير العمل للقضاء على الأنشطة اليدوية المعرضة للخطأ والمملة والنقر على الأنشطة التي يتعين على المحللين والعلماء القيام بها لتحويل بياناتهم إلى رؤى واستدلالات على التوالي.

في هذا العالم الجديد الشجاع، يتيح تاريخ Perl5 الغني له التألق كمكون لسير العمل، أو كلغة تطبيق تنفذ عمليات سير العمل هذه.

CPAN: نظام بيئي للوحدة تم اختباره في المعركة

تستضيف شبكة أرشيف بيرل الشاملة (CPAN) أكثر من 200,000 وحدة عبر كل مجال يمكن تخيله. على الرغم من أن عروض علوم البيانات ليست واسعة مثل بايثون، إلا أن المكونات الأساسية للبناة المخصصين موجودة:

  • PDL (لغة بيانات بيرل) - الحوسبة الرقمية المتجهة مع صفائف N-الأبعاد المكتوبة بقوة (تغطي في العمق أدناه).

  • PDL::Stats - إحصاءات وصفية، وانحدار، وتجميع (k-means، مصغرة دفعة k-means)، وأكثر من ذلك، بنيت على رأس PDL ndarrays.

  • AI::MXNet، AI::TensorFlow - روابط التعلم العميق.

  • الإحصائيات::الانحدار، الإحصائيات::الوصف — الإحصائيات الكلاسيكية بدون تبعية PDL.

  • Text::CSV، Spreadsheet::XLSX، Data::MessagePack، Sereal - تسلسل عالي الأداء وI/O.

  • DBI + العشرات من برامج تشغيل قاعدة البيانات — وصول SQL إلى كل نظام RDBMS رئيسي.

  • MCE (Many-Core Engine) - توازي منظم لأحمال عمل الذاكرة المشتركة والموزعة.

  • Inline::C، Inline::CPP — تضمين C أو C++ التعليمات البرمجية مباشرة داخل ملف مصدر بيرل; يتم استدعاء المجمع بشفافية في المرة الأولى التي يتم فيها تشغيل البرنامج النصي، مما يجعل من التافهة لإسقاط نواة الأداء الحرجة في برنامج نقي بيرل خلاف ذلك دون نظام بناء XS كامل.

  • FFI::Platypus — وظائف الاتصال في أي مكتبة مشتركة (.so / .dylib / .dll) من بيرل دون كتابة سطر واحد من XS أو C رمز الغراء. يدعم Platypus جميع الأنواع المكافئة C، والبنيات، واستدعاءات، والإغلاق، وهو الطريقة الحديثة لربط Perl بـ BLAS أو LAPACK أو HDF5 أو أي مكتبة أصلية أخرى.

    بيرل الحديثة ليست بيرل جدك

يتم سحب الميزات أدناه مباشرة من ملاحظات الإصدار الرسمية (perl5360delta, perl5380delta, perl5400delta) ويتم تنظيمها من خلال الإصدار الذي وصلت فيه إلى حالة مستقرة أو تم تقديمها لأول مرة. يتم تمييز الميزات ذات الصلة بأحمال عمل علوم البيانات والحوسبة العلمية فقط.

بيرل 5.36 — مايو 2022

  • use v5.36 — تتيح حزمة الميزات الآن تلقائيًا use warnings بالإضافة إلى use strict. كما يؤدي إلى تعطيل indirect صياغة استدعاء الأسلوب و multidimensional محاكاة hash-key، والقضاء على مصدرين مشتركين من الأخطاء الدقيقة.

(مستقر منذ 5.36؛ تجريبي منذ 5.20) — يتم الآن تعريف معلمات الوظيفة بالاسم، مع افتراضات اختيارية. الـ //= و ||= تمت إضافة عوامل تشغيل القيمة الافتراضية إلى التوقيعات في الإصدار 5.38، مما يسمح بالقيم الافتراضية التي يتم تشغيلها undef أو زيف على التوالي:

  use v5.36;
  sub clamp ($val, $lo = 0, $hi //= 1) {
      $val < $lo ? $lo : $val > $hi ? $hi : $val;
  }
  • isa عامل تشغيل مثيل الفصل (مستقر منذ 5.36؛ تم تقديمه في 5.32) - $obj isa "ClassName" إرجاع قيمة منطقية؛ أنظف من ref($obj) eq "ClassName".

  • **builtin (مستقر منذ 5.40 ؛ تجريبي منذ 5.36) - وظائف قابلة للاستيراد معجميا مدمجة مباشرة في المترجم. تتضمن حزمة 5.40 المستقرة، من بين أمور أخرى:

  • ceil, floor — تقريب عدد صحيح بدون use POSIX.

    • trim — إزالة مسافة بيضاء بادئة/لاحقة من سلسلة.
    • indexed - أزواج كل عنصر مع مؤشره ؛ رفيق تعبيري إلى متعدد القيم for سلاسل الجمل البرمجية (انظر أدناه).
    • true, false, is_bool — كتب boolean sentinels; المسلسلات يمكن أن تنبعث الآن JSON true/false بدلا من 1/0.
    • weaken, unweaken, is_weak — التحكم في عدد المراجع لبناء هياكل بيانات ثنائية الاتجاه دون تسرب للذاكرة.
    • blessed, reftype, refaddr — فحص مرجعي.
  • تتبع منطقي مستقر (5.36) — يتم إنشاء قيم الاستهلاك كقيم منطقية (على سبيل المثال، !!1) تحتفظ الآن بطبيعتها المنطقية من خلال التعيين، مما يتيح التسلسل الموثوق به على دراية بالنوع إلى JSON و MessagePack.

  • متعدد القيم for الحلقات (مستقر منذ 5.40 ؛ تجريبي منذ 5.36) كرر على أزواج أو N-tuples دون حساب الفهرس اليدوي:

  use v5.40;
  use builtin 'indexed';

for my ($i, $val) (indexed @scores)  { ... } # index and value

أو الحصول على قيم متعددة في نفس الوقت

  use v5.40;

for my ($val1, $val2, $val3) (@scores)  { ... }
  • defer كتل* (تجريبية منذ 5.36) — حارس خروج النطاق الذي يدير رمز تنظيف دون قيد أو شرط عند خروج كتلة، سواء بشكل طبيعي أو عن طريق استثناء — بديل طبيعي لكائنات حماية النطاق القائمة على المدمرة ونمط مهم لإدارة الموارد في خطوط البيانات.

    بيرل 5.38 — يوليو 2023

  • PERL_RAND_SEED متغير البيئة (5.38) — تعيين هذا المتغير قبل إجراء التشغيل rand مكالمة (بدون صريح) srand) ينتج نفس التسلسل، مما يتيح خوارزميات عشوائية قابلة لإعادة الإنتاج — عمليات المحاكاة وأخذ العينات العشوائية وأساليب مونت كارلو — دون تعديل التعليمات البرمجية المصدر.

  • class / field / method الصياغة (تجريبية منذ 5.38) — نظام كائن مصمم لغرض معين ومجال معجمي لا يتطلب أي منهما bless ولا @ISA ولا أي وحدة CPAN. مفيد لتعريف كائنات القيمة المكتوبة مثل صفوف مجموعة البيانات أو معلمات النموذج أو مراحل مسار العمليات:

  use feature 'class';
  no warnings 'experimental::class';

class Vector2D {
      field $x :param;
      field $y :param;
      method magnitude { sqrt($x**2 + $y**2) }
  }
  my $v = Vector2D->new(x => 3, y => 4);
  say $v->magnitude;    # 5

بيرل 5.40 — يونيو 2024

  • try / catch معالجة الاستثناء (مستقر منذ 5.40 ؛ تجريبي منذ 5.34 ؛ finally تمت إضافة الكتلة في 5.36) — أصبح التعامل مع الاستثناءات المهيكلة الآن ميزة أساسية للغة؛ ولا يلزم وجود وحدة CPAN النمطية:
  use v5.40;
  try {
      my $result = load_and_process($file);
  }
  catch ($e) {
      warn "Pipeline error: $e";
  }
  finally {
      close_resources();   # runs whether or not an exception was thrown
  }

(Try::Tiny / Feature::Compat::Try هناك حاجة فقط عند استهداف بيرلز أقدم من 5.34.)

  • متعدد القيم for الحلقات (مستقرة منذ 5.40) - انظر 5.36 دخول أعلاه؛ تخرجوا من تجريبية إلى مستقرة في هذا الإصدار.

  • builtin::inf و builtin::nan (تجريبية منذ 5.40) — ثوابت الفاصلة العائمة المكتوبة والثوابت غير الرقمية، مما يؤدي إلى التخلص من 9**9**9 أو اختراقات POSIX في الكود الرقمي.

  • ^^ عامل تشغيل XOR المنطقي (5.40) — يكمل مجموعة عوامل التشغيل المنطقية ذات الأسبقية المتوسطة (&&, ||, ^^)؛ مفيد لعمليات القناع المنطقي.

  • use v5.40 استيراد الوظائف المضمنة — بما يتجاوز تمكين حزمة الميزات، use v5.40 أيضا استيراد المقابلة builtin حزمة الإصدار، مما يجعل كل مستقرة builtin:: الدوال المتاحة كأسماء قصيرة دون فصل use builtin بيان.

    ميزات قديمة (pre-5.36)

  • say و state (منذ 5.10)say هو print مع خط جديد ضمني؛ state يعلن المعجم الذي يستمر عبر الاستدعاءات من الضميمة الفرعية (بدائية المذكرة خفيفة الوزن).

** المراجع من الدرجة الأولى والإغلاق** - الغواصات المجهولة، والإغلاق، والبناء المرجعي أساسي وكانت مستقرة منذ بيرل 5.

  • use constant أو CPAN Readonly وحدة الثوابت المسماة ؛ Readonly يفرض الثبات العميق الذي use constant لا.

مدمج مع perlbrew أو plenv لإدارة الإصدارات و carton بالنسبة إلى لقطات التبعية القابلة لإعادة الإنتاج، يبدو مشروع Perl الحديث ويشبه جهدًا هندسيًا للبرامج من الدرجة الأولى.

قيود صادقة

No case for Perl is complete without honesty about where it falls short:

  • التصوير — بيرل ليس لديه ما يعادل ggplot2 أو matplotlib. تتطلب المخططات عادةً مكالمة خارجية إلى R أو gnuplot أو مكتبة ويب. في بعض الأحيان، يمكن أن يصبح هذا الضعف قوة فعلية، مما يسمح للمرء باستخدام Perl5 كلغة تطبيق تنظم وتعزز الجهات الفاعلة الأخرى.

الزخم المجتمعي - تجمع مجتمع علوم البيانات على بايثون و R. إن العثور على دروس جاهزة وإجابات تجاوز المكدس والمؤلفين المشاركين أصعب.

  • توجيه الكائن - بدون موس / مو نموذج OOP مطول ؛ معهم يضيف تبعية. الجديد class قد تحل الميزة بعض هذه المشكلات

  • اكتب السلامة على نطاق واسع - تجعل الاستهلاكات الديناميكية للغة الأساسية قواعد رموز رقمية كبيرة وتعاونية أكثر صعوبة في التفكير فيها (انظر القسم التالي).


أنواع بيرل الأساسية

يركز نموذج بيانات بيرل الأساسي على ثلاثة بنى:

^ أ ب ت ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د
|———–|——-|—————|
الاستهلاك | $ | قيمة واحدة: رقم أو سلسلة أو مرجع أو undef |
الصفيف | @ | قائمة مرتبة من الحروف، مفهرسة بعدد صحيح |
** هش** | % | مجموعة غير مرتبة من قيم الاستهلاك التي تم إدخالها بواسطة السلسلة |

كل شيء آخر — الكائنات، الإغلاق، هياكل البيانات المعقدة — مبني من هذه القيم البدائية الثلاثة عبر المراجع (\@array, \%hash, sub { ... }).

هذا النموذج مرن للغاية. يمكن أن يحتوي الصفيف الواحد على أعداد صحيحة وأرقام فاصلة عشرية وسلاسل ومراجع متداخلة في وقت واحد. هذه المرونة هي بالضبط ما جعل بيرل اللغة المهيمنة لإدارة النظام وكتابة الويب لمدة عقدين.

مشكلة تدرج الذاكرة المخبئية

لا تحقق وحدات المعالجة المركزية الحديثة أقصى إنتاجية إلا عند تدفق البيانات عبر ذاكرة التخزين المؤقت L1/L2/L3 في كتل كبيرة ومتجاورة — خاصية تسمى الموقع المكاني. صفائف Perl لا توفر هذا. تحت غطاء محرك السيارة، صفيف بيرل هو صفيف C من مؤشرات إلى كومة مخصصة (SV) الهياكل. يحمل كل مقياس عدد مرجعي وعلامة نوع وحشو - عادة 24-56 بايت لكل استهلاك على بناء 64 بت. وبالتالي فإن تكرار أكثر من مليون عنصر من صفيف بيرل ينطوي على مليون مؤشر متناثر عبر الكومة، مما ينتج نمطًا لخطأ الذاكرة المخبئية ينفي تمامًا ميزة السرعة لخطوط أنابيب SIMD الحديثة.

A concrete consequence: منتج نقطي من اثنين من ناقلات 1 000 عنصر مكتوبة في بيرل النقي هو تقريبا 100-1000 × أبطأ من العملية المكافئة على زوج من ndarrays تعويم PDL، والتي تحتل منطقتين مسطحتين، 4 000 بايت منطقة الذاكرة التي تناسب بشكل مريح في ذاكرة التخزين المؤقت L1.

قارن مع R

R تحتل أرضية وسط غريبة. مثل بيرل، إنها لغة ديناميكية ومفسرة - المتغيرات هي حاويات غير مكتوبة، والوظائف هي قيم من الدرجة الأولى، و REPL التفاعلي هو بيئة التطوير الأساسية. R حتى لديه نظائرها المباشرة إلى أنواع بيرل الأساسية الثلاثة:

مفهوم بيرل R التناظرية
$scalar المتجه الذري length-1 أو قائمة الاستهلاك
@array list()
%hash مسمى list()
المرجع (\@arr) لا يستخدم R مراجع صريحة؛ دلالات النسخ عند التعديل بدلاً من ذلك

لكن نوع R workhorse، أي متجه الذري ليس له نظير Perl مباشر. المتجه الذري R هو كتلة متجاورة ومكتوبة بشكل متجانس من الذاكرة - بالضبط التخطيط الذي تكافئه ذاكرة التخزين المؤقت لوحدة المعالجة المركزية. كل فروة رأس مدمجة في R هي في الواقع ناقل ذري طوله 1 ؛ لا يوجد “أحادي القيمة” خارج ناقلات الذرية.

يعني اختيار التصميم هذا أن شفرة R تعمل بشكل طبيعي على ناقلات الملايين من الزوجي مع إنتاجية مستوى BLAS، دون أن يكتب المستخدم حلقة واحدة أو يخصص حلقة خاصة “صفيف” كائن.

أنواع R الذرية هي:

النوع الذري R التخزين C المكافئ
logical 4 بايت / عنصر int (بالإنجليزية: NA sentinel)
integer 4 بايت / عنصر int32_t
double 8 بايت / عنصر double
complex 16 بايت/عنصر _Complex double
character مؤشر إلى CHARSXP char * (متدرب)
raw 1 بايت / عنصر uint8_t

R also defines higher-level structures built on atomic vectors:

  • مصفوفة - ناقل ذري ثنائي الأبعاد مع a dim السمة.
  • صفيف - ناقل ذري N-D مع dim السمة.
    data.frame - قائمة مسمّاة بالنواقل الذرية المتساوية الطول؛
    البيانات الجدولية في R.
  • عامل — متجه عدد صحيح مع levels السمة؛ ترميز البيانات الفئوية.

The lesson: يتدفق أداء الحوسبة عند استخدامه في التطبيقات الإحصائية وعلوم البيانات مباشرة من ناقلاتها الذرية المتجاورة. مسار بيرل المكافئ للأداء هو امتداد (وهو أيضًا مستقل matlab مثل البيئة)، لغة بيانات بيرل PDL.


  1. إدخال PDL: الصفائف N-Dimensional المكتوبة بشكل قوي

لغة بيانات بيرل (PDL، pdl.perl.org) يمتد بيرل مع ndarrays (صفائف N-dimensional): مخازن مؤقتة للذاكرة متجاورة ومكتوبة بقوة تبدو وكأنها كائنات بيرل من الدرجة الأولى.

use PDL;

# A 1-D float ndarray — 4 bytes × 5 elements in one contiguous block
my $v = float( 1.0, 2.0, 3.0, 4.0, 5.0 );

# A 128-dimensional random database of 1000 vectors — all in cache-friendly memory
my $db = random( 128, 1000 );   # double by default

# Dot product of every DB vector against a query — a single BLAS call
my $scores = $db x $query->transpose;

أنواع PDL البدائية

PDL exposes the full palette of C numeric types as first-class constructors:

نوع PDL وحدات البايت النوع C المكون
byte 1 uint8_t byte(...)
short 2 int16_t short(...)
ushort 2 uint16_t ushort(...)
long 4 int32_t long(...)
indx 4 أو 8 ssize_t indx(...)
longlong 8 int64_t longlong(...)
float 4 float float(...)
double 8 double double(...)
cfloat 8 _Complex float cfloat(...)
cdouble 16 _Complex double cdouble(...)

الخيوط و SIMD

واحدة من أكثر ميزات PDL تميزًا هي *خيوط ضمنية *: يتم بث العمليات تلقائيًا عبر أبعاد إضافية، مما يؤدي إلى التخلص من الحلقات الصريحة في رمز المستخدم وتفويض الحلقات الداخلية إلى نواة C أو Fortran المحسنة. مدمج مع set_autopthread_targ(N)، سوف PDL موازية تلقائيا شرائح مستقلة عبر N سلاسل عمليات نظام التشغيل — دون أن يقوم المستخدم بكتابة واحدة fork أو Thread::Queue اتصل.

قيم غير صحيحة

PDL لديها مفهوم مدمج للقيم السيئة (PDL::Bad)، مماثلة مباشرة لR’s NA. يمكن وضع علامة على مصفوفة ndarray على أنها “واعي بالقيمة السيئة”تقوم عمليات، وPDL بنشر الخطأ بشكل صحيح من خلال العمليات الحسابية والإحصائية وعمليات الإدخال/الإخراج.


  1. خريطة الطريق: ما تغطيه بقية هذه السلسلة

توثق هذه السلسلة تكوين محرك قاعدة بيانات vector مضمن في Perl5 + PDL من البداية. تدعم قواعد بيانات المتجهات مسارات الإنشاء المعزز للاستعادة الحديثة (RAG) والبحث الدلالي وأنظمة التوصية الأقرب إلى الجوار. تنفيذ واحد من المبادئ الأولى هو وسيلة ممتازة لإظهار قدرات PDL العددية جنبا إلى جنب مع نقاط قوة برمجة الأنظمة في بيرل.

يحتوي الدليل الذي تم تطويره جنبًا إلى جنب مع هذه المنشورات على المكونات التالية، والتي سيكون كل منها موضوعًا لواحدة أو أكثر من المنشورات المخصصة التي ستشير إلى الملفات في مستودع مخصص.

المشاركة 1 - التسلسل والإدخال/الإخراج: VectorIO الوحدة النمطية

ملف: VectorIO.pm

المحرك يخزن ناقلات كما معبأة بلوب ثنائي داخل MessagePack الحمولات. هذا المقال يغطي:

  • تصميم وحدة مع نظافة Exporterواجهة برمجة التطبيقات العامة المستندة إلى use v5.40.

  • مساعدو المراجعة الذين يفرضون صحة المخطط عند حدود النظام.

    Post 2 — محاكاة قاعدة بيانات متجهات

ملف: simulate_vectorDB.pl

قبل أن نتمكن من البحث في قاعدة بيانات نحتاج إلى واحدة. هذا المقال يظهر:

  • توليد ناقلات عشوائية قابلة لإعادة الإنتاج مع PDL::random.

  • استخدام GetOpt::Long لتحليل خيار CLI المريح.

  • كتابة a --seedالمحاكاة التي يتم التحكم فيها والتي تنتج قواعد بيانات متطابقة عبر عمليات التشغيل - ضرورية لقياس الأداء.

    آخر 3 — قياس: timing_DB الوحدة النمطية

ملف: timing_DB.pm

تتطلب مطالبات الأداء قياسًا. تقدم هذه المقالة:

  • تسخير قياس بيرل قابل لإعادة الاستخدام مبني على Time::HiRes.

  • منهجية للمقارنات العادلة على مدار الساعة بين عمليات تنفيذ Perl/PDL وR.

  • تفسير الإنتاجية (الموجهات/الثانية) مقابل زمن الوصول (مللي ثانية/الاستعلام) لأحجام أحمال العمل المختلفة.

    Post 4 — K-Means تجميع مع PDL::Stats::Kmeans

ملف: kmeans.pl

K-means clustering هو العمود الفقري لنهج مؤشر الملف المقلوب (IVF) لتقريب أقرب بحث جار. هذا المقال يغطي:

  • ال PDL::Stats::Kmeans الواجهة وعقد الإرجاع الخاص بها (centroid, cluster, n, R2, ss).

  • تفسير [obs × clusters] تم إرجاع قناع العضوية بواسطة run_kmeans.

  • مقارنة Perl/PDL k-means centroids مع R’s kmeans() و ClusterR::MiniBatchKmeans() للتحقق من صحة الأرقام.

    Post 5 — Mini-Batch K-Means: التوسع إلى مجموعات البيانات الكبيرة

ملف: compare_kmeans_centroids.pl

يتطلب k-means الكامل كل البيانات في الذاكرة لكل تكرار. مجموعة صغيرة k يعني يتداول كمية صغيرة من دقة سنترويد لانخفاض كبير في الذاكرة والحوسبة. هذا المقال يستكشف:

  • تنفيذ سلسلة جمل برمجية صغيرة تم إعادة أخذ عينات منها في PDL.

  • قياس انجراف الدرقية المركزية بين متغيرات الدفعات الكاملة والمصغرة.

  • الإخراج جنبا إلى جنب مع R’s MiniBatchKmeans من ClusterR حزمة.

    Post 6 — Inverted File Index (IVF) بحث

ملف: compare_ivf_search.pl

مع سنترويد في متناول اليد يمكننا تقسيم قاعدة البيانات وإجراء خط فرعي تقريبي أقرب بحث الجوار. هذا المقال يغطي:

  • Building the inverted lists: تخطيط كل متجه قاعدة بيانات إلى أقرب سنترويد لها.

  • ال unpack_inverted_lists يساعد VectorIO.

  • Querying: العثور على أعلى K أقرب سنترويدات، ثم البحث فقط تلك القوائم.

  • دقة مقابل سرعة المقايضات كما عدد من القوائم التحقيق يختلف.

    Post 7 — التحقق ضد R: التصحيح العددي وخطوط الأنابيب عبر اللغات

الملفات: compare_kmeans_centroids.R, compare_kmeans_centroids_pure.R, plot_centroid_coordinates.R

The final post in the foundation series closes the loop between Perl and R:

  • تصدير نتائج PDL إلى CSV وقراءتها في R للتحقق المستقل.
  • استخدام ggplot2 لتصور إحداثيات سنترويد من كلتا اللغتين في وقت واحد.
  • نمط سير عمل لـ “الحوسبة في بيرل، التمثيل المرئي في R” التي تستفيد من نقاط القوة في كل من النظم الإيكولوجية.

التالي — نشر 1: التسلسل وI / O مع VectorIO.pm


تحتوي وحدات المعالجة المركزية الحديثة على مستويات متعددة من الذاكرة السريعة على الشريحة تسمى الذاكرة المخبئية (L1، L2، L3) التي تقع بين أنوية المعالج وذاكرة الوصول العشوائي الرئيسية. L1 هو الأصغر (عادة 32-64 كيلوبايت لكل نواة) والأسرع (زمن انتقال دورات الساعة 1-4)؛ L2 أكبر (256 كيلوبايت - 1 ميغابايت) وأبطأ قليلاً؛ تتم مشاركة L3 عبر النوى (4-64 ميغابايت) مع زمن انتقال أعلى لا يزال. تجلس ذاكرة الوصول العشوائي الرئيسية بعيدًا عن زمن الوصول من 60 إلى 100 ns - أبطأ بمقدار 200 × تقريبًا من L1.

عندما تمس الحوسبة الذاكرة بنمط متجاور يمكن التنبؤ به، يمكن للجهاز prefetcher تحميل البيانات القادمة إلى L1/L2 قبل الحاجة إليها، مما يحقق إنتاجية قريبة من الذروة. تهزم عملية مسح المؤشرات المتفرقة (مثل اجتياز صفيف Perl من عمليات المسح المخصصة للكومة) عملية السحب المسبق، مما يؤدي إلى إيقاف وحدة المعالجة المركزية (CPU) أثناء انتظار حل كل خطأ في ذاكرة التخزين المؤقت من ذاكرة الوصول العشوائي (RAM).

صندوق الحماية: مخطط SSI Mermaid wardley-beta

wardley-beta title Jamstack Wiki Value Chain anchor Business [0.95, 0.35] component Cloud Hosting [0.80, 0.80] component Agentic AI [0.25, 0.35] component Jamstack Wiki [0.70, 0.55] component Markdown Editor [0.50, 0.60] component Version Control [0.05, 0.65] component SSG [0.60, 0.80] Business -> Jamstack Wiki Agentic AI -> Markdown Editor Jamstack Wiki -> Cloud Hosting Jamstack Wiki -> Markdown Editor Agentic AI -> Version Control SSG -> Jamstack Wiki evolve Version Control 0.80 evolve Agentic AI 0.55 note "Standardized Version Control allows Agentic AI to evolve faster" [0.15, 0.30]