البرمجة المتعلمة (ذاتية التعلم)  البرمجة المتعلمة هي نموذج برمجة تم تقديمه في عام 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 codice_1 . قدم كنوث نسخة CWEB من هذا المثال في الفصل 12 من كتابه "المتعلق بالبرمجة الأدبية" . تمت إعادة استخدامه لاحقًا لأداة البرمجة المتعلمة noweb . يقدم المثال توضيحًا للعناصر الأساسية للبرمجة المتعلمة.  يوضح المقتطف التالي من برنامج codice_1 المتعلمة كيفية استخدام العبارات الوصفية التعسفية في لغة طبيعية في برنامج متعلم لإنشاء وحدات ماكرو والتي تعمل كـ "مُشغلات" جديدة داخل لغة البرمجة المتعلمة وإخفاء أجزاء من التعليمات البرمجية أو غيرها وحدات الماكرو. علامات التدوين هي عبارة عن علامة التنصيص (" codice_3 ") تشير إلى وحدات الماكرو ، والرمز " codice_4 " يشير إلى نهاية قسم الكود في ملف noweb. يرمز الرمز " codice_5 " إلى "الجذر" ، وهي العقدة العليا التي ستبدأ أداة البرمجة المتعلمة في توسيع شبكة وحدات الماكرو منها. لكن يمكن كتابة الكود المصدري الموسع من أي قسم أو قسم فرعي (مثلاً: جزء من الشفرة المعينة كـ " codice_6 " ، بعلامة التساوي) ، لذلك يمكن أن يحتوي ملف برنامج واحد متعلم على عدة الملفات مع شفرة المصدر الآلية. 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:  We must include the standard I/O definitions, since we want to send formatted output to stdout and stderr. يمكن تفكيك الأجزاء في أي مكان في الملف النصي الخاص بالبرنامج المتعلم ، ليس بالضرورة بالترتيب التسلسلي في الجزء المرفق ولكن بناءاً على ماهو مطلوب بالمنطق المنعكس في النص التوضيحي الذي يغلف البرنامج بأكمله.  وحدات الماكرو ليست "أسماء الأقسام" في الوثائق القياسية. تخفي وحدات ماكرو البرمجة المتعلمة المغزى الحقيقي من شفرتها، وتستخدم داخل أي مشغلي لغة الآلة منخفض المستوى ، غالبًا داخل عوامل منطقية مثل " codice_7 " أو " آثناء " أو " حالة". يمكن ملاحظة ذلك في برنامج تعليم القراءة codice_1 .  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.  ترمز وحدات الماكرو إلى أي جزء من التعليمات البرمجية أو وحدات ماكرو أخرى وهي أكثر انتشارا من "التقسيم" التنازلي أو التصاعدي ، أو التقسيم الفرعي. قال دونالد كنوثأنني أدركت أن البرنامج هو "شبكة" من أجزاء مختلفة.   في برنامج تعلم القراءة والكتابة في noweb إلى جانب حرية ترتيب طريقة العرض يمكن تطوير الأجزاء الموجودة خلف وحدات الماكرو بمجرد إدخالها بـ " codice_9 " يمكت وضعها في في أي مكان في الملف عن طريق كتابة " codice_6 "وإضافة المزيد من المحتوى إليها ، كما يوضح المقتطف التالي (تمت إضافة" زيادة "بواسطة منسق المستند للاستعداية وليس للشفرة). 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?)  تُنتج الوثائق الخاصة ببرنامج القراءة والكتابة كجزء من كتابة البرنامج بدلاً من التعليقات المقدمة كملاحظات جانبية لشفرة المصدر ويحتوي البرنامج المتعلم على شرح مفاهيم كل مستوى ،مع مفاهيم المستوى الأدنى منزلة إلى مكانها المناسب ، مما يسمح بتواصل أفضل للأفكار. تُظهر مقتطفات codice_1 الملموسة أعلاه كيف يتشابك شرح البرنامج وشفرة المصدر الخاصة به. طريقة عرض الأفكارهذة تخلق تدفقًا للفكر يشبه العمل الأدبي. كتب كنوث "رواية" تشرح رمز لعبة الخيال التفاعلية Colossal Cave Adventure .    أول بيئة برمجة متعلمة منشورة هي WEB ، التي قدمها كنوث في عام 1981 لنظام التنضيد TeX الخاص به ؛ تستخدم باسكال كلغة برمجة أساسية لها و TeX لتنضيد الوثائق. تم نشر شفرة مصدر TeX المعلق عليها بالكامل في "TeXالخاص بكنوث: البرنامج" ، المجلد B من 5 مجلدات "أجهزة الكمبيوتر والتنضيد" . استخدم كنوث بشكل خاص نظام برمجة متعلم يسمى DOC في بدايات عام 1979. استوحى أفكاره من أفكار بيير أرنول دي مارنيف . CWEB المجاني ، الذي كتبه كنوث و سيلفيو ليفي ، هو WEB معدّل لـ C وC ++ ، ويعمل على معظم أنظمة التشغيل ويمكن أن ينتج وثائق TeX و PDF .  هناك العديد من التطبيقات الأخرى لمفهوم البرمجة المتعلمة كما هو موضح أدناه. يغلب على أحدثهن عدم وجود وحدات ماكرو لديهن وبالتالي ينتهكون ترتيب مبدأ المنطق البشري ، مما يجعلهم أكثر أدوات شبه متعلمة. ومع ذلك ، فإنهن يسمحن بالتنفيذ الخلوي للشفرة مما يجعلهاأقرب لأدوات البرمجة الاستكشافية .  تحتوي أيضا على أدوات مفيدة مثل:   % here text describing the function: fact 0 = 1 fact (n+1) = (n+1) * fact n here more text  comp :: (beta -> gamma) -> (alpha -> beta) -> (alpha -> gamma)