نظرية البرنامج المهيكل

في نظرية لغات البرمجة ، تنص نظرية البرنامج المهيكل ، والتي تسمى عمومًا نظرية بوم-جاكوبيني ، [ 1 ] [ 2 ] على أن فئة من مخططات تدفق التحكم (التي تسمى تاريخيًا مخططات التدفق في هذا السياق) يمكنها حساب أي دالة قابلة للحساب باستخدام هياكل التحكم الثلاثة التالية فقط لدمج البرامج الفرعية ( العبارات والكتل ): [ 3 ]

تسلسل
تنفيذ برنامج فرعي واحد، ثم برنامج فرعي آخر
اختيار
تنفيذ أحد البرنامجين الفرعيين وفقًا لقيمة تعبير منطقي
التكرار
تنفيذ برنامج فرعي بشكل متكرر طالما أن التعبير المنطقي صحيح

ترد تعريفات أكثر دقة في القسم التالي.

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

تشكل هذه النظرية أساس البرمجة الهيكلية ، وهي نموذج برمجي يتجنب عبارة goto ، ويستخدم حصريًا دلالات تحكم أخرى للاختيار والتكرار.

تم تصوير تدفقات التحكم لنظرية البرنامج المهيكل - التسلسل والاختيار والتكرار - على شكل مخططات NS (باللون الأزرق) ومخططات التدفق (باللون الأخضر).

الأصل والمتغيرات

في عام 1964، عرّف كورادو بوم لغة برمجة بسيطة كاملة تورينج ( P′′ )، تعتمد على التسلسل والتكرار . [ 4 ] وفي ورقة بحثية لاحقة، أعاد بوم وجوزيبي جاكوبيني تأكيد هذه النتيجة. [ 5 ]

يُنسب الفضل في نظرية البرمجة المهيكلة عادةً [ 6 ] إلى تلك الورقة البحثية المنشورة عام 1966. كتب هاريل عام 1980 أن ورقة بوم-جاكوبيني حظيت بـ"شعبية واسعة" [ 6 ] ، لا سيما بين مؤيدي البرمجة المهيكلة. كما لاحظ هاريل أنه "نظرًا لأسلوبها التقني نوعًا ما، يبدو أن ورقة بوم-جاكوبيني لعام 1966 تُستشهد بها أكثر مما تُقرأ بتفصيل" [ 6 ] . وبعد مراجعة عدد كبير من الأوراق البحثية المنشورة حتى عام 1980، جادل هاريل بأن محتوى برهان بوم-جاكوبيني يُساء فهمه عادةً على أنه نظرية شعبية تتضمن في جوهرها نتيجة أبسط، وهي نتيجة يمكن تتبعها إلى بدايات نظرية الحوسبة الحديثة في أوراق فون نيومان [ 7 ] وكلين [ 8 ] .

ويكتب هاريل أيضًا [ 6 ] أن الاسم الأكثر عمومية اقترحه إتش دي ميلز باسم "نظرية البنية" في أوائل السبعينيات. [ 9 ]

كان تطور النظرية على النحو التالي.

1. بوم 1964 (إنشاء البرامج/الحساب)

نتيجة
يمكن حساب كل دالة تكرارية جزئية بواسطة برنامج [ 10 ] باستخدام التسلسل والتكرار فقط . [ 4 ]
ملحوظات
تركز هذه النتيجة على توليد البرامج . لا يتطلب الأمر اختيارًا : يتم ترميز السلوك المشروط بواسطة الحلقات. يمنع P′′ تدفق التحكم غير المنظم خلال تصميم اللغة، ويفرض البنية من المصدر. يعيد بوم صياغة نتائجه في الجزء الثاني من كتاب بوم-جاكوبيني (1966). [ 5 ]

2. بوم – جاكوبيني 1966 (تحويل البرنامج)

نتيجة
يمكن تحويل كل مخطط انسيابي ( مخطط تدفق التحكم ، CFG) إلى برنامج منظم باستخدام التسلسل والتكرار فقط . [ 5 ]
ملحوظات
يركز هذا الإصدار من النظرية على تحويل البرامج . وهو ذو صلة أساسية بتحسين أداء المترجمات ، وليس بقرارات تصميم البرمجيات. في الجزء الأول من بحث بوم وجاكوبيني (1966)، أثبت جاكوبيني أنه يمكن إعادة كتابة أي رسم بياني لتدفق التحكم (CFG) [ 11 ] كرسم بياني منظم [ 12 ] باستخدام الاختيار والتسلسل والتكرار فقط ، مع الحفاظ على بنية البرنامج الأصلية. [ 3 ] في الجزء الثاني، بيّن بوم أن الاختيار ليس ضروريًا تمامًا: إذ يمكن تحويل أي رسم بياني لتدفق التحكم باستخدام التسلسل والتكرار فقط .
تعتمد برهان جاكوبيني على الاستقراء في بنية مخطط التدفق. [ 6 ] ولأنها تستخدم مطابقة الأنماط في الرسوم البيانية ، لم يكن البرهان عمليًا كخوارزمية لتحويل البرامج ، مما فتح المجال لمزيد من البحث في هذا الاتجاه. [ 13 ]

3. نظرية فولك (التحويل الأدنى للحلقة)

نتيجة
كل مخطط انسيابي يعادل برنامج while مع ظهور واحد لـ while-do ، بشرط السماح بمتغيرات إضافية. [ 14 ]
ملحوظات
تُبسّط هذه النسخة من النظرية تحويل بوم-جاكوبيني، مُختزلةً جميع التكرارات إلى حلقة واحدة. أُعيد إدخال عملية الاختيار للتوضيح، ولكنها اختيارية من الناحية النظرية.
تستبدل النظرية الشعبية مسار التحكم في البرنامج الأصلي بحلقة تكرارية شاملة واحدة whileتحاكي عداد البرنامج الذي يمر على جميع التسميات الممكنة (مربعات مخطط التدفق) في البرنامج الأصلي غير المهيكل. [ 3 ] وقد أرجع هاريل أصل هذه النظرية الشعبية إلى ورقتين بحثيتين تُؤرخان لبداية الحوسبة. الأولى هي وصف بنية فون نيومان عام 1946 ، والذي يشرح كيفية عمل عداد البرنامج باستخدام حلقة تكرارية (while). ويشير هاريل إلى أن الحلقة التكرارية الوحيدة المستخدمة في النسخة الشعبية من نظرية البرمجة المهيكلة تُوفر ببساطة دلالات تشغيلية لتنفيذ مخطط التدفق على حاسوب فون نيومان. [ 8 ] أما المصدر الآخر، وهو أقدم، الذي أرجع إليه هاريل النسخة الشعبية من النظرية، فهو نظرية الشكل الطبيعي لستيفن كلين من عام 1936. [ 8 ]
p := 1 بينما p > 0 نفّذ إذا كان p = 1 ، فنفّذ الخطوة 1 من مخطط التدفق ، p := رقم الخطوة اللاحقة للخطوة 1 من مخطط التدفق ( 0 إذا لم تكن هناك خطوة لاحقة ) نهاية إذا إذا كان p = فنفّذ الخطوة 2 من مخطط التدفق ، p : = رقم الخطوة اللاحقة للخطوة 2 من مخطط التدفق ( 0 إذا لم تكن هناك خطوة لاحقة ) نهاية إذا ... إذا كان p = n ، فنفّذ الخطوة n من مخطط التدفق، p : = رقم الخطوة اللاحقة للخطوة n من مخطط التدفق ( 0 إذا لم تكن هناك خطوة لاحقة ) نهاية إذا نهاية الحلقة
انتقد دونالد كنوث هذا الشكل من البرهان، الذي ينتج عنه رمز زائف مثل الرمز المذكور أعلاه، مشيرًا إلى أن بنية البرنامج الأصلي تُفقد تمامًا في هذا التحويل. [ 15 ] وبالمثل، كتب بروس إيان ميلز عن هذا النهج قائلًا: "جوهر بنية الكتل هو أسلوب، وليس لغة. من خلال محاكاة آلة فون نيومان، يمكننا إنتاج سلوك أي رمز معقد ضمن حدود لغة ذات بنية كتل. هذا لا يمنع كونه معقدًا." [ 16 ]

4. بيان الكتاب المدرسي الحديث

يُشار إلى البرمجة الهيكلية غالبًا على النحو التالي:

نتيجة
يمكن حساب كل دالة تكرارية جزئية بواسطة برنامج منظم باستخدام ( الاختيار ،) التسلسل والتكرار ؛ علاوة على ذلك، مع ترميزات مناسبة لحالة التحكم، whileتكفي حلقة واحدة. [ 17 ]
ملحوظات
وهذا يجمع بين:
  1. بوم (1964) - الذي أثبت أنه لكل دالة تكرارية جزئية يوجد برنامج (مهيكل) P′′ يقوم بحسابها - مما يثبت وجود خوارزمية بدلاً من إعادة كتابة خوارزمية موجودة؛ [ 18 ]
  2. بوم-جاكوبيني (1966) - والذي يوضح أنه يمكن إعادة كتابة أي برنامج أو مخطط انسيابي موجود باستخدام التحديد والتسلسل والتكرار فقط (مع كون التحديد في الواقع زائداً عن الحاجة)؛ [ 5 ]
  3. نتيجة الحلقة الواحدة المتعارف عليها، والتي توضح أنه يمكن تقليل التكرار إلى حلقة واحدة من خلال ترميز حالة التحكم الصريح.

5. نسخة قابلة للعكس

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

بالنسبة لنظرية البرنامج المهيكل، توجد طريقتان معروفتان للإثبات: محلية [ 5 ] وعالمية [ 21 ] . أما بالنسبة لنسختها العكسية، فبينما توجد طريقة عالمية للإثبات، لا تزال الطريقة المحلية المشابهة لتلك التي اتبعها بوم وجاكوبيني [ 5 ] غير معروفة. هذا التمييز مثالٌ يُبرز التحديات والفروق الدقيقة في وضع أسس الحوسبة العكسية مقارنةً بنماذج الحوسبة التقليدية.

الآثار والتحسينات

لم يحسم برهان بوم-جاكوبيني مسألة اعتماد البرمجة الهيكلية لتطوير البرمجيات، ويعود ذلك جزئيًا إلى أن هذا البناء كان يُرجّح أن يُعقّد البرنامج بدلًا من تحسينه. بل على العكس، فقد مثّل بداية النقاش. وتبع ذلك رسالة إدسكار ديكسترا الشهيرة، " عبارة Go To تُعتبر ضارة" ، في عام 1968. [ 22 ]

تبنى بعض الأكاديميين نهجًا متشددًا تجاه نتيجة بوم-جاكوبيني، وجادلوا بأن حتى تعليمات مثل " breakو" returnمن منتصف الحلقات تُعد ممارسة سيئة، إذ لا حاجة لها في برهان بوم-جاكوبيني، وبالتالي دعوا إلى أن يكون لكل حلقة نقطة خروج واحدة. يتجسد هذا النهج المتشدد في لغة البرمجة باسكال (التي صُممت في الفترة 1968-1969)، والتي كانت حتى منتصف التسعينيات الأداة المفضلة لتدريس مقررات البرمجة التمهيدية في الأوساط الأكاديمية. [ 23 ]

يشير إدوارد يوردون إلى أنه في سبعينيات القرن الماضي، كان هناك معارضة فلسفية لتحويل البرامج غير المهيكلة إلى برامج مهيكلة آليًا، استنادًا إلى حجة ضرورة التفكير بأسلوب البرمجة المهيكلة منذ البداية. أما الرأي العملي المقابل فكان أن هذه التحويلات تفيد عددًا كبيرًا من البرامج الموجودة. [ 24 ] ومن بين المقترحات الأولى للتحويل الآلي ورقة بحثية نُشرت عام 1971 من قِبل إدوارد آش كروفت وزوهار مانا . [ 25 ]

قد يؤدي التطبيق المباشر لنظرية بوم-جاكوبيني إلى إدخال متغيرات محلية إضافية في المخطط الهيكلي، وقد ينتج عنه أيضًا تكرار بعض التعليمات البرمجية . [ 26 ] تُعرف هذه المشكلة الأخيرة في هذا السياق بمشكلة الحلقة والنصف. [ 27 ] تتأثر لغة باسكال بهاتين المشكلتين، ووفقًا لدراسات تجريبية استشهد بها إريك س. روبرتس ، واجه المبرمجون الطلاب صعوبة في صياغة حلول صحيحة بلغة باسكال لعدة مسائل بسيطة، بما في ذلك كتابة دالة للبحث عن عنصر في مصفوفة. وجدت دراسة أجراها هنري شابيرو عام 1980، والتي استشهد بها روبرتس، أنه باستخدام هياكل التحكم التي توفرها باسكال فقط، لم يقدم الحل الصحيح سوى 20% من المشاركين، بينما لم يكتب أي مشارك تعليمات برمجية خاطئة لهذه المسألة إذا سُمح له بكتابة أمر إرجاع من منتصف حلقة تكرارية. [ 23 ]

في عام 1973، أثبت إس. راو كوساراجو إمكانية تجنب إضافة متغيرات إضافية في البرمجة الهيكلية، طالما سُمح بفواصل متعددة المستويات ذات عمق عشوائي من الحلقات. [ 1 ] [ 29 ] علاوة على ذلك، أثبت كوساراجو وجود تسلسل هرمي صارم للبرامج، يُعرف اليوم بتسلسل كوساراجو الهرمي ، حيث يوجد لكل عدد صحيح n برنامج يحتوي على فاصل متعدد المستويات بعمق n لا يمكن إعادة كتابته كبرنامج بفواصل متعددة المستويات بعمق أقل من n (دون إضافة متغيرات إضافية). [ 1 ] ينسب كوساراجو مفهوم الفاصل متعدد المستويات إلى لغة البرمجة BLISS . وقد تم تقديم الفواصل متعددة المستويات، على شكل كلمة مفتاحية، في الإصدار BLISS-11 من تلك اللغة؛ بينما كانت لغة BLISS الأصلية تحتوي فقط على فواصل أحادية المستوى. لم توفر عائلة لغات BLISS وظيفة goto غير مقيدة. وقد اتبعت لغة البرمجة Java هذا النهج لاحقًا أيضًا. [ 30 ]leave label

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

  1. التفرع من حلقة (بخلاف اختبار دورة الحلقة)
  2. التفرع إلى حلقة
  3. التفرع إلى قرار (أي إلى "فرع شرطي")
  4. التفرع من قرار

وجد مكابي أن هذه الرسوم البيانية الأربعة ليست مستقلة عند ظهورها كرسوم بيانية فرعية، مما يعني أن الشرط اللازم والكافي لكون البرنامج غير منظم هو أن يحتوي مخطط تدفق التحكم الخاص به على رسم بياني فرعي واحد من أي مجموعة فرعية من ثلاثة من هذه الرسوم البيانية الأربعة. كما وجد أنه إذا احتوى برنامج غير منظم على أحد هذه الرسوم البيانية الفرعية الأربعة، فلا بد أن يحتوي على رسم بياني فرعي آخر مختلف من المجموعة. تساعد هذه النتيجة الأخيرة في تفسير كيفية تشابك تدفق التحكم في البرنامج غير المنظم فيما يُعرف باسم "شفرة السباغيتي". ابتكر مكابي أيضًا مقياسًا عدديًا يُحدد، عند إعطاء برنامج عشوائي، مدى بُعده عن البرنامج المنظم المثالي؛ أطلق مكابي على مقياسه اسم " التعقيد الأساسي ". [ 31 ] يمكن اعتبار توصيف مكابي للرسوم البيانية المحظورة للبرمجة المنظمة غير مكتمل، على الأقل إذا اعتُبرت هياكل D لـ Dijkstra هي اللبنات الأساسية. [ 32 ]

حتى عام 1990، طُرحت العديد من الطرق لإزالة عبارات الانتقال (goto) من البرامج الموجودة، مع الحفاظ على معظم بنيتها. كما اقترحت المناهج المختلفة لهذه المشكلة عدة مفاهيم للتكافؤ، وهي أكثر صرامة من مجرد تكافؤ تورينج، لتجنب مخرجات مثل نظرية فولك المذكورة أعلاه. وتحدد صرامة مفهوم التكافؤ المُختار الحد الأدنى من هياكل التحكم في التدفق المطلوبة. استعرضت ورقة لايل رامشو المنشورة في مجلة JACM عام 1988 المجال حتى ذلك الحين، كما اقترحت طريقتها الخاصة. [ 33 ] استُخدمت خوارزمية رامشو، على سبيل المثال، في بعض برامج فك تجميع جافا، لأن كود آلة جافا الافتراضية يحتوي على تعليمات تفرع بأهداف مُعبر عنها بالإزاحات، بينما لغة جافا عالية المستوى لا تحتوي إلا على عبارات متعددة المستويات break. continue[ 34 ] [ 35 ] [ 36 ] اقترح أمارغويلا (1992) طريقة تحويل تعود إلى فرض مخرج واحد. [ 13 ]

تطبيق على لغة كوبول

في ثمانينيات القرن الماضي، أشرف الباحث هارلان ميلز من شركة IBM على تطوير أداة هيكلة لغة كوبول ، التي طبقت خوارزمية هيكلة على كود كوبول . وتضمن تحويل ميلز الخطوات التالية لكل إجراء.

  1. حدد العناصر الأساسية في الإجراء.
  2. قم بتعيين تسمية فريدة لمسار دخول كل كتلة، وقم بتسمية مسارات خروج كل كتلة بتسميات مسارات الدخول التي تتصل بها. استخدم 0 للعودة من الإجراء و1 لمسار دخول الإجراء.
  3. قسّم الإجراء إلى مكوناته الأساسية.
  4. لكل كتلة تمثل وجهة مسار خروج واحد فقط، أعد توصيل تلك الكتلة بمسار الخروج هذا.
  5. قم بتعريف متغير جديد في الإجراء (يسمى L للرجوع إليه).
  6. أضف عبارة في كل مسار خروج متبقٍ غير متصل، بحيث يتم تعيين L إلى قيمة التسمية على ذلك المسار.
  7. قم بدمج البرامج الناتجة في عبارة اختيار تقوم بتنفيذ البرنامج باستخدام تسمية مسار الإدخال المشار إليها بواسطة L.
  8. قم بإنشاء حلقة تقوم بتنفيذ عبارة الاختيار هذه طالما أن L لا تساوي 0.
  9. قم بإنشاء تسلسل يقوم بتهيئة L إلى 1 وتنفيذ الحلقة.

يمكن تحسين هذا البناء عن طريق تحويل بعض حالات عبارة الاختيار إلى إجراءات فرعية.

انظر أيضاً

ملاحظات ومراجع

  1. 1 2 3 كوزين وتسنج 2008 .
  2. جامعة بافالو 2004 .
  3. 1 2 3 باريندريجت 2019 ، ص. 12.
  4. 1 2 بوم 1964 .
  5. 1 2 3 4 5 6 بوم وجاكوبيني 1966 .
  6. 1 2 3 4 5 هاريل 1980 ، ص 381.
  7. ^ بوركس وجولدستين وفون نيومان 1947 .
  8. 1 2 3 هاريل 1980 ، ص 383.
  9. ميلز 1972 .
  10. لغة P′′ كاملة تورينج وتفي بالمتطلبات. لغة Brainfuck ، وهي نسخة معدلة من P′′، مصممة هيكليًا أيضًا.
  11. لم يشترط بوم وجاكوبيني صراحةً أن تكون "البرامج" ذات مدخل واحد ومخرج واحد ، وأن تكون جميع العقد قابلة للوصول، لكن برهانهما اعتمد على ذلك. وقد أوضح ميلز (1972 ، ص32) هذين الشرطين صراحةً. 
  12. يُعتبر مخطط التدفق الحر ذو المدخل الواحد والمخرج الواحد (SESE) "منظمًا" إذا كان كل رسم بياني فرعي من نوعSESE .
  13. 1 2 Ammarguellat 1992 .
  14. هاريل 1980 ، ص 380.
  15. كنوت 1974 ، ص 274.
  16. ميلز 2005 ، ص 279.
  17. Greibach 1975 ، الفصل 4. البرامج المهيكلة.
  18. بوم 1964 ، ص 191، النتيجة الرئيسية لهذه الورقة.
  19. ^ يوكوياما وأكسلسن وغلوك 2016 .
  20. بينيت 1973 .
  21. كوبر 1967 .
  22. ديكسترا 1968 .
  23. 1 2 روبرتس 1995 .
  24. Yourdon 1979 ، ص 49-50.
  25. آش كروفت ومانا 1971 .
  26. وات وفيندلاي 2004 ، ص 228.
  27. لودن ولامبرت 2011 ، ص 422-423.
  28. كوساراجو 1974 .
  29. كوساراجو 1973 , [ 28 ] استشهد به كنوث 1974 .
  30. ^ بريندر 2002 ، ص 960-965.
  31. الورقة الأصلية هي McCabe 1976. للاطلاع على شرح ثانوي، انظر Jorgensen 2002 .
  32. ويليامز 1983 ، ص 274-275.
  33. رامشو 1988 .
  34. نولان 2004 .
  35. بروبستينغ وواترسون 1997 .
  36. ^ ماروياما وأوجاوا وماتسوكا 1999 .

فهرس

  • عمارجيلات، ز. (1992). "خوارزمية تطبيع تدفق التحكم وتعقيدها". معاملات IEEE في هندسة البرمجيات . 18 (3): 237-251 . doi : 10.1109/32.126773 .
  • يورغنسن، بول سي. (2002). اختبار البرمجيات: منهج حرفي (  الطبعة الثانية). مطبعة سي آر سي. الصفحات 150-153 . ISBN  978-0-8493-0809-3.
  • كوساراجو، إس. راو (مايو 1973). "تحليل البرامج المهيكلة". وقائع الندوة السنوية الخامسة لجمعية آلات الحوسبة حول نظرية الحوسبة . جمعية آلات الحوسبة. الصفحات 240-252 . ، "تحليل البرامج المهيكلة". مجلة علوم الحاسوب والنظم . 9 (3): 232-255 . 1974 [1973]. doi : 10.1016/S0022-0000(74)80043-7 .
  • لودن، كينيث سي؛ لامبرت، كينيث أ. (2011). لغات البرمجة: المبادئ والممارسات (  الطبعة الثالثة). سينجايج ليرنينج. ISBN 978-1-111-52941-3.
  • ميلز، هـ. (1972). الأسس الرياضية للبرمجة الهيكلية (تقرير فني). غايثرسبيرغ، ماريلاند: قسم الأنظمة الفيدرالية لشركة آي بي إم. ص  62.
  • ميلز، بروس إيان (2005). مقدمة نظرية في البرمجة . سبرينغر. ص  279. ISBN 978-1-84628-263-8.
  • نولان، جودفري (2004). فك تجميع جافا . أبريس. ص  142. ISBN 978-1-4302-0739-9.
  • جامعة بافالو (22 نوفمبر 2004). "مقرر علوم وهندسة الحاسوب 111، خريف 2004، نظرية بوهم-جاكوبيني" . جامعة بافالو. مؤرشف من الأصل بتاريخ 22 نوفمبر 2004. تاريخ الاطلاع: 12 يوليو 2025 .
  • وات، ديفيد أنتوني ؛ فيندلاي، ويليام (2004). مفاهيم تصميم لغات البرمجة . جون وايلي وأولاده. ISBN 978-0-470-85320-7.
  • ويليامز، إم إتش (1983). "مخططات التدفق ومشكلة التسمية". مجلة الحاسوب . 26 (3): 270-276 . doi : 10.1093/comjnl/26.3.270 .

للمزيد من القراءة

  • ديفيين، فيليب؛ ليبغ، باتريك؛ روتييه، جان كريستوف؛ وورتز، يورغ (فبراير 1994). "عبارة هورن ثنائية واحدة تكفي". وقائع الندوة الحادية عشرة حول الجوانب النظرية لعلوم الحاسوب (STACS '94) . سلسلة محاضرات في علوم الحاسوب. المجلد  775. الصفحات 21-32 . CiteSeerX 10.1.1.14.537 . doi : 10.1007/3-540-57785-8_128 . ISBN   978-3-540-57785-0.