البرمجة المتعلمة

البرمجة المتعلمة هي نموذج برمجة تم تقديمه في عام 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 ، نشرت كوميونيكيشنز أوف إيه سي إم مقالة متابعة توضح البرمجة المتعلمة مع برنامج سي الذي يجمع بين النهج الفني لكنوث والنهج الهندسي لماكلروي ، مع نقد جون جيلبرت.

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

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

مثال 
المثال التقليدي للبرمجة المتعلمة هو التنفيذ المتقن لبرنامج عد الكلمات القياسي في نظام 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}
 التي يمكن تهيئتها لإنتاج:
 
 على الرغم من أن الحزمة لا توفر وسيلة لتنظيم أجزاء من التعليمات البرمجية ، يمكن للمرء تقسيم كود مصدر LaTeX في ملفات مختلفة. انظر دليل القوائم للحصول على نظرة عامة.

 قام نظام الويب المتعلم 68 باستخدام Algol 68 كلغة برمجة أساسية ، على الرغم من عدم وجود شيء في برنامج `` tang '' يسمح باستخدام تلك اللغة. 
 تتيح آلية التخصيص الخاصة بأولوية تشفير النص التي تتيح تقييد مخطط TEI أو تعديله أو توسيعه للمستخدمين مزج الوثائق نثراً مع أجزاء من المخطط في ملف شامل بكل شيء. من ملف النثر والمخطط و وخط المعالجة يمكن إنشاء برنامج كنوث للبرمجة التعلمية باعتباره مصدر الإلهام لطريقة العمل هذه.

أنظر أيضا 

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

مراجع

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

روابط خارجية 

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

أنماط برمجة
استحداثات متعلقة بالحواسيب في 1981