البرمجة الضمنية
البرمجة الضمنية ، أو ما يُعرف أيضًا بالأسلوب غير المُحدد للنقاط ، هي نموذج برمجي لا تُحدد فيه تعريفات الدوال الوسائط (أو "النقاط") التي تعمل عليها. بدلاً من ذلك، تُركّب التعريفات دوالًا أخرى، من بينها دوال مُركّبة تُعالج الوسائط. تكتسب البرمجة الضمنية أهمية نظرية، لأن الاستخدام الصارم للتركيب يُنتج برامج مُلائمة تمامًا للاستدلال المنطقي . [ 1 ] كما أنها الأسلوب الطبيعي لبعض لغات البرمجة ، بما في ذلك لغة APL ومشتقاتها، [ 2 ] واللغات التجميعية مثل Forth . يُضفي غياب تسمية الوسائط على الأسلوب غير المُحدد للنقاط سمعةً بأنه غامض بلا داعٍ، ومن هنا جاء وصف "الأسلوب غير المُحدد للنقاط". [ 1 ]
تستخدم برمجة يونكس نموذج الأنابيب .
أمثلة
بايثون
يمكن توضيح البرمجة الضمنية باستخدام كود بايثون التالي . سلسلة من العمليات مثل ما يلي:
def example ( x ): return baz ( bar ( foo ( x )))... يمكن كتابتها بأسلوب خالٍ من النقاط كتركيب لسلسلة من الدوال، بدون معلمات: [ 3 ]
from functools import partial , reducedef compose ( * functions ): return partial ( reduce , lambda x , f : f ( x ), functions )مثال = تكوين ( foo , bar , baz )للحصول على مثال أكثر تعقيدًا، يمكن ترجمة كود هاسكل على النحو التالي:p = ((.) f) . g
p = partial(compose, partial(compose, f), g)
البرمجة الوظيفية
مثال بسيط (في لغة هاسكل ) هو برنامج يحسب مجموع قائمة من الأرقام. يمكننا تعريف دالة المجموع بشكل تكراري باستخدام أسلوب الإشارة (انظر برمجة مستوى القيمة ) كما يلي:
sum [ ] = 0 sum ( x : xs ) = x + sumxsلكن باستخدام عملية الطي ، يمكن استبدال ذلك بما يلي:
sum xs = foldr ( + ) 0 xsوبالتالي، لا حاجة للجدال، لذا يتبسط الأمر إلى
المجموع = foldr ( + ) 0وهو أمر لا يتطلب نقاطاً.
مثال آخر يستخدم تركيب الدوال :
p x y z = f ( g x y ) zتوضح الشفرة الزائفة التالية، الشبيهة بلغة هاسكل، كيفية اختزال تعريف الدالة إلى ما يعادلها من الدوال التي لا تحتوي على نقاط:
p = \ x -> \ y -> \ z -> f ( g x y ) z= \ x -> \ y -> f ( g x y )= \ x -> \ y -> ( f . ( g x )) y= \ x -> f . ( g x )( * هنا يتم استخدام عامل التركيب الوسطي " . " كدالة مُجزأة جزئيًا . * )= \ x -> (( . ) f ) ( g x )= \ x -> ((( . ) f ) . g ) xp = (( . ) f ) . gوأخيرًا، لرؤية مثال معقد، تخيل برنامج تصفية الخرائط الذي يأخذ قائمة، ويطبق عليها دالة، ثم يقوم بتصفية العناصر بناءً على معيار معين.
قائمة عوامل تشغيل معايير mf = معايير التصفية ( قائمة عوامل تشغيل الخريطة )ويمكن التعبير عنها بدون نقاط [ 4 ] على النحو التالي
mf = ( . map ) . ( . ) . filterكما سبق ذكره، تشير النقاط في "بدون نقاط" إلى الوسائط، وليس إلى استخدام النقاط؛ وهو مفهوم خاطئ شائع. [ 5 ]
تمت كتابة بعض البرامج لتحويل تعبير هاسكل تلقائيًا إلى شكل خالٍ من النقاط.
عائلة APL
في لغة البرمجة J ، يظهر نفس النوع من التعليمات البرمجية الخالية من النقاط في دالة مصممة لحساب متوسط قائمة (مصفوفة) من الأرقام:
المتوسط =: +/ % #+/يجمع عناصر المصفوفة عن طريق ربط ( /) summation ( +) بالمصفوفة. %يقسم المجموع على عدد العناصر ( #) في المصفوفة.
صيغة أويلرمعبر عنه ضمنياً:
كوس =: 2 س . ] الخطيئة =: 1 س . ] أويلر =: ^@ ي . = كوس ي . خطيئة( j.دالة أولية تعريفها الأحادي هو 0j1مضروبًا في x وتعريفها الثنائي هو x+0j1×y.) نفس العمليات الحسابية الضمنية معبر عنها بلغة Dyalog APL :
المتوسط ← + ⌿ ÷ ≢cos ← 2 ○ ⊢ sin ← 1 ○ ⊢ EulerCalc ← cos + 0j1 × sin ⍝ 0j1 هو ما يُكتب عادةً على النحو التالي: i EulerDirect ← * 0J1 ×⊢ ⍝ وهو نفسه ¯12○⊢ ⍝ هل تُعطي الطريقتان نفس النتيجة؟ EulerCheck ← EulerDirect = EulerCalc EulerCheck ¯1 1 2 3 1 1 1 1 ⍝ نعم، حتى الآن كل شيء على ما يرام!قائم على المكدس
في لغات البرمجة الموجهة نحو المكدس ( واللغات التجميعية ، التي يعتمد معظمها على المكدس )، تُستخدم الطرق غير المعتمدة على النقاط بشكل شائع. على سبيل المثال، قد تبدو عملية حساب أعداد فيبوناتشي كما يلي في لغة PostScript :
/fib { dup 1 eq exch dup 0 eq or not { dup 1 sub fib exch 2 sub fib add } if } defخطوط الأنابيب
خط أنابيب يونكس
في برمجة يونكس، الدوال هي برامج حاسوبية تستقبل البيانات من المدخلات القياسية وترسل النتائج إلى المخرجات القياسية . على سبيل المثال،
فرز | uniq -c | فرز -rn
هي عملية تركيب ضمنية أو غير محددة النقاط، تُعيد عدد مرات ظهور وسائطها، مرتبةً تنازليًا حسب عدد مرات ظهورها. يمثل ` sort` و` uniq` الدالتين، بينما يتحكم ` and` في الدوال، لكن الوسائط غير مذكورة. يمثل `pipe` عامل التركيب.-c-rn|
بسبب طريقة عمل خطوط الأنابيب، لا يمكن عادةً تمرير سوى وسيط واحد في كل مرة على شكل زوج من تدفقات الإدخال/الإخراج القياسية. مع أنّه يمكن فتح مُعرّفات ملفات إضافية من خلال الأنابيب المُسمّاة ، إلا أن هذا لم يعد يُعتبر أسلوبًا خاليًا من النقاط.
jq
jq هي لغة برمجة موجهة نحو JSON، حيث |يُستخدم الرمز لربط المرشحات لتشكيل مسار بيانات بطريقة مألوفة. على سبيل المثال:
[1,2] | إضافة
يتم تقييمها إلى 3. (نعم، مصفوفة JSON هي مرشح jq يتم تقييمه إلى مصفوفة.)
على الرغم من تشابهها مع خطوط أنابيب يونكس، تسمح خطوط أنابيب jq بإرسال البيانات الواردة إلى أكثر من مستلم واحد على الجانب الأيمن من الأمر |كما لو كانت متوازية. على سبيل المثال، سيحسب البرنامج add/lengthمتوسط الأرقام في مصفوفة، بحيث:
[1,2] | إضافة/طول
يُقيّم إلى 1.5
بصورة مماثلة:
[1,2] | [الطول، الجمع، الجمع/الطول]
يُقيّم إلى [2،3،1.5]
يمكن استخدام النقطة ( .) لتحديد نقطة اتصال على الجانب الأيمن، على سبيل المثال:
1 | [., .]
يُقيّم إلى [1,1]
وبالمثل:
2 | pow(.; .)
القيمة تساوي 4 لأنها pow(x;y)x مرفوعة للأس y.
متتالية فيبوناتشي
سيكون برنامج jq الضمني لتوليد متتالية فيبوناتشي كالتالي:
[0,1] | تكرار( [آخر، إضافة] ) | أول
هذا [0,1]هو الزوج الأولي الذي يُعتبر أول عنصرين في متتالية فيبوناتشي. ( [1,1]يمكن استخدام هذا الزوج أيضًا لتعريف الصيغة البديلة).
الرموز الأبجدية هي مرشحات مدمجة: `first` و `last` تصدران العنصرين الأول والأخير من مصفوفات الإدخال الخاصة بهما على التوالي؛ وتطبق recurse(f)مرشحًا، f، على مدخلاتها بشكل متكرر.
يسمح jq أيضًا بتعريف عوامل تصفية جديدة بأسلوب ضمني، على سبيل المثال:
def fib: [0,1] | recurse( [last, add] ) | first;
تركيب الدوال الأحادية
في قسم بايثون في هذه المقالة، سيتم التطرق إلى تعريف بايثون التالي:
def example ( x ): return baz ( bar ( foo ( x )))يمكن كتابة هذا في بايثون بأسلوب خالٍ من النقاط على النحو التالي:
مثال = compose(foo, bar, baz)
في jq، سيكون التعريف المكافئ الخالي من النقاط كما يلي:
مثال تعريفي: foo | bar | baz;
انظر أيضاً
- المنطق التوافقي
- لغة البرمجة التجميعية
- البرمجة على مستوى الوظائف
- جوي (لغة برمجة) ، لغة حديثة تعتمد بشكل كبير على اللغة الضمنية
مراجع
- 1 2 كونها، مانويل ألسينو بيريرا دا (2005). حساب البرنامج بدون نقاط (أطروحة الدكتوراه). جامعة مينهو .
- ↑ هولمز، دبليو. نيفيل، محرر. (2006). الحواسيب والناس .
- ↑ "الاسم والرمز وليس القيم" . Concatenative.org . تم الاطلاع عليه بتاريخ 13 سبتمبر 2013 .
- ↑ بايبر ميل
- ↑ "Pointfree" . ويكي Haskell.org . تم الاسترجاع في 2016-06-05 .
روابط خارجية
- من البرمجة على مستوى الوظائف إلى أسلوب البرمجة بدون نقاط
- الدوال النقية في لغتي APL وJ: كيفية استخدام البرمجة الضمنية في أي لغة شبيهة بلغة APL
- اللغات التطبيقية المغلقة 1971 - 1976 وما بعدها ، في جون دبليو باكوس (المنشورات)
- نماذج البرمجة
- مقارنات لغات البرمجة
