الجمعة، 15 أبريل 2022

لمَ صمدت لغة البايثون في معركة الذكاء الصناعي؟

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

1-  بدايات شبه مبكرة 


في عام 1960 نشر جون مكارثي الجزء الأول من ورقة بحثية بعنوان "Recursive Functions of Symbolic Expressions and Their Computation by Machine" بالعربية تترجم ل "دوال ارتدادية للعبارات الرياضية وحسابهم بالآلة"، وفيها أوضح كيفية بناء لغة برمجة كاملة طبقا لمفاهيم آلان تورنج (أي أنها قادرة على حساب أي خوارزمية، وبالإنجليزية تسمى Turing complete) باستخدام مجموعة بسيطة ومحدودة من العمليات وتعريف ارتدادي للدوال (أي أن الدالة في تعريفها تقوم باستدعاء نفسها)، وسميت هذه اللغة ليسب (بالانجليزية LISP وهي اختصار لـ LISt Processor) وتعني معالج القائمة ولهذه التسمية سبب، فهي تعتبر كلا من الدوال والبيانات نفس الشيء، ففي ليسب تُعامل البيانات معاملة الدوال، فكلا منهم عبارة عن قائمة، والقائمة عبارة عن قوسين بينهما محتويات القائمة، وبذا يكون أبسط برامجها هو القائمة الفارغة (). 

احتوت اللغة على وسيلة لتعريف دالة، ومجموعة من الدوال البسيطة للتعامل مع القائمة كمثال دالة للحصول على أول عنصر في القائمة (CAR)، ودالة أخرى للحصول على بقية العناصر (CDR)، ولاتخاذ قرار بين نتيجتين يمكن القيام بذلك عن طريق دالة تقوم بالمقارنة وإعادة قيمة إحداهم أو استدعاء دالة أخرى (وهو ما يعادل استخدام إذا أو If الشرطية في لغات البرمجة الأخرى) ويقوم التعريف الارتدادي (recursive) للدوال بدور عملية التكرار في لغات البرمجة الأخرى، وهكذا نرى أن كل شيء في هذه اللغة يتمحور حول مفهوم الدوال واستدعاءها. وباستخدام هذه التعريفات الأولية البسيطة بيَّن مكارثي في ورقته البحثية أنه يمكن استخدام هذه اللغة البسيطة لتنفيذ أي خوارزمية. 

لم تكن ليسب مجرد فكرة في تلك الورقة البحثية، بل كانت لغة مستخدمة بالفعل في مختبرات إم. آي. تي  للذكاء الاصطناعي، فقد صممها مكارثي عام 1958، قبل كتابة الورقة البحثية بعامين، ولم تكن أول لغة تُستخدم للعمل في مجال الذكاء الصناعي فقد سبقتها لغة أخرى باسم "لغة معالجة المعلومات" IPL (بالانجليزية Information Processing Language)، وسبقت ليسب في استخدامها للقوائم والدوال الارتدادية (recusrive functions). 

اعتمدت ليسب وملهمتها من قبلها IPL على تصور معين ساد لفترة أبحاث الذكاء الصناعي، وهذا التصور وصل إليه كلا من العالمين ألان نيويل وهربرت سيمون (وهم أيضا من صمموا لغة IPL)، ويقوم هذا التصور على فكرة أن الذكاء في جوهره هو عمليات يقوم بها العقل على ما يرمز للأشياء (سمي هذا النظام باسم physical symbol system أي "نظام الرمز المادي" والمادي/أو الفزيائي تشير هنا لأن الرمز المستخدم يشير لشيء واقعي له خصائص يمكن قياسها والتعامل معها)، ولتتعامل لغة IPL مع هذه الرموز، استخدموا القائمة للتخزين والاسترجاع، وكذا الدوال الارتدادية (recursive functions)، ومن ثم جاءت ليسب من بعدها ولأنها قائمة على نفس المبدأ، استخدمت القائمة وتعريف الدوال الارتدادية وزادت عليهم خصائص أخرى عديدة.

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

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

ولكن قبل الاسترسال في الحديث، يحسن بنا أن نجيب عن سؤال مهم جدا، ألا وهو: لمَ احتاج الذكاء الصناعي للغة برمجة؟

وللإجابة على هذا السؤال البسيط، يحسن بنا أن نلقي نظرة سريعة على تاريخ فكرة آلة الكمبيوتر بشكل عام، ففيها تكمن الإجابة، أو أجزاء مهمة منها.

شعار لغة ليسب
شعار لغة ليسب



2 -  التاريخ يكرر نفسه


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

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

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

مع بدايات القرن العشرين والاستخدام الواسع للكهرباء في العديد من الآلات المختلفة، بدأت تظهر بعض المحاولات هنا وهناك لتحسين آلية عمل الآلات الحاسبة لجعلها أكثر مرونة وقادرة على القيام بعمليات مختلفة، ورغم أهمية بعض هذه المحاولات إلا أنها لم تشكل طفرة كبيرة في طريقة عمل هذه الآلات، رغم وجود الأساس النظري الذي يمكن أن تُبنى عليه آلة قابلة للبرمجة، ففي عام 1679 توصل لايبنتز لفكرة التمثيل الثنائي للأرقام، وفي عام 1847 نشر جورج بول أساسيات الجبر البولياني في كتابه "التحليل الرياضي للمنطق" وهو ما استخدمه لاحقا في كتاب "بحث قوانين التفكير" وبواسطته حصلنا لأول مرة على شكل رياضي للعمليات المنطقية، وفي عام 1936 نشر آلان تورينج ورقته البحثية التي وضح فيها رياضيا أنه يمكن القيام بحساب أي رقم عن طريق آلة نظرية (سميت آلة تورينج) (وهي نفس النتيجة التي توصل إليها ألونزوا تشرش في حساب اللامدا (Lambda calculus)) طالما يمكننا التعبير عن هذا الحساب بخطوات محددة (خوارزمية الحساب)، وهي نتائج مهدت بشكل كبير لظهور الحاسب الآلي كما نعرفه اليوم، فأهميتها تنبع من أنه يمكن التعبير عن هذه الحسابات المختلفة على شكل خطوات منطقية، وهذه النتائج يمكن بعد ذلك تغذيتها لدوال لتقوم بحسابات أخرى لتخرج نتائج أو لتستدعي دوال أخرى للقيام بها (وحتى تستدعي نفسها مرة أخرى للاستمرار في الحساب)، باختصار بدت ملامح طريق من خلاله يمكن السير عليه أو وضع الآلة عليه لتسير بمفردها لأول مرة مُسلحة بنظام عام للتعامل مع البيانات، هذا النظام سيطلق عليه لاحقا البرمجة، ففي عام 1941 اخترع كونراد سوزه أول كمبيوتر رقمي (يستخدم الأرقام الثنائية) وقابل للبرمجة بشكل عام (أي كامل طبقا لنظرية تورينج) وبعده توالت التحسينات والتطويرات المختلفة التي جعلت من تنفيذ عملية حسابية يستغرق ساعات لدقائق ثم ثوان وأجزاء منها لاحقا، لكن بشكل عام فُتِحَ الطريق للتطوير، فتحته النتائج النظرية التي بينت إمكانية حدوثه، وفتحه أكثر وأكثر الاكتشافات الكهربائية والالكترونية اللاحقة التي اختصرت الزمن والمساحة لأبعاد يصعب على العقل البشري قديما تخيل وجودها أو إمكانية قياسها.

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


Pilot ACE
Pilot ACE




3 -  ربيع الذكاء الصناعي وشتاءه


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

كان من بين الأبحاث المبكرة في هذا المجال، بحث نشره وارين ماكلا ووالتر بتس في عام 1943 بعنوان "A LOGICAL CALCULUS OF THE IDEAS IMMANENT IN NERVOUS ACTIVITY" (حساب منطقي للأفكار  الموجودة في نشاط عصبي) وفيها استخدموا نموذج مبسط يعتمد على أن النشاط العصبي إما يكون موجودا بشكل كامل أو غير موجود، لذا فيمكن نمذجة هذا النشاط العصبي بشكل رياضي منطقي (أو تحديدا بحساب القضايا، بالإنجليزية propositional logic)، وعليه وصفوا في هذه الورقة شبكات من الخلايا العصبية وكل خلية لها مشابك عصبية (synapse) وتتصل ببعضها البعض عن طريقها، ولتصل الخلية العصبية لمرحلة الإثارة فإن عددا معينا من تلك المشابك يجب أن يُثَار أولا، ووصفوا أشكالا مختلفة للتشبيك بين تلك الخلايا العصبية وكيف يمكن وصف سلوكها عن طريق العلاقات المنطقية بين مشابكها العصبية، واقترحوا أيضا قابلية بعض الشبكات للتعلم (وهنا التعلم في هذا السياق يشير إلى استجابة المشبك العصبي لمستوى تحفيزي لم يكن يستجيب له سابقا) وذلك اذا توافرت ظروف معينة في تصميم الشبكة العصبية (اقترحوا أن الليفة العصبية لو أُثيرت وتزامن ذلك مع إطلاق العصبون لشحنة، فإن الليفة ستكون قادرة على إثارة العصبون التالي لها وبالتالي ستشكل مشبك عصبي جديد). في عام 1949 عرض عالم النفس دونالد هيب في كتابه (Organization of Behavior) نظرية عن زيادة كفاءة المشابك العصبية، إذا أثر تحفيز مستمر أو متكرر في تركيب ونمو خليتين متجاورتين بمرور الوقت، فإن نوع من التحفيز والاستجابة المتبادلة بينهما سينشأ (والتعلم هنا يشير لنشوء مسار مشبكي جديد لم يكن موجودا في السابق وجاء كاستجابة لنشاط سابق). وبناءا على هذه النظريات قام مارفن منسكي ودين إدموندز ببناء أول آلة حاسبة بنظام الشبكات العصبية (Stochastic neural analog reinforcement calculator) في عام 1950، وفي نفس العام نشر تورينج بحث بعنوان "COMPUTING MACHINERY AND INTELLIGENCE" (آلية الحساب والذكاء) وفيها عرض اختباره الشهير لقياس ذكاء الآلة. وفي عام 1956 ظهر أول برنامج ذكاء صناعي حاسوبي باسم "Logic Theorist" صممه ألان نويل وهربرت سيمون وكليف شو، ولتصميم هذا البرنامج، قام مؤلفوه بإختراع لغة برمجة جديدة عرفت باسم IPL (لغة معالجة المعلومات Information Processing Language) واحتوت على مفاهيم ستؤثر لاحقا على تصميم اللغات التي ستليها كلغة ليسب البرمجية، واستطاع هذا البرنامج البرهنة على عدد من القضايا المنطقية (38 من أصل 52) من كتاب أسس الرياضيات لراسل ووايتهيد. لاحقا في عام 1958 صمم مكارثي لغة ليسب واستخدمها في الأبحاث والتجارب التي أجروها في مختبر إم. آي. تي للذكاء الصناعي.

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

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

ظهر لنظم تمثيل المعرفة استخدامات تجارية واسعة النطاق تسببت في حدوث إقبال كبير عليها، فظهر ما يسمى بالأنظمة الخبيرة (expert systems) وغطت مجالات حيوية كالطب حيث ساعدت في عمليات التشخيص، ومجال فهم اللغات البشرية، ومجال البيع والشراء في أنظمة التعامل مع العملاء، وبسبب انتشارها الواسع ظهرت لغات برمجة مخصصة لتلك الأنظمة كلغة البرولوج (Prolog) وعائلة لغات البلانار (PLANNER). للتعرف على حجم انتشار وتأثير الأنظمة الخبيرة يكفيك أن تعرف أنه في عام 1988 وفر نظام R1 الخبير ما يقارب 40 مليون دولارا لشركة ديجيتال DEC، وبحلول عام 1988 أصبح لدى مجموعة الذكاء الصناعي لشركة ديجيتال 40 نظاما خبيرا قيد الاستعمال وآخرون في طريقهم للاستعمال، وكان لشركة دبونت للكيماويات 100 نظام خبير و500 قيد التطوير وفروا على الشركة ما يقارب 10 مليون دولار سنويا، تقريبا كان لدى كل شركة كبرى في الولايات المتحدة مجموعتها الخاصة لأبحاث الذكاء الصناعي وكانت إما تستخدم نظاما خبيرا أو تعمل على تطوير إحداها، وباختصار شديد نمى سوق الذكاء الصناعي من بضع ملايين من الدولارات في عام 1980 لبلايين منها في عام 1988، من ضمنها كانت هناك شركات لتطوير نظم خبيرة وروبوتات وأنظمة روية وعتاد وبرامج مخصص لهذه الأغراض.

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

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

لكن أين موقع لغة البايثون من كل هذه التفاصيل؟ 

من بحث ماكلا وبتس عن الشبكات العصبية عام 1943.
من بحث ماكلا وبتس عن الشبكات العصبية عام 1943.




* ملحوظة: استفدت بشكل كبير من الفصل الأول من كتاب "Artificial Intelligence A Modern Approach" لمؤلفيه Stuart J. Russell و Peter Norvig، الطبعة الثالثة وبخاصة الجزء المعنون "THE HISTORY OF ARTICIAL INTELLIGENCE" بدءا من ص 16.

4- ليس كل صغير ضعيف


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

1- صمم كل برنامج ليقوم بشيء واحد وواحد فقط ولكن يقوم به بشكل جيد جدا، بدلا من إضافة تعقيد البرامج الموجودة بإضافة خصائص جديدة.
2- خرج أي برنامج من الممكن أن يصبح دخل برنامج آخر، فصمم برنامجك باحتمالية استدعائه من برامج أخرى.
3- يُفَضل التصميمات البسيطة والذكية ذات الحجم الصغير.

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

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

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

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

في أوائل التسعينات من القرن العشرين أصدر جيدو فان روسم أول نسخة من لغة البايثون، والتي اعتمدت مبادئ شبيهة بتلك التي اعتمدها نظام التشغيل يونكس، فالبساطة في الاستخدام كان أحد أهم دعائم هذه اللغة، كما احتوت على دعم للبرمجة كائنية التوجه (Object-oriented programming) وكذا دعمت البرمجة الوظيفية (Functional programming) بخصائص مقتبسة من لغة الليسب، كما احتوت أيضا على وسيلة لتوسعة اللغة بإضافة مكتبات خارجية لها وتوسعة اللغة عن طريق الإضافات التي يمكن كتابتها بلغة أخرى كالسي مثلا.

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

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

دينيس ريتشي وكين تومبسون (مطورو نظام اليونكس ولغة السي)
دينيس ريتشي وكين تومبسون (مطورو نظام اليونكس ولغة السي)


ليست هناك تعليقات:

إرسال تعليق