| أنماط البرمجة |
| --- |
| * فعلية
* مصفوفية
* ذاتية
* متزامنة
	+ فاعلة
	+ كوريغرافية
	+ متعددة المستويات
	+ نسبية
	+ التزامن المنظم
* توجهية البيانات
* تعريفية (عَكسها: أمرية)
	+ وظيفية
		- وظيفية منطقية
		- وظيفية بحتة
	+ منطقية
		- منطقية تبادلية
		- مجموعة الإجابة
		- منطقية متزامنة
		- وظيفية منطقية
		- منطقية استقرائية
	+ قيدية 
		- منطقية تقييدية 
			* منطقية قيدية متزامنة
	+ نقل المُعطيات
		- تدفقية
		- تفاعلية 
			* تفاعلية وظيفية
	+ أنطولوجية  (أنظر: نطولوجية)
	+ إستعلامية
* تفاضلية
* ديناميكية/نصية
* مدفوعة بالحدث
* المستوى الوظيفي  (عَكسها: مستوى القيمة )
	+ ضمنية 
		- تسلسلية
* عامة
* أمرية (عَكسها: تعريفية)
	+ إجرائية
	+ كائنية التوجه
* مُتعمدة
* لغوية 
	+ مخصصة النطاق
* مُتعلمة
* اللغة الطبيعية
* وصفية
	+ تلقائية 
		- استقرائية
	+ إنعكاسية
		- وسمية
	+ ماكرو
	+ وصفية قالبية
* غير مُهيكلة  (عَكسها: مُهيكلة)
	+ مصفوفية
* غير حتمية
* متوازية  
	+ عملية
* احتمالية
* كمومية
* نظرية المجموعات
* مُكدسة 
	+ كُتلة مُهيكلة
	+ كائنية التوجه
		- موجهة للعميل
		- فصيلية
		- كائنية متزامنة
		- نموذجية
		- من خلال فصل الاهتمامات:
			* جانبية المنحى
			* دُورية
			* موضوعية
	+ تكرارية
* رمزية
* قيمية  (عَكسها: وظيفى )
 |
| * ع
* ن
* ت
 |

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

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

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

تاريخها وفلسفتها
----------------

تم تقديم البرمجة المتعلمة لأول مرة في عام 1984 من قبل دونالد كنوث ، الذي كان يهدف إلى إنشاء برامج ذات محتوى يناسب البشر. طُبق في جامعة ستانفورد كجزء من بحثه حول الخوارزميات والطباعة الرقمية. اطلق عليه اسم "WEB "لاعتقاده أنها كانت واحدة من الكلمات القليلة المكونة من ثلاثة أحرف في اللغة الإنجليزية والتي لم يتم تطبيقها بعد على الحوسبة.  ومع ذلك ، فإنها تمثل الطبيعة المعقدة للبرامج التي تم تجميعها بدقة من مواد بسيطة.  شهدت ممارسة البرمجة المتعلمة انتعاشًا مهمًا في 2010 مع استخدام دفاتر الملاحظات الحسابية ، وخاصة في علم البيانات .

مفهومها
-------

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

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

### المزايا

وفقًا لكنوث ،   توفر البرمجة المتعلمة برامج عالية الجودة ، حيث إنها تجبر المبرمجين على توضيح الأفكار الكامنة وراء البرنامج ، مما يوضح قرارات التصميم غير المدروسة أكثر. يدعي كنوث أيضًا أن البرمجة المتعلمة توفر نظام توثيق من الدرجة الأولى ، وهي ليست خاصية مضافة إنما تنمو بشكل طبيعي في أثناء عملية عرض أفكار الفرد خلال إنشاء البرنامج.  يسمح التوثيق للمؤلف بإعادة عمليات تفكيره في أي وقت لاحق ويسهل فهم بناء البرنامج للمبرمجين الآخرين. يختلف عن التوثيق التقليدي من حيث أنه يقوم بتقديم شفرة المصدر للمبرمج الذي يتبع أمر ترجمة إلزامي الذي يلزمه أن يفك شفرة عملية التفكير وراء البرنامج من الشفرة وتعليقاتها المرتبطة بها. يُزعم أيضًا أن اللغة الوصفية للبرمجة المتعلمة تسهل التفكير ، وتعطي "نظرة عامة" عن الشفرة وتزيد من عدد المفاهيم التي يمكن للعقل الاحتفاظ بها ومعالجتها بنجاح. تم إثبات قابلية تطبيق المفهوم على البرمجة على نطاق واسع ، أي البرامج التجارية ، من خلال إصدارشفرة TeX كبرنامج متعلم. 

كذلك يدعي كنوث أن البرمجة المتعلمة تسهل نقل البرامج إلى بيئات متعددة ، وحتى يستشهد بتنفيذ TeX كمثال. 

### تناقضات في إنشاء الوثائق

يساء فهم البرمجة المتعلمة  على أنها تشير فقط إلى الوثائق المنسقة المنتجة من ملف مشترك مع كل من شفرة المصدر والتعليقات - التي يقصد بها إنشاء التوثيق - أو إلى التعليقات الضخمة المضمنة في الشفرة. هذا هو عكس البرمجة المتعلمة: وهي الشفرة الموثقة جيدًا أو التوثيق المستخرج من الشفرة اعن طريق اتباع هيئة الشفرة مع التوثيق المضمّن في الشفرة ؛ بينما في البرمجة المتعلمة ، يتم الشفرة مضمنة في الوثائق مع اتباع الشفرة لهيئة التوثيق.

أدى هذا المفهوم الخاطئ إلى ادعاءات بأن أدوات استخراج التعليقات ، مثل وثائق Perl Plain Old Documentation أو أنظمة Java Javadoc ، هي "أدوات برمجة متعلمة". وبرغم أن هذه الأدوات لا تحتوي "شبكة المفاهيم المجردة" المختبئة خلف نظام وحدات الماكرو ذات اللغة الطبيعية ، أوتسمح بتغيير ترتيب شفرة المصدر من تسلسل آليٍ إلزامي إلى تسلسل مناسب للعقل البشري ، لا يمكن تسميتها بشكل صحيح بأدوات البرمجة المتعلمة بالمعنى المقصود من قبل نوث.  

### النقد

في عام 1986 ، طلب جون بنتلي من نوث أن يوضح مفهوم البرمجة المتعلمة في عموده *لآلئ البرمجة* في *Communications of the ACM* ، من خلال كتابة برنامج في WEB. أرسل كنوث له برنامجًا يتطرق لمشكلة نوقشت سابقًا في العمود (ذات أخذ عينة *M من* الأرقام العشوائية في النطاق 1.. *N* ) وطلب منه أن يعطيه مهمه لحلها. فقام بنتلي بإعطائة مسألة العثور على الكلمات الأكثر شيوعًا من *K* من ملف نصي ، فكتب نوث لها برنامج WEB الذي تم نشره مع مراجعة قام بها دوغلاس ماكلروي من Bell Labs. أشاد ماكلوري بتعقيدات واختيارات حل كنوث لهيكل البيانات (المختلف عن Frank M. Liang's hash trie ) وعرضة التقديمي لكنه انتقد بعض الأمور المتعلقة بالأسلوب ، مثل تطرقة للفكرة الأساسية آخر الورقة ، واستخدام الثوابت السحرية ، وعدم وجود رسم بياني يصاحب شرح بنية البيانات وكذلك نقد ماكلوري مهمة البرمجة نفسها ، مشيرًا إلى أنه في Unix (التي تم تطويرها في Bell Labs)التي تستخدم أدوات معالجة النصوص ( tr ، و Sort ، و uniq ، و sed ) قد سبق كتابتها كـ"عناصر أساسية" ووسيلة حل سهلة التطبيق والتنقيح وإعادة الاستخدام من خلال الجمع بين هذه الأدوات المساعدة في برنامج نصي من ستة أسطر. رداً على ذلك ، كتب بنتلي ما يلي: 
اُعجب ماكلوري بطريقة تنفيذ الحل لكنه ينقدة من مبدأ الهندسة، هذة بالطبع مسوؤليتي كمحيل لمشكلة؛ نوث حل المشكلة على الأساس الذي يتفق عليه المهندسون-الشيك الذي يسلمه له مفوض المشكلة
اعترف ماكلروي لاحقًا أن نقده كان غير عادل لانتقاده برنامج كنوث بناءاً على أسباب هندسية بينما كان غرض كنوث هو إظهار تقنية البرمجة المتعلمة فقط.  نشرت *كوميونيكيشنز أوف إيه سي إم* في عام 1987 مقالة متابعة توضح البرمجة المتعلمة مع برنامج سي الذي جمع بين النهج الفني لكنوث والنهج الهندسي لماكلروي مع نقد جون جيلبرت.

سير العمل
---------

تنفيذ البرمجة المتعلمة يتكون من خطوتين:

1. النسيج: عمل مجلد مفهوم عن البرنامج وصيانته.
2. التشابك: إنشاء شفرة تنفيذية آلية

مثال
----

مثال على البرمجة المتعلمة هو التنفيذ المتقن لبرنامج عد الكلمات القياسي في نظام Unix `wc`. قدم كنوث نسخة CWEB من هذا المثال في الفصل 12 من كتابه *المتعلق بالبرمجة الأدبية*. تمت إعادة استخدامه لاحقًا لأداة البرمجة المتعلمة noweb.  يقدم المثال توضيحًا للعناصر الأساسية للبرمجة المتعلمة.

### إنشاء وحدات الماكرو

يوضح المقتطف التالي من برنامج `wc` المتعلمة  كيفية استخدام العبارات الوصفية التعسفية في لغة طبيعية في برنامج متعلم لإنشاء وحدات ماكرو والتي تعمل كـ "مُشغلات" جديدة داخل لغة البرمجة المتعلمة وإخفاء أجزاء من التعليمات البرمجية أو غيرها وحدات الماكرو. علامات التدوين هي عبارة عن علامة التنصيص (" `<<...>>` ") تشير إلى وحدات الماكرو ، والرمز "`@` "يشير إلى نهاية قسم الكود في ملف noweb. يرمز الرمز "`<<*>>` "إلى "الجذر" ، وهي العقدة العليا التي ستبدأ أداة البرمجة المتعلمة في توسيع شبكة وحدات الماكرو منها. لكن يمكن كتابة الكود المصدري الموسع من أي قسم أو قسم فرعي (مثلاً: جزء من الشفرة المعينة كـ "`<<اسم الجزء>>=` "، بعلامة التساوي) ، لذلك يمكن أن يحتوي ملف برنامج واحد متعلم على عدة الملفات مع شفرة المصدر الآلية.

```
The purpose of wc is to count lines, words, and/or characters in a list of files. The
number of lines in a file is ......../more explanations/

Here, then, is an overview of the file wc.c that is defined by the noweb program wc.nw:
 <<\*>>=
 <<Header files to include>>
 <<Definitions>>
 <<Global variables>>
 <<Functions>>
 <<The main program>>
 @

We must include the standard I/O definitions, since we want to send formatted output
to stdout and stderr.
 <<Header files to include>>=
 #include <stdio.h>
 @

```
يمكن تفكيك الأجزاء في أي مكان في الملف النصي الخاص بالبرنامج المتعلم ، ليس بالضرورة بالترتيب التسلسلي في الجزء المرفق ولكن بناءاً على ماهو مطلوب بالمنطق المنعكس في النص التوضيحي الذي يغلف البرنامج بأكمله.

### البرنامج كصفحة ويب

وحدات الماكرو ليست "أسماء الأقسام" في الوثائق القياسية. تخفي وحدات ماكرو البرمجة المتعلمة المغزى الحقيقي من شفرتها، وتستخدم داخل أي مشغلي لغة الآلة منخفض المستوى ، غالبًا داخل عوامل منطقية مثل "`لو` "أو "آثناء "أو "حالة". يمكن ملاحظة ذلك في برنامج تعليم القراءة `wc`. 

```
The present chunk, which does the counting, was actually one of
the simplest to write. We look at each character and change state if it begins or ends
a word.

 <<Scan file>>=
 while (1) {
 <<Fill buffer if it is empty; break at end of file>>
 c = \*ptr++;
 if (c > ' ' && c < 0177) {
 /\* visible ASCII codes \*/
 if (!in\_word) {
 word\_count++;
 in\_word = 1;
 }
 continue;
 }
 if (c == '\n') line\_count++;
 else if (c != ' ' && c != '\t') continue;
 in\_word = 0;
 /\* c is newline, space, or tab \*/
 }
 @

```
ترمز وحدات الماكرو إلى أي جزء من التعليمات البرمجية أو وحدات ماكرو أخرى وهي أكثر انتشارا من "التقسيم" التنازلي أو التصاعدي ، أو التقسيم الفرعي. قال دونالد كنوثأنني أدركت أن البرنامج هو *شبكة* من أجزاء مختلفة. 

### قانون المنطق البشري لا المترجم

في برنامج تعلم القراءة والكتابة في noweb إلى جانب حرية ترتيب طريقة العرض يمكن تطوير الأجزاء الموجودة خلف وحدات الماكرو بمجرد إدخالها بـ "`<<...>>=` "يمكت وضعها في في أي مكان في الملف عن طريق كتابة "`<<اسم الجزء>>=` "وإضافة المزيد من المحتوى إليها ، كما يوضح المقتطف التالي (تمت إضافة" زيادة "بواسطة منسق المستند للاستعداية وليس للشفرة). 

```
 The grand totals must be initialized to zero at the beginning of the program.
If we made these variables local to main, we would have to do this initialization
explicitly; however, C globals are automatically zeroed. (Or rather,``statically
zeroed.'' (Get it?)

  <<Global variables>>+=
  long tot_word_count, tot_line_count,
     tot_char_count;
   /* total number of words, lines, chars */
  @

```

### سجل حبل الأفكار

تُنتج الوثائق الخاصة ببرنامج القراءة والكتابة كجزء من كتابة البرنامج بدلاً من التعليقات المقدمة كملاحظات جانبية لشفرة المصدر ويحتوي البرنامج المتعلم على شرح مفاهيم كل مستوى ،مع مفاهيم المستوى الأدنى منزلة إلى مكانها المناسب ، مما يسمح بتواصل أفضل للأفكار. تُظهر مقتطفات `wc` الملموسة أعلاه كيف يتشابك شرح البرنامج وشفرة المصدر الخاصة به. طريقة عرض الأفكارهذة تخلق تدفقًا للفكر يشبه العمل الأدبي. كتب كنوث "رواية" تشرح رمز لعبة الخيال التفاعلية Colossal Cave Adventure. 

### أمثلة رائعة

* اكسيوم ، الذي تم تطويره من scratchpad ، وهو نظام الجبر الحاسوبي الذي طورته شركة IBM. يتم تطويره الآن بواسطة تيم دالي ، أحد مطوري Scratchpad ، برنامج أكسيوم مكتوب بالكامل كبرنامج متعلم.

ممارسات البرمجة التعلمية
------------------------

أول بيئة برمجة متعلمة منشورة هي WEB ، التي قدمها كنوث في عام 1981 لنظام التنضيد TeX الخاص به ؛ تستخدم باسكال كلغة برمجة أساسية لها و TeX لتنضيد الوثائق. تم نشر شفرة مصدر TeX المعلق عليها بالكامل في *TeXالخاص بكنوث: البرنامج* ، المجلد B من 5 مجلدات *أجهزة الكمبيوتر والتنضيد*. استخدم كنوث بشكل خاص نظام برمجة متعلم يسمى DOC في بدايات عام 1979. استوحى أفكاره من أفكار بيير أرنول دي مارنيف.  CWEB المجاني ، الذي كتبه كنوث و سيلفيو ليفي ، هو WEB معدّل لـ C وC ++ ، ويعمل على معظم أنظمة التشغيل ويمكن أن ينتج وثائق TeX و PDF .

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

تحتوي أيضا على أدوات مفيدة مثل:

* محرر نصوص Leo الذي يعمل كمحررًا *تفصيليًا* يدعم ترميز noweb و CWEB الاختياري. يمزج مطور Leo بين طريقتين مختلفتين: أولاً ، Leo هو محرر الخطوط العريضة ، مما يساعد في إدارة النصوص الكبيرة. ثانيًا ، يدمج Leo بعض أفكار البرمجة المتعلمة ، والتي في شكلها النقي (على سبيل المثال ، طريقة استخدامها بواسطة أداة صفحة كنوث أو أدوات مثل "noweb") لكنهل ممكنه اذا احتوت على درجة معينة من الإبداع واستخدام المحرر بطريقة لم يتصورها مطورها. ومع ذلك ، فإن هذا الامتداد وغيره (عقد الملف @) يجعل برمجة المخطط التفصيلي وإدارة النص ناجحة وسهلة وبطريقة ما تشبه البرمجة المتعلمة.
* لغة البرمجة هاسكل لديها دعم أصلي للبرمجة شبه المتعلمة. الجامع/ المترجم يدعم اثنين من ملحقات اسم الملف: `.hs` و `.lhs` ؛ هذا الأخير يمثل برنامج هاسكل التعلمي.

يمكن أن تكون النصوص المتعلمة نص مصدر LaTeX كاملاً ، وفي نفس الوقت يمكن تجميعها ، دون أي تغييرات ، لأن المترجم يقوم فقط بتجميع النص في بيئة التعليمات البرمجية ، على سبيل المثال:

```
% here text describing the function:
\begin{code}
fact 0 = 1
fact (n+1) = (n+1) \* fact n
\end{code}
here more text

```

يمكن أيضًا وضع علامة على الكود بأسلوب ريتشارد بيرد ، حيث يبدأ كل سطر برمز أكبر من ومسافة ، يسبق وينتهي جزء الكود بأسطر فارغة.
توفر حزمة قوائم LaTeX `lstlisting` `listings` استخدامها لتزيين شفرة المصدر. يمكن استخدامه لتعريف بيئة `code` لاستخدامها داخل هاسكل لطباعة الرموز بالطريقة التالية:

```
\newenvironment{code}{\lstlistings[language=Haskell]}{\endlstlistings}

\begin{code}
comp :: (beta -> gamma) -> (alpha -> beta) -> (alpha -> gamma)
(g `comp` f) x = g(f x)
\end{code}

```

التي يمكن تهيئتها لإنتاج:
{\displaystyle {\begin{aligned}&comp::(\beta \to \gamma )\to (\alpha \to \beta )\to (\alpha \to \gamma )\\&(g\operatorname {comp} f)x=g(fx)\end{aligned}}}
على الرغم من أن الحزمة لا توفر وسيلة لتنظيم أجزاء من التعليمات البرمجية ، يمكن للمرء تقسيم كود مصدر LaTeX في ملفات مختلفة. انظر دليل القوائم للحصول على نظرة عامة.
* قام نظام الويب المتعلم 68 باستخدام Algol 68 كلغة برمجة أساسية ، على الرغم من عدم وجود شيء في برنامج `` tang '' يسمح باستخدام تلك اللغة.
* تتيح آلية التخصيص الخاصة بأولوية تشفير النص التي تتيح تقييد مخطط TEI أو تعديله أو توسيعه للمستخدمين مزج الوثائق نثراً مع أجزاء من المخطط في ملف شامل بكل شيء. من ملف النثر والمخطط و وخط المعالجة يمكن إنشاء برنامج كنوث للبرمجة التعلمية باعتباره مصدر الإلهام لطريقة العمل هذه.

أنظر أيضا
---------

* مولد التوثيق - معكوس البرمجة المتعلمة حيث يتم تضمين التوثيق في التعليمات البرمجية المصدر ويتم إنشاؤه من
* واجهة الكمبيوتر المحمول - بيئة دفتر الملاحظات الافتراضية المستخدمة في البرمجة المتعلمة
* Sweave and Knitr - أمثلة على استخدام أداة "noweb" مثل البرمجة المتعلمة داخل لغة R لإنشاء تقارير إحصائية ديناميكية
* كود التوثيق الذاتي - كود المصدر الذي يمكن فهمه بسهولة بدون توثيق

مراجع
-----

1. 1 2 3  **v** **w** **x** **y** **z** Knuth، Donald E. (1984). "Literate Programming" (PDF). *جمعية الحاسبات البريطانية*. ج. 27 ع. 2: 97–111. DOI:10.1093/comjnl/27.2.97. مؤرشف من الأصل (PDF) في 2023-07-16. اطلع عليه بتاريخ 2009-01-04.
2. ↑  Schulte، Eric (2012). "A Multi-Language Computing Environment for Literate Programming and Reproducible Research" (PDF). *Journal of Statistical Software*. ج. 46 ع. 3. DOI:10.18637/jss.v046.i03. مؤرشف من الأصل (PDF) في 2014-11-09. اطلع عليه بتاريخ 2020-05-30.
3. ↑ . ص. 1–11. `{{استشهاد بمنشورات مؤتمر}}`: الوسيط `|title=` غير موجود أو فارغ (مساعدة)
4. ↑  "I had the feeling that top-down and bottom-up were opposing methodologies: one more suitable for program exposition and the other more suitable for program creation. But after gaining experience with WEB, I have come to realize that there is no need to choose once and for all between top-down and bottom-up, because a program is best thought of as a web instead of a tree. A hierarchical structure is present, but the most important thing about a program is its structural relationships. A complex piece of software consists of simple parts and simple relations between those parts; the programmer's task is to state those parts and those relationships, in whatever order is best for human comprehension not in some rigidly determined order like top-down or bottom-up." — Donald E. Knuth, Literate Programming
5. ↑  If one remembers that the first version of the tool was called WEB, the amusing literary reference hidden by Knuth in these names becomes obvious: "Oh, what a tangled web we weave when first we practise to deceive" – والتر سكوت, in Canto VI, Stanza 17 of *Marmion* (1808) an epic poem about the معركة فلودين in 1513. – the actual citation appeared as an epigraph in a May 1986 article by Jon Bentley and Donald Knuth in one of the classical Programming Pearls columns in Communications of the ACM, vol 29 num 5 on p.365
6. ↑  "Literate Programming" (PDF). *archive.computerhistory.org*. مؤرشف من الأصل (PDF) في 2023-07-16. اطلع عليه بتاريخ 2019-06-03.
7. ↑  «"WEB's macros are allowed to have at most one parameter. Again, I did this in the interests of simplicity, because I noticed that most applications of multiple parameters could in fact be reduced to the one-parameter case. For example, suppose that you want to define something like... In other words, the name of one macro can usefully be a parameter to another macro. This particular trick makes it possible to..."»
8. 1 2  Knuth، Donald E.؛ Binstock، Andrew (25 أبريل 2008). "Interview with Donald Knuth". مؤرشف من الأصل في 2023-07-28. اطلع عليه بتاريخ 2009-01-04. Yet to me, literate programming is certainly the most important thing that came out of the تخ (برمجية) project. Not only has it enabled me to write and maintain programs faster and more reliably than ever before, and been one of my greatest sources of joy since the 1980s-it has actually been indispensable at times. Some of my major programs, such as the MMIX meta-simulator, could not have been written with any other methodology that I've ever heard of. The complexity was simply too daunting for my limited brain to handle; without literate programming, the whole enterprise would have flopped miserably. ... Literate programming is what you need to rise above the ordinary level of achievement.
9. ↑  «"Another surprising thing that I learned while using WEB was that traditional programming languages had been causing me to write inferior programs, although I hadn't realized what I was doing. My original idea was that WEB would be merely a tool for documentation, but I actually found that my WEB programs were better than the programs I had been writing in other languages."»
10. ↑  «"Thus the WEB language allows a person to express programs in a *"stream of consciousness" order*. TANGLE is able to scramble everything up into the arrangement that a PASCAL compiler demands. This feature of WEB is perhaps its greatest asset; it makes a WEB-written program much more readable than the same program written purely in PASCAL, even if the latter program is well commented. And the fact that there's no need to be hung up on the question of top-down versus bottom-up, since a programmer can now *view a large program as a web, to be explored in a **psychologically correct order** is perhaps the greatest lesson* I have learned from my recent experiences."»
11. ↑  ""Oral History of Donald Knuth"- an Interview with Ed Feigenbaum" (PDF). *archive.computerhistory.org*. مؤرشف من الأصل (PDF) في 2023-07-16. اطلع عليه بتاريخ 2018-12-07.
12. 1 2  Dominus، Mark-Jason (20 مارس 2000). "POD is not Literate Programming". *Perl.com*. مؤرشف من الأصل في 2009-01-02.
13. ↑  «"I chose the name WEB partly because it was one of the few three-letter words of English that hadn't already been applied to computers. But as time went on, I've become extremely pleased with the name, because I think that a complex piece of software is, indeed, best regarded as a web that has been delicately pieced together from simple materials. We understand a complicated system by understanding its simple parts, and by understanding the simple relations between those parts and their immediate neighbors. If we express a program as a web of ideas, we can emphasize its structural properties in a natural and satisfying way."»
14. ↑  Bentley، Jon؛ D. E. Knuth؛ M. D. McIlroy (1986). "Programming pearls" (PDF). *Communications of the ACM*. ج. 29 ع. 6: 471–483. DOI:10.1145/5948.315654. مؤرشف من الأصل (PDF) في 2023-07-16.
15. ↑  Mahoney، Michael S. (18 أغسطس 1989). "Interview with M. D. McIlroy". مؤرشف من الأصل في 2023-07-16.
16. ↑  Van Wyk، Christopher J.؛ Hanson، David R.؛ Gilbert، John (يوليو 1987). "Literate programming" (PDF). *Communications of the ACM*. ج. 30 ع. 7: 593–599. DOI:10.1145/28569.315738. مؤرشف من الأصل (PDF) في 2023-07-16.
17. 1 2 3 4  Ramsey، Norman (13 مايو 2008). "An Example of noweb". مؤرشف من الأصل في 2023-07-16. اطلع عليه بتاريخ 2009-01-04.
18. ↑  The game, also known as *ADVENT*, was originally written by Crowther in about 700 lines of FORTRAN code; Knuth recast it into the WEB idiom. It is available at literateprogramming.com or on Knuth's website نسخة محفوظة 2008-08-20 على موقع واي باك مشين..
19. ↑  de Marneffe، Pierre Arnoul (ديسمبر 1973). "Holon Programming – A Survey". *Missing Journal*: 135.
20. ↑  Ream، Edward K. (2 سبتمبر 2008). "Leo's Home Page". مؤرشف من الأصل في 2023-07-16. اطلع عليه بتاريخ 2015-04-03.
21. ↑  Mountbatten، Sian. "Web 68: Literate programming with Algol 68". مؤرشف من الأصل في 2013-01-20. اطلع عليه بتاريخ 2013-01-01.
22. ↑  "TEI Guidelines". *TEI Consortium*. مؤرشف من الأصل في 2018-08-22. اطلع عليه بتاريخ 2018-08-23.

قراءات إضافية
-------------

روابط خارجية
------------

* القراءة والكتابة في WikiWikiWeb
* الأسئلة الشائعة حول البرمجة المتعلمة في CTAN

قالب:Donald Knuth navbox

* أيقونة بوابةبوابة تقانة المعلومات
* أيقونة بوابةبوابة علم الحاسوب