لوسيد (لغة برمجة)

لوسيد هي لغة برمجة لتدفق البيانات مصممة لتجربة نماذج البرمجة غير فون نيومان . صممها بيل وادج وإد آش كروفت ووُصفت في كتاب عام 1985 بعنوان لوسيد، لغة برمجة تدفق البيانات . [ 1 ]

كان برنامج pLucid أول مترجم للغة Lucid.

نموذج

تستخدم لوسيد نموذجًا يعتمد على الطلب لحساب البيانات. يمكن فهم كل عبارة على أنها معادلة تحدد شبكة من المعالجات وخطوط اتصال بينها تتدفق البيانات من خلالها. كل متغير عبارة عن تدفق لا نهائي من القيم، وكل دالة عبارة عن مرشح أو محول. تتم محاكاة التكرار بواسطة القيم "الحالية" ومعامل "fby" (يُقرأ "متبوعًا بـ") الذي يسمح بتركيب التدفقات.

تعتمد لغة لوسيد على جبر السجلات، حيث يُمثل السجل سلسلة لا نهائية من عناصر البيانات. عمليًا، يُمكن اعتبار السجل بمثابة سجل لتغير قيم متغير ما، ويمكن فهم عمليات السجل مثل "first" و"next" من خلال أسمائها. صُممت لوسيد في الأصل كلغة منضبطة، رياضية بحتة، تعتمد على عملية إسناد واحدة، مما يُسهل عملية التحقق. مع ذلك، كان لتفسير تدفق البيانات تأثير كبير على مسار تطور لوسيد.

تفاصيل

في لغة لوسيد (وغيرها من لغات تدفق البيانات )، ينتظر التعبير الذي يحتوي على متغير لم يتم ربطه بعد ، حتى يتم ربط هذا المتغير، قبل المتابعة. فعلى سبيل المثال، x + yينتظر تعبير مثل هذا حتى يتم ربط كل من x و y قبل إرجاع ناتج التعبير. ومن أهم نتائج ذلك تجنب الحاجة إلى منطق صريح لتحديث القيم المرتبطة، مما يؤدي إلى تقليل حجم الكود بشكل كبير، مقارنةً باللغات الشائعة.

كل متغير في لغة لوسيد عبارة عن سلسلة من القيم. يُعرّف التعبير n = 1 fby n + 1سلسلة القيم باستخدام المعامل 'fby' ( اختصار لعبارة "متبوعًا بـ"). يُحدد fby ما يأتي بعد التعبير السابق. (في هذه الحالة، تُنتج السلسلة 1، 2، 3، ...). يمكن الوصول إلى القيم في السلسلة باستخدام هذه المعاملات (بافتراض أن x هو المتغير المستخدم):

first x
يسترجع القيمة الأولى في التدفق x،
x
القيمة الحالية للتدفق،
next x
يجلب القيمة التالية في التدفق.
asa
عامل يقوم بشيء ما "بمجرد" تحقق الشرط المعطى.
x upon p
تُعدّ الدالة `uppon` مُعاملًا يُكرّر القيمة القديمة للتدفق x، ويُحدّثها إلى القيم الجديدة فقط عندما يُتيح التدفق p trueقيمةً جديدة. (تُستخدم هذه الدالة لإبطاء التدفق x).

أي: x upon pهل هو التدفق x بقيم جديدة تظهر عند تحقق الشرط p؟

يتم إجراء الحساب عن طريق تحديد المرشحات أو وظائف التحويل التي تعمل على تدفقات البيانات المتغيرة مع الزمن.

أمثلة

مضروب

الوجه أين n = 0 fby (n + 1); fac = 1 fby ( fac * (n + 1) ); نهاية 

متتالية فيبوناتشي

فيبوناتشي أين fib = 0 fby ( 1 fby fib + next fib ); نهاية 

مجموع التسلسل

المجموع أين المجموع = 0 fby المجموع + x نهاية؛ 

متوسط ​​التشغيل

متوسط ​​التشغيل أين المجموع = أول(المدخل) × المجموع + التالي(المدخل)؛ n = 1 fby n + 1; المتوسط_التشغيلي = المجموع / ن؛ نهاية؛ 

الأعداد الأولية

برايم أين prime = 2 fby (n when [[isprime]](n)); n = 3 fby n+1; isprime(n) = not(divs) asa divs or prime*prime > N أين N هو n الحالي؛ divs = N mod prime eq 0; نهاية؛ نهاية 

مخطط تدفق البيانات

فرز سريع

qsort(a) = إذا كان eof(first a) ثم a وإلا اتبع(qsort(b0),qsort(b1)) fi  حيث p = أول a < a; b0 = a كلما كان p؛ b1 = a كلما لم يكن p؛ دالة التتبع (س، ص) = إذا تم تنفيذ س، فقم بتنفيذ ص عند تنفيذ س، وإلا فقم بتنفيذ س. أين xdone = iseod x fby xdone or iseod x; نهاية نهاية 

مخطط تدفق البيانات

 --------> كلما -----> فرز qsort --------- | ^ | | | | | ليس | | ^ | |---> أول | | | | | | | V | | |---> أقل --- | | | | | VV ---+--------> كلما -----> فرز qsort -----> تركيز -------> إذا كان هناك شيء ما -----> | ^ ^ | | | --------> التالي ----> الأول ------> متساوي القياس -------------- | | | ----------------------------------------------------------- 

الجذر التربيعي المتوسط

الجذر التربيعي لمتوسط ​​مربع (أ)) أين مربع(س) = س*س؛ avg(y) = mean أين n = 1 fby n+1; المتوسط ​​= المتوسط ​​الأول y fby + d؛ د = (القيمة ص التالية - المتوسط)/(ن+1)؛ نهاية؛ الجذر التربيعي لـ z = تقريبًا، الخطأ < 0.0001 أين Z هي قيمة z الحالية؛ تقريبًا = Z/2 fby (تقريبًا + Z/تقريبًا)/2؛ err = abs(square(approx)-Z); نهاية؛ نهاية 

مشكلة هامينغ

ح أين h = 1 fby merge(merge(2 * h, 3 * h), 5 * h); دمج(س، ص) = إذا كان س س <= ص ص، فإن س س، وإلا فإن ص ص. أين xx = x عندما يكون xx <= yy؛ yy = y عندما يكون yy <= xx؛ نهاية؛ نهاية؛ 

مخطط تدفق البيانات

مخطط تدفق بيانات مسألة هامينغ
مخطط تدفق بيانات مسألة هامينغ

القصدية والوضوح

من منظور المنطق القصدي [ 2 ] ، يمكن اعتبار لغة لوسيد لغة برمجة متعددة الأبعاد [ 3 ] ، حيث يُعدّ الزمن أحد أبعادها العديدة. وبهذا المنظور، تستطيع لوسيد التعبير بشكل طبيعي عن العمليات الحسابية متعددة الأبعاد التي لا تتغير في الزمن فحسب، بل في أبعاد أخرى أيضًا. [ 4 ] توضح الأمثلة التالية قدرة لوسيد على التعبير عن نطاق واسع من العمليات الحسابية متعددة الأبعاد.

الأعداد الأولية

الأعداد الأولية حيث البعد i؛ primes = first.i sieve; natsFrom2 = i+2; sieve = natsFrom2 fby.time ( sieve wvr.i ( sieve mod ( ( first.i sieve ) ne 0 ) ) ); نهاية 

فرز الدمج

r0t8.v,time( output ) أين الأبعاد v، h، t؛ الناتج = mergeSort asa.t inputSize == sizeOfMerge; دمج(س، ص) = إذا كان xx مفصولًا بـ yy وإلا إذا كان iseod yy فإن xx وإلا إذا كان xx <= yy فإن xx وإلا yy fi fi fi أين xx = x upon.v iseod yy || xx <= yy; yy = x upon.v iseod xx || xx > yy; نهاية؛ mergeSort = Inputdata(h) fby.t merge(leftChild.h(mergeSort), rightChild.h(mergeSort)); sizeOfMerge = 1 fby.t 2*sizeOfMerge; r0t8.a,b( x ) = x @.ab; نهاية 

ضرب المصفوفات

(matmult(A, B, n) @.aux_i r) @.aux_j c where dimension aux_i, aux_j; matmult( aux_a, aux_b, n ) = c asa.ts == (n*n*n) حيث الأبعاد t، i، j، k؛ s = 1 fby.t 8*s; d = 1 fby.t 2*d; أ = r0t8.aux_i.i( r0t8.aux_j.j( aux_a ) )); ب = r0t8.aux_i.i( r0t8.aux_j.j( aux_b )); ج = (أ @.جك) * (ب @.يك) fby.t ( ( تقليل @.k (2*k) ) @.j (2*j) ) @.i (2*i) حيث reduce = block( c + next.kc, next.jc + next.k next.jc, next.ic + next.k next.ic, next.j next.ic + next.k next.j next.ic, د ); block( tl, tr, bl, br, d ) = p where ع = append.aux_i( append.aux_j( tl, tr, d ), append.aux_j( bl, br, d ), د ); append.dim( a, b, d ) = if( dim < d ) then a وإلا b @.dim (dim-d) fi; نهاية؛ نهاية؛ r0t8.ab( x ) = x @.ab; نهاية؛ نهاية 

مراجع

  1. وادج، ويليام دبليو؛ آش كروفت، إدوارد أ. (1985). لوسيد، لغة برمجة تدفق البيانات . دار النشر الأكاديمية. ISBN 0-12-729650-6تم الاطلاع عليه بتاريخ 8 يناير 2015 .
  2. أورغون، محمد؛ وادج، ويليام (1992). "نحو نظرية موحدة لبرمجة المنطق القصدي" . مجلة برمجة المنطق . 13 (4): 413-440 . doi : 10.1016/0743-1066(92)90055-8 . ISSN 0743-1066 . 
  3. ^ أشكروفت، عصام. فوستيني، AA؛ جاغاناثان، ر.؛ وادج ، دبليو دبليو (23/02/1995). البرمجة متعددة الأبعاد . مطبعة جامعة أكسفورد. رقم ISBN 978-0-19-536045-5.
  4. "حل المشكلات متعددة الأبعاد في لوسيد" . www.csl.sri.com . تم الاطلاع عليه بتاريخ 9 أبريل 2026 .