البرمجة الموجهة للمكدس
تحتوي هذه المقالة على العديد من المشكلات. يُرجى المساعدة في تحسينها أو مناقشة هذه المشكلات على صفحة المناقشة . ( تعرف على كيفية ومتى يمكنك إزالة هذه الرسائل )
|
البرمجة الموجهة نحو المكدس هي نموذج برمجة يعتمد على مكدس واحد أو أكثر لمعالجة البيانات و/أو تمرير المعلمات. تحتاج بنيات البرمجة في لغات البرمجة الأخرى إلى التعديل لاستخدامها في نظام موجه نحو المكدس. [1] تعمل معظم لغات البرمجة الموجهة نحو المكدس في صيغة لاحقة أو صيغة بولندية عكسية : يتم سرد الوسائط أو المعلمات الخاصة بأمر ما قبل ذلك الأمر. على سبيل المثال، سيتم كتابة صيغة لاحقة 2, 3, multiplyبدلاً من multiply, 2, 3( صيغة بادئة أو بولندية ) أو ( صيغة بادئة ). تناسب لغات البرمجة Forth و Factor و RPL و PostScript ولغة التصميم على غرار BibTeX [2] والعديد من لغات التجميع هذا النموذج.
2 multiply 3
تتلاعب الخوارزميات القائمة على المكدس بالبيانات عن طريق إخراج البيانات من المكدس ودفعها إليه. تتحكم المشغلات في كيفية معالجة المكدس للبيانات . للتأكيد على تأثير العبارة، غالبًا ما يتم استخدام تعليق يوضح الجزء العلوي من المكدس قبل العبارة وبعدها؛ يُعرف هذا باسم مخطط تأثير المكدس. قد تستخدم بعض اللغات الموجهة نحو المكدس مكدسات متعددة لأغراض مختلفة؛ على سبيل المثال، يستخدم PostScript مكدسات منفصلة للمتغيرات والقواميس والإجراءات وبعض الإجراءات النموذجية وعبارات تدفق التحكم. يسمح تحليل نموذج اللغة بتفسير التعبيرات والبرامج ببساطة.
خوارزميات تعتمد على المكدس
PostScript هو مثال للغة تعتمد على مكدس البادئات. ومن أمثلة التعبيرات في هذه اللغة 2 3 mul(حيث 'mul' هو الأمر المستخدم في عملية الضرب). ويتضمن حساب التعبير فهم كيفية عمل اتجاه المكدس.
يمكن تقديم اتجاه المكدس على أنه تشبيه للحزام الناقل التالي. في نهاية الحزام الناقل (المدخل ) ، يتم وضع اللوحات التي تحمل علامة 2و 3و mulبالترتيب. يمكن أخذ اللوحة الموجودة في نهاية الناقل ( 2)، ومع ذلك لا يمكن الوصول إلى اللوحات الأخرى حتى تتم إزالة اللوحة الموجودة في النهاية. لا يمكن تخزين اللوحات إلا في مكدس، ولا يمكن إضافتها أو إزالتها إلا من أعلى المكدس، وليس من المنتصف أو الأسفل. يمكن توفير لوحات فارغة (وعلامة) ويمكن التخلص من اللوحات بشكل دائم.
خذ اللوحة 2وضعها على المكدس، ثم خذ اللوحة 3وضعها على المكدس. بعد ذلك، خذ mulاللوحة. هذه تعليمات يجب تنفيذها. بعد ذلك، أخرج اللوحين العلويين من المكدس، واضرب تسمياتهما ( 2و 3)، واكتب النتيجة ( 6) على لوحة جديدة. تخلص من اللوحين القديمين ( 2و 3) واللوحة mul، وضع اللوحة الجديدة على المكدس. مع عدم بقاء المزيد من اللوحات على الناقل، تظهر نتيجة الحساب ( 6) على اللوحة أعلى المكدس.
هذه عملية حسابية بسيطة للغاية. ماذا لو كانت هناك حاجة إلى عملية حسابية أكثر تعقيدًا، مثل (2 + 3) × 11 + 1؟ إذا تمت كتابتها أولاً بصيغة لاحقة، أي ، 2 3 add 11 mul 1 addفيمكن إجراء العملية الحسابية بنفس الطريقة تمامًا والحصول على النتيجة الصحيحة. تظهر خطوات العملية الحسابية في الجدول أدناه. يُظهر كل عمود عنصر إدخال (اللوحة الموجودة في نهاية الناقل)، ومحتويات المكدس بعد معالجة هذا الإدخال.
| مدخل | 2 | 3 | يضيف | 11 | مول | 1 | يضيف |
|---|---|---|---|---|---|---|---|
| كومة | 2 | 3 2 |
5 | 11 5 |
55 | 1 55 |
56 |
بعد معالجة كافة المدخلات، تحتوي المكدس على 56، وهو الجواب.
من هذا، يمكن استنتاج ما يلي: لغة البرمجة القائمة على المكدس لديها طريقة واحدة فقط للتعامل مع البيانات، عن طريق أخذ قطعة واحدة من البيانات من أعلى المكدس، ويطلق عليها pop ping، ووضع البيانات مرة أخرى أعلى المكدس، ويطلق عليها push ing. يمكن كتابة أي تعبير يمكن كتابته بشكل تقليدي ، أو في لغة برمجة أخرى، في شكل لاحق (أو بادئة) وبالتالي يكون قابلاً للتفسير بواسطة لغة موجهة نحو المكدس.
التلاعب بالمكدس
نظرًا لأن المكدس هو الوسيلة الرئيسية لمعالجة البيانات في لغة موجهة للمكدس، فإن مثل هذه اللغات غالبًا ما توفر نوعًا ما من مشغلات معالجة المكدس. يتم توفيرها بشكل شائع dup، لمضاعفة العنصر أعلى المكدس، exch(أو swap)، لتبادل العناصر أعلى المكدس (يصبح الأول ثانيًا ويصبح الثاني أولًا)، roll، لتبديل العناصر بشكل دوري في المكدس أو على جزء من المكدس، pop(أو drop)، للتخلص من العنصر أعلى المكدس (الدفع ضمني)، وغيرها. تصبح هذه مفتاحًا في دراسة الإجراءات.
مخططات تأثير المكدس
كمساعدة لفهم تأثير العبارة، يتم استخدام تعليق قصير يوضح الجزء العلوي من المجموعة قبل العبارة وبعدها. يكون الجزء العلوي من المجموعة في أقصى اليمين إذا كان هناك عناصر متعددة. تُستخدم هذه الطريقة عادةً في لغة فورث، حيث يتم وضع التعليقات بين قوسين.
( قبل -- بعد )
على سبيل المثال، يتم وصف مشغلي مكدس فورث الأساسيين على النحو التالي:
مضاعفة (a -- aa) إسقاط (a --) تبديل (ab -- ba) على (ab -- aba) تعفن (abc -- bca)
fibيتم وصف الوظيفة أدناه
:
فيب (ن -- ن')
إنه يعادل الشروط المسبقة والشروط اللاحقة في منطق هوار . يمكن أيضًا الإشارة إلى كلا التعليقين باعتبارهما تأكيدات ، ولكن ليس بالضرورة في سياق اللغات القائمة على المكدس.
مكدسات PostScript
تحتوي لغة PostScript وبعض لغات المكدس الأخرى على مكدسات منفصلة أخرى لأغراض أخرى.
المتغيرات والقواميس
لقد تم تحليل تقييم التعبيرات المختلفة بالفعل. يعد تنفيذ المتغيرات أمرًا مهمًا لأي لغة برمجة، ولكن بالنسبة للغات الموجهة نحو المكدس، فإنه أمر ذو أهمية خاصة، حيث توجد طريقة واحدة فقط للتفاعل مع البيانات.
تتضمن الطريقة التي يتم بها تنفيذ المتغيرات في اللغات الموجهة للمكدس مثل PostScript عادةً مكدسًا منفصلًا ومتخصصًا يحتوي على قواميس من أزواج المفتاح والقيمة . لإنشاء متغير، يجب إنشاء مفتاح (اسم المتغير) أولاً، والذي يتم بعد ذلك ربط القيمة به. في PostScript، يتم وضع بادئة لـ name data object بـ /، وبالتالي /xفإن name data object يمكن ربطه، على سبيل المثال، بالرقم 42. defineالأمر هو def، لذلك
/x 42 def
يرتبط الاسم xبالرقم الموجود 42في القاموس أعلى المكدس. يوجد فرق بين /xو x- الأول هو كائن بيانات يمثل اسمًا، ويمثل xما تم تعريفه تحت /x.
إجراءات
يتم التعامل مع الإجراء في لغة برمجة تعتمد على المكدس باعتباره كائن بيانات بحد ذاته. في PostScript، يتم الإشارة إلى الإجراءات بين {و }.
على سبيل المثال، في بناء جملة PostScript،
{ dup mul }
يمثل إجراءً مجهول الهوية لتكرار ما هو موجود في أعلى المكدس ثم ضرب النتيجة - إجراء التربيع.
نظرًا لأن الإجراءات تُعامل ككائنات بيانات بسيطة، فمن الممكن تعريف أسماء الإجراءات. وعند استردادها، يتم تنفيذها مباشرةً.
توفر القواميس وسيلة للتحكم في النطاق، فضلاً عن تخزين التعريفات.
نظرًا لأن كائنات البيانات مخزنة في القاموس الأعلى، تنشأ قدرة غير متوقعة بشكل طبيعي: عند البحث عن تعريف من القاموس، يتم التحقق من القاموس الأعلى، ثم القاموس التالي، وهكذا. إذا تم تعريف إجراء يحمل نفس اسم إجراء آخر تم تعريفه بالفعل في قاموس مختلف، فسيتم استدعاء الإجراء المحلي.
تشريح بعض الإجراءات النموذجية
غالبًا ما تتطلب الإجراءات وسيطات. ويتم التعامل معها بواسطة الإجراء بطريقة محددة للغاية، تختلف عن تلك المستخدمة في لغات البرمجة الأخرى.
للتحقق من برنامج أرقام فيبوناتشي في PostScript:
/fib
{ dup dup 1 eq exch 0 eq أو لا { dup 1 sub fib exch 2 sub fib add } if } def
يتم استخدام تعريف متكرر على المكدس. تأخذ دالة أرقام فيبوناتشي وسيطة واحدة. أولاً، يتم اختبارها للتأكد من كونها 1 أو 0.
تحليل كل خطوة من الخطوات الرئيسية للبرنامج، مع مراعاة المكدس، بافتراض حساب fib(4) :
المكدس: 4
مضاعف
المكدس: 4 4
مضاعف
المكدس: 4 4 4
1 مكافئ
المكدس: 4 4 خطأ
صرف
المكدس: 4 خطأ 4
0 مكافئ
المكدس: 4 خطأ خطأ
أو
المكدس: 4 خطأ
لا
المكدس: 4 صحيح
نظرًا لأن التعبير يتم تقييمه على أنه صحيح، فسيتم تقييم الإجراء الداخلي.
المكدس: 4
مضاعف
المكدس: 4 4
1 فرعي
المكدس: 4 3
فيب
- (نداء متكرر هنا)
المكدس: 4 ف(3)
صرف
المكدس: F(3) 4
2 فرعي
المكدس: F(3) 2
فيب
- (نداء متكرر هنا)
المكدس: F(3) F(2)
يضيف
المكدس: F(3)+F(2)
وهي النتيجة المتوقعة.
لا يستخدم هذا الإجراء المتغيرات المسماة، بل يستخدم المكدس فقط. يمكن إنشاء المتغيرات المسماة باستخدام /a exch defالبنية. على سبيل المثال،{/n exch def n n mul}
هو إجراء تربيع مع متغير مسمى n. بافتراض أن يتم استدعاء /sq {/n exch def n n mul} defو 3 sq، يتم تحليل الإجراء sqبالطريقة التالية:
المكدس: 3 /ن
صرف
المكدس: /n 3
ديف
المكدس: فارغ (تم تعريفه)
ن
المكدس: 3
ن
المكدس: 3 3
مول
المكدس: 9
وهي النتيجة المتوقعة.
التحكم والتدفق
نظرًا لوجود إجراءات مجهولة، يمكن أن ينشأ التحكم في التدفق بشكل طبيعي. هناك حاجة إلى ثلاث قطع من البيانات لعبارة if-then-else : شرط، وإجراء يجب القيام به إذا كان الشرط صحيحًا، وإجراء يجب القيام به إذا كان الشرط خاطئًا. في PostScript على سبيل المثال،
2 3 gt { (2 أكبر من ثلاثة) = } { (2 ليس أكبر من ثلاثة) = } وإلا
يؤدي ما يعادله تقريبًا في لغة C:
إذا ( 2 > 3 ) { printf ( " 2 أكبر من ثلاثة \n " ); } وإلا { printf ( " 2 ليس أكبر من ثلاثة \n " ); }
التكرار والتراكيب الأخرى متشابهة.
تحليل نموذج اللغة
يتيح النموذج البسيط المقدم في لغة موجهة نحو المكدس تفسير التعبيرات والبرامج ببساطة وتقييمها نظريًا بشكل أسرع كثيرًا، حيث لا يلزم إجراء تحليل لغوي بل تحليل معجمي . تسهل الطريقة التي تُكتب بها مثل هذه البرامج تفسيرها بواسطة الآلات، وهذا هو السبب في أن PostScript مناسب للطابعات لاستخدامه. ومع ذلك، فإن الطريقة المصطنعة قليلاً لكتابة برامج PostScript يمكن أن تشكل حاجزًا أوليًا لفهم اللغات الموجهة نحو المكدس مثل PostScript.
في حين أن القدرة على التظليل من خلال تجاوز التعريفات المضمنة وغيرها من التعريفات قد تجعل من الصعب تصحيح أخطاء البرامج، والاستخدام غير المسؤول لهذه الميزة قد يتسبب في سلوك غير متوقع، إلا أنها قد تبسط بعض الوظائف بشكل كبير. على سبيل المثال، في استخدام PostScript، show pageيمكن تجاوز المشغل بمشغل مخصص يطبق نمطًا معينًا على الصفحة، بدلاً من الاضطرار إلى تعريف مشغل مخصص أو تكرار الكود لتوليد النمط.
انظر أيضا
مراجع
- ^ Luerweg, T. (2015). Stack based programming paradigms. Concepts of Programming Languages–CoPL'15, 33.
- ^ أورين باتاشنيك، تصميم أنماط BibTeX (PDF)[ رابط معطل ]
