مرجع
آخر الزيارات

بي إل/0

1٬235 كلمة•0 مشاهدة•🗒️ منذ 11 ساعة
باختصار: لغة بي إل/0 هي لغة برمجة صُمِّمت كلغة برمجة تعليمية، وهي مشابهة ولكن أبسط بكثير من لغة باسكال البرمجة متعددة الاستخدامات. في هذه المقالة 15 قسماً: «END»، «begin» و«السمات» وغيرها.
المحتويات
  1. END
  2. begin
  3. السمات
  4. أمثلة
  5. قواعد اللغة
  6. BEGIN
  7. 5
  8. ?n; f := 1; CALL fact; !f
  9. بناء المترجم
  10. أوبرون-0
  11. الاستخدام في التعليم
  12. BEGIN
  13. call primes
  14. [ "var" ident {"," ident} ";"]
  15. w := y;

تعريفًا بالموضوع، لغة بي إل/0 هي لغة برمجة صُمِّمت كلغة برمجة تعليمية، وهي مشابهة ولكن أبسط بكثير من لغة باسكال البرمجة متعددة الاستخدامات. تُستعمل PL/0 مثالًا لكيفية بناء مُصرِّف. ظهرت لأول مرة في كتاب «الخوارزميات + هياكل البيانات = البرامج» لِـنيقلاوس ويرث عام 1976. تتميز PL/0 ببنية لغوية محدودة للغاية؛ فهي لا تحتوي على أعداد حقيقية، وعدد قليل جدًا من العمليات الحسابية الأساسية، ولا تتضمن بُنى للتحكم في تدفّق البرنامج باستثناء عبارتي «if» و«while». وعلى الرغم من أن هذه القيود تجعل كتابة تطبيقات حقيقية بهذه اللغة غير عملية، فإنها تُسهم في إبقاء المُصرِّف بسيطًا ومختصرًا. ونتناول فيما يلي مزيدًا من التفاصيل.

END

إضافةً إلى ذلك، END.يقوم البرنامج التالي بطباعة الأعداد الأولية من 1 إلى 100. تتوافق عبارة الكتابة مع عبارة '!' في صيغة EBNF المذكورة أعلاه.

  • const max = 100;
  • var arg, ret;
  • procedure isprime;
  • var i;
  • begin
  • ret := 1;
  • i := 2;
  • while i < arg do

begin

  • if arg / i * i = arg then
  • begin
  • ret := 0;
  • i := arg
  • end;
  • i := i + 1
  • end
  • end;
  • procedure primes;
  • begin
  • arg := 2;
  • while arg < max do
  • begin
  • call isprime;
  • if ret = 1 then write arg;
  • arg := arg + 1
  • end
  • end;

السمات

وفي هذا السياق، أنواع البيانات الوحيدة هي الأعداد الصحيحة. وتقتصر العمليات المتاحة على العمليات الحسابية والمقارنات. وتوجد دالة odd تختبر ما إذا كان المُدخل فرديًا.

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

  • var i, s;
  • begin
  • i := 0; s := 0;
  • while i < 5 do
  • begin
  • i := i + 1;
  • s := s + i * i
  • end
  • end.يُعطي الناتج التالي: 0
  • 0
  • 1
  • 1
  • 2
  • 5
  • 3
  • 14
  • 4
  • 30

يجب تعريف جميع الثوابت والمتغيرات المستعملة بشكلٍ صريح.

أمثلة

من جانب آخر، يقوم هذا البرنامج بإخراج مربعات الأرقام من 1 إلى 10. وقد استبدلت أغلب الدورات التدريبية في بناء المترجمات اليوم علامة التعجب بإجراء WriteLn.VAR x, squ;

  • PROCEDURE square;
  • BEGIN
  • squ:= x * x
  • END;
  • BEGIN
  • x := 1;
  • WHILE x <= 10 DO
  • BEGIN
  • CALL square;
  • x := x + 1

قواعد اللغة

ومن ناحية أخرى، block = [ "const" ident "=" number {"," ident "=" number} ";"]

وفي هذا السياق، فيما يلي قواعد بناء الجملة للغة النموذجية المحددة في EBNF:program = block "." ;

BEGIN

  • IF f < g THEN g := g - f;
  • IF g < f THEN f := f - g
  • END;
  • z := f
  • END;
  • PROCEDURE fact;
  • BEGIN
  • IF n > 1 THEN
  • BEGIN
  • f := n * f;
  • n := n - 1;
  • CALL fact
  • END
  • END;
  • BEGIN
  • ?x; ?y; CALL multiply; !z;
  • ?x; ?y; CALL divide; !q; !r;
  • ?x; ?y; CALL gcd; !z;

5

من جانب آخر، تتضمن هياكل التحكم في التدفق بنى if-then و while-do والإجراءات المعرفة من قبل المستعمل. لا يمكن للإجراءات قبول معلمات.

كذلك، 55ومع ذلك، فإن أغلب التطبيقات تحتوي على إجراءات إدخال واحدة وإجراءات إخراج واحدة.

?n; f := 1; CALL fact; !f

END.

بناء المترجم

علاوةً على ذلك، في ديسمبر 1976، كتب ويرث كتيبًا صغيرًا حول بناء المترجمات، يحتوي على الشفرة المصدرية الكاملة لمترجم PL/0. وقد استُقيت قواعد بناء الجملة المذكورة أعلاه من الطبعة الأولى لكتاب ويرث «Compilerbau». في طبعات لاحقة من هذا الكتاب (متأثرًا بأبحاثه المستمرة)، عدّل ويرث بناء جملة PL/0، حيث غيّر كتابة الكلمات المفتاحية مثل const و procedure إلى أحرف كبيرة. جعل هذا التغيير PL/0 أقرب شبهًا إلى Modula-2. في الوقت نفسه، كان صديق ويرث وزميله كار هوار يعمل على مفهومه المؤثر «عمليات الاتصال التسلسلية»، الذي استعمل علامة التعجب ! وعلامة الاستفهام ؟ للدلالة على عناصر الاتصال الأساسية. أضاف ويرث كلا الرمزين إلى لغة PL/0، لكنه لم يذكر دلالاتهما في الكتاب.

أوبرون-0

وعلى صعيد آخر، في الطبعة الثالثة والأخيرة من كتابه عن بناء المترجمات، استبدل ويرث لغة PL/0 بلغة أوبرون-0. تُعدّ لغة أوبرون-0 أكثر تعقيدًا بكثير من لغة PL/0، فهي توفر، مثلًا، المصفوفات والسجلات وتعريفات الأنواع ومعاملات الإجراءات. وقد قررت دار نشر كتب ويرث ( أديسون-ويسلي) التوقف عن نشر جميع كتبه، إلا أن ويرث نفسه بدأ بنشر طبعات منقحة من كتابه ابتداءً من عام 2004. أحدث نسخة متاحة هي من مايو 2017.

الاستخدام في التعليم

وفي السياق ذاته، على مدى العقود الثلاثة الماضية، اتبعت أغلب المقررات الجامعية في بناء المترجمات التي تستعمل PL/0 نهج ويرث بدقة في توظيف هذه التقنيات (انظر المراجع أدناه). وفي السنوات الأخيرة، ابتعدت بعض المقررات عن المنهج الذي وضعه ويرث باستبدال تقنية التحليل التنازلي التكراري الكلاسيكية بنهج قريب من أسلوب أنظمة يونكس باستخدام lex وyacc. ومؤخرًا، قام تطبيق أدوات PL/0 على هذا النهج بدمج مفاهيم حديثة مثل البرمجة الكائنية وأنماط التصميم مع لغة برمجة حديثة مثل بايثون، مما يتيح للطلاب قراءة الشيفرة المصدرية بأسلوب برمجي معاصر.

من جهة ثانية، المقال الرئيسي حول المترجمات يستعرض لغة البرمجة PL/0 بوصفها وسيلة تعليمية لإدخال عدد من المفاهيم المؤثرة مثل: التحسين التدريجي، والتحليل التنازلي التكراري، وEBNF، ورمز P-code، ومخططات T، وذلك من خلال تدريب الطلاب على تطبيق هذه المفاهيم عمليًا.

BEGIN

  • IF ODD b THEN z := z + a;
  • a := 2 * a;
  • b := b / 2
  • END
  • END;
  • PROCEDURE divide;
  • VAR w;
  • BEGIN
  • r := x;
  • q := 0;

call primes

ومن ناحية أخرى، أُخذ المثال التالي من الطبعة الثانية من كتاب ويرث Compilerbau، الذي ظهر في عام 1986 في ألمانيا.

  • VAR x, y, z, q, r, n, f;
  • PROCEDURE multiply;
  • VAR a, b;
  • BEGIN
  • a := x;
  • b := y;
  • z := 0;
  • WHILE b > 0 DO

.

[ "var" ident {"," ident} ";"]

{ "procedure" ident ";" block ";" } statement ;

وفي هذا الصدد، factor = ident | number | "(" expression ")";من السهل نسبيًا على الطلاب كتابة محلل نحوي تنازلي متكرر لمثل هذه الصيغة البسيطة. ولذلك، لا يزال مُصرّف PL/0 يُستعمل على نطاق واسع في دورات بناء المُصرّفات حول العالم. ونظرًا لنقص الميزات في المواصفات الأصلية، يقضي الطلاب عادةً أغلب وقتهم في توسيع اللغة ومُصرّفهم. ويبدأون عادةً بإدخال REPEAT .. UNTIL، ثم ينتقلون إلى ميزات أكثر تقدمًا مثل تمرير المعاملات إلى الإجراءات أو هياكل البيانات كالمصفوفات والسلاسل النصية والأعداد العشرية.

w := y;

  • WHILE w <= r DO w := 2 * w;
  • WHILE w > y DO
  • BEGIN
  • q := 2 * q;
  • w := w / 2;
  • IF w <= r THEN
  • BEGIN
  • r := r - w;
  • q := q + 1
  • END
  • END
  • END;
  • PROCEDURE gcd;
  • VAR f, g;
  • BEGIN
  • f := x;
  • g := y;
  • WHILE f # g DO

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

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