بنية وتفسير برامج الحاسوب › مقدّمة الكتاب 1 / 7 التالي

مقدّمة الكتاب

الإهداء

إنّ هذا الكتاب مُهدى، احترامًا وإعجابًا، إلى الرّوح التي تسكن الحاسوب.

“أرى أنّ من الأمور بالغة الأهمّيّة أن نُبقي روح المتعة في الحوسبة بيننا نحن العاملين في علوم الحاسوب. وحين بدأت هذه المسيرة، كانت المتعة فيها وفيرة. وبلا شكٍّ كان الزبائن الذين يدفعون أموالهم يتعرّضون للخذلان من حينٍ إلى آخر، وبعد مدّةٍ بدأنا نأخذ شكاواهم على محمل الجدّ. وحينها بدأنا نشعر كأنّنا مسؤولون فعلًا عن الاستخدام الناجح والخالي من الأخطاء والكامل لهذه الآلات. وأنا لا أظنّ ذلك. أظنّ أنّ مسؤوليّتنا تكمن في مدّ هذه الآلات إلى أقصى حدودها، وتوجيهها في اتجاهاتٍ جديدة، وإبقاء روح المتعة في هذا البيت. وآمل ألّا يفقد مجال علوم الحاسوب إحساسه بالمتعة أبدًا. وقبل كلّ شيء، آمل ألّا نتحوّل إلى مُبشّرين. فلا تشعروا كأنّكم باعة أناجيل؛ فقد سئم العالم من أمثالهم بما يكفي. وما تعرفونه عن الحوسبة سيتعلّمه الآخرون. فلا تحسّوا كأنّ مفتاح الحوسبة الناجحة في أيديكم وحدها. فما في أيديكم - كما أظنّ وآمل - هو الذّكاء: القدرة على أن ترى الآلة على أنّها أكثر ممّا ظننتها حين قُدِّمت إليك أوّل مرّة، وعلى أنّك قادر على أن تجعلها أكثر.” —Alan J. Perlis (April 1, 1922 – February 7, 1990)

تقدمة

المُعلّمون والجنرالات وأخصائيّو التغذية وعلماء النفس والآباء يُبرمجون. والجيوش والطلبة وبعض المجتمعات مُبرمَجة. والهجوم على المشكلات الكبرى يستخدم سلسلةً متتابعةً من البرامج، تنشأ معظمها في أثناء الطريق. وهذه البرامج تعجّ بقضايا تبدو خاصّةً بالمشكل قيد البحث. ولكي تُقدِّر البرمجة كنشاطٍ فكريٍّ قائمٍ بذاته، لا بدّ أن تتّجه إلى برمجة الحاسوب (computer programming)؛ فلا بدّ أن تقرأ برامج (programs) حاسوبيّة وتكتبها - وكثيرًا منها. والأمر لا يهمّ كثيرًا فيما تتعلّق هذه البرامج ولا في التطبيقات التي تُستخدم. بل المهمّ هو مدى جودة أدائها ومدى سلاسة انسجامها مع البرامج الأخرى في بناء برامج أعظم منها. وعلى المبرمج أن يسعى إلى إتقان الأجزاء وإلى كفاية المجموع. وفي هذا الكتاب يقتصر استخدام «البرنامج» على إنشاء البرامج المكتوبة بإحدى لهجات Lisp وتنفيذها على حاسوبٍ رقميّ ودراستها. وباستخدام Lisp لا نُقيّد ما قد نبرمجه، بل نُقيّد الرموز التي نصف بها برامجنا فقط.

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

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

بخلاف البرامج، لا بدّ أن تُطِيع الحواسيب قوانين الفيزياء. فإذا أرادت العمل بسرعة - بضع نانوثوانٍ لكلّ تغيّر حالة - فإنّها لا بدّ أن تنقل الإلكترونات لمسافاتٍ قصيرةٍ فقط (على الأكثر 1121 \frac{1}{2} قدم). والحرارة المتولّدة عن العدد الهائل من الأجهزة المُركَّزة بهذا القدر في الفضاء يجب إزالتها. وقد تطوّرت هندسةٌ بالغة الرُّقيّ تُوازن بين تعدّد الوظائف وكثافة الأجهزة. وعلى أيّ حال، فإنّ العتاد يعمل دائمًا بمستوًى أكثر بدائيّةً من المستوى الذي نرغب في البرمجة عنده. والعمليّات التي تحوّل برامج Lisp إلى برامج «آليّة» هي ذاتها نماذج مجرّدة نقوم نحن ببرمجتها. وإنّ دراستها وابتكارها يمنحاننا بصيرةً عميقةً في البرامج التنظيميّة المرتبطة ببرمجة النماذج الاعتباطيّة. وبالطبع يمكن نمذجة الحاسوب نفسه على هذا النحو. تأمّل هذا: فإنّ سلوك أصغر عنصر تحويل فيزيائيّ يُنمذَج بالميكانيكا الكمّيّة، الموصوفة بمعادلاتٍ تفاضليّةٍ يُلتقط سلوكها التفصيليّ بتقريباتٍ رقميّةٍ ممثَّلةٍ في برامج حاسوبيّةٍ تعمل على حواسيب مكوّنةٍ من ...!

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

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

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

وLisp يتغيّر. فاللهجة Scheme المستخدمة في هذا النصّ تطوّرت عن Lisp الأصليّة وتختلف عنها في نواحٍ مهمّةٍ عدّة، منها التحديد الساكن لنطاق ربط المتغيّرات، وإتاحة أن تُعيد الدوالّ دوالَّ كقيم. وفي بنائها الدلاليّ، فإنّ Scheme قريبة من Algol 60 بقدر ما هي قريبة من اللغات Lisp المبكّرة. وAlgol 60، التي لن تصير لغةً نشطةً بعد اليوم، تعيش في جينات Scheme وPascal. ومن الصعب أن تجد لغتين هما عملة تداول أكثر ثقافتين تباعدًا من الثقافتين التي تجمّعتا حول هاتين اللغتين. فPascal لبناء الأهرامات - بنياتٍ ثابتةً مهيبةً آخذةً للأنفاس تشيّدها جيوشٌ تدفع كتلًا ثقيلةً إلى مواضعها. وLisp لبناء الكائنات الحيّة - بنياتٍ ديناميكيّةً مهيبةً آخذةً للأنفاس تشيّدها فرقٌ صغيرةٌ تركّب ملايينَ متلاطمةً من كائناتٍ أبسط في مواضعها. والمبادئ التنظيميّة المستخدمة هي ذاتها في الحالتين، فيما عدا اختلافًا واحدًا بالغ الأهمّيّة: فإنّ الوظيفيّة التقديريّة القابلة للتصدير، الموكولة إلى المبرمج الفردانيّ في Lisp، أكبر بمرتبةٍ من حيث المقدار على ما توجد في مشاريع Pascal. وبرامج Lisp تنفخ المكتبات بدوالّ تتجاوز فائدتها التطبيق الذي أنتجها. والقائمة - بنية البيانات (data structure) الأصليّة في Lisp - مسؤولةٌ إلى حدٍّ كبيرٍ عن هذا النموّ في الفائدة. وبساطةُ بناء القوائم وقابليّةُ تطبيقها الطبيعيّة منعكستان في دوالَّ مدهشةٍ في خلوّها من التخصّص الفرديّ. وفي Pascal، فإنّ وفرة بنيات البيانات المُعلَنة تستدعي تخصّصًا داخل الدوالّ يُعيق التعاون العابر ويعاقب عليه. فالأولى أن تعمل 100 دالّة على بنية بياناتٍ واحدة من أن تعمل 10 دوالّ على 10 بنيات بيانات. ونتيجةً لذلك، لا بدّ أن يبقى الهرم بلا تغييرٍ لألف عام؛ أمّا الكائن الحيّ فلا بدّ أن يتطوّر أو يهلك.

ولتوضيح هذا الاختلاف، قارن بين معالجة المادّة والتمارين في هذا الكتاب ومعالجتها في أيّ نصٍّ لمقرّرٍ أوّليّ يستخدم Pascal. فلا تتعب نفسك بالوهم القائل إنّ هذا نصٌّ لا يُستوعب إلّا في MIT وحدها، وأنّه خاصٌّ بالسلالة القاطنة فيها. إنّه بالضبط ما يجب أن يكون عليه أيّ كتابٍ جادٍّ عن برمجة Lisp، أيًّا كان الطالب وأينما استُخدم.

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

وكما يُتوقّع من أهدافه، فإنّ بحث الذّكاء الاصطناعيّ يولّد مسائلَ برميّةً مهمّةً كثيرة. وفي ثقافاتٍ برميّةٍ أخرى، تُنجب هذه الموجة من المسائل لغاتٍ جديدة. والحقّ إنّه في أيّ مهمّةٍ برميّةٍ كبيرةٍ جدًّا، مبدأٌ تنظيميّ مفيد هو ضبط التداول داخل وحدات المهمّة وعزله عبر ابتكار اللغة. وهذه اللغات تميل إلى أن تصبح أقلّ بدائيّةً كلّما اقتربنا من حدود النظام الذي يتفاعل فيه نحن البشر أكثر من غيرنا. ونتيجةً لذلك، تحتوي هذه النظم على دوالّ معالجة لغةٍ معقّدةٍ مُكرَّرةٍ مراتٍ كثيرة. وLisp ذات نحوٍ ودلالاتٍ بسيطين إلى حدّ أنّ التحليل النحويّ يمكن معالجته كمهمّةٍ أوّليّة. وهكذا لا تلعب تقنيّة التحليل النحويّ دورًا يُذكر في برامج Lisp إلّا نادرًا، وبناء معالجات اللغة قلّما يعوق معدّل نموّ أنظمة Lisp الكبيرة وتغيّرها. وأخيرًا، فإنّ هذه البساطة ذاتها في النحو والدلالات هي المسؤولة عن العبء والحرّيّة التي يحملها جميع مبرمجي Lisp. فلا يمكن كتابة برنامج Lisp - أيًّا كان حجمه بما يتجاوز بضع أسطر - دون أن يتشبّع بدوالّ تقديريّة. اخترع ولاءم؛ وجُنّ وأعِد الاختراع! فنرفع كأسنا نخبًا لمبرمج Lisp الذي يرسم أفكاره بين أعشاش الأقواس.

Alan J. Perlis، نيو هيفن، كونيتيكت

تمهيد للطبعة الثانية

أيمكن أن تكون البرمجيّات لا تشبه أيّ شيء آخر، وأنّها مُعدّةٌ لإلقائها: وأنّ المقصد كلّه هو أن نراها دائمًا فقاعةَ صابون؟ —Alan J. Perlis

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

وفي إعداد هذه الطبعة، أدرجنا مئاتٍ من الإيضاحات المستنبطة من خبرتنا في التدريس ومن تعليقات الزملاء في MIT وخارجها. وأعدنا تصميم معظم نظم البرمجة الرئيسة في الكتاب، منها نظام الحساب المعمّم، والمفسّرات، ومحاكي آلة السجلات، والمُصرِّف؛ وأعدنا كتابة جميع أمثلة البرامج لضمان أنّ أيّ تنفيذٍ لـScheme متوافقٌ مع معيار IEEE Scheme (IEEE 1990) يكون قادرًا على تشغيل الشيفرة.

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

لقد تابعت الطبعة الأولى من الكتاب منهج مقرّرنا الفصليّ الواحد في MIT عن كثب. ومع كلّ المادّة الجديدة في الطبعة الثانية، فلن يكون ممكنًا تغطية كلّ شيءٍ في فصلٍ واحد، وسيكون على المدرّس أن ينتقي ويختار. وفي تدريسنا نحن، نتجاوز أحيانًا القسم الخاصّ بالبرمجة المنطقيّة (4.4)، ونجعل الطلبة يستخدمون محاكي آلة السجلات ولكنّنا لا نغطّي تنفيذه (5.2)، ولا نعطي إلّا لمحةً عابرةً عن المُصرِّف (5.5). ومع ذلك، فما زال هذا مقرّرًا مكثّفًا. وقد يرغب بعض المدرّسين في تغطية الأبواب الثلاثة أو الأربعة الأولى فقط، تاركين المادّة الأخرى لمقرّراتٍ لاحقة.

ويُقدّم موقع World-Wide-Web http://mitpress.mit.edu/sicp دعمًا لمستخدمي هذا الكتاب. ويشمل ذلك برامج من الكتاب، وتكليفاتٍ برميّةً نموذجيّةً، وموادّ تكميليّةً، وتنفيذاتٍ قابلةً للتنزيل من لهجة Scheme المأخوذة من Lisp.

تمهيد للطبعة الأولى

الحاسوب كالكمان. ويمكنك أن تتخيّل مبتدئًا يجرب أوّلًا الغراموفون ثمّ الكمان، فيقول عن هذا الأخير إنّ صوته فظيع. وهذه هي الحُجّة التي سمعناها من إنسانيّينا ومن معظم علماء الحاسوب عندنا. إنّ برامج الحاسوب - كما يقولون - جيّدةٌ لأغراضٍ خاصّة، لكنّها غير مرنة. والكمان كذلك، وآلة الكاتبة كذلك، إلى أن تتعلّم كيف تستخدمها. —Marvin Minsky، لماذا تُعدّ البرمجة وسطًا حسنًا للتعبير عن أفكارَ مُفهمَمةٍ فهمًا رديئًا وصياغتها صياغةً غامضة

إنّ «بنية البرامج الحاسوبيّة وتفسيرها» هو المقرّر التمهيديّ في علوم الحاسوب في معهد ماساتشوستس للتكنولوجيا. وهو مقرّرٌ إلزاميّ لجميع طلبة MIT الذين يَتخصّصون في الهندسة الكهربائيّة أو في علوم الحاسوب، بوصفه ربع «المنهج الجوهريّ المشترك»، الذي يشمل أيضًا مقرّرَين في الدوائر والأنظمة الخطيّة ومقرّرًا في تصميم النظم الرقميّة. وقد شاركنا في تطوير هذا المقرّر منذ عام 1978، ودرّسنا هذه المادّة بشكلها الحاليّ منذ خريف عام 1980 لنحو 600 إلى 700 طالبٍ كلّ عام. ومعظم هؤلاء الطلبة لم يكن لهم تدريبٌ رسميّ سابق أو يكاد في الاحتساب، وإن كان كثيرٌ منهم قد لعب بالحواسيب قليلًا وقليلٌ منهم قد امتلك خبرةً واسعةً في البرمجة أو في تصميم العتاد.

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

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

وهذه المهارات ليست بخصيصة البرمجة الحاسوبيّة بأيّ حال. فالتقنيّات التي نُدرّسها ونستند إليها مشتركةٌ بين جميع أقسام التصميم الهندسيّ. نحن نتحكّم في التعقيد ببناء تجريدات (abstractions) تُخفي التفاصيل عند الحاجة. ونحن نتحكّم في التعقيد بإرساء واجهاتٍ اصطلاحيّةٍ تُتيح لنا بناء النظمّ بجمع قطعٍ قياسيّةٍ مفهومةٍ فهمًا حسنًا على طريقة «امزج وطابق». ونحن نتحكّم في التعقيد بإنشاء لغاتٍ جديدةٍ لوصف التصميم، تُبرز كلٌّ منها جوانبَ معيّنةً من التصميم وتُخفي أهمّيّة الجوانب الأخرى.

ويتأسّس منهجنا لهذا المقرّر على اقتناعنا بأنّ «علوم الحاسوب» ليست علمًا، وبأنّ أهمّيّتها لا علاقةَ تذكر لها بالحواسيب. والثورة الحاسوبيّة ثورةٌ في طريقة تفكيرنا وفي طريقة التعبير عمّا نفكّر فيه. وجوهر هذا التحوّل هو بزوغ ما يمكن تسمّيته على أحسن وجه المعرفة الإجرائيّة (procedural epistemology) - أي دراسة بنية المعرفة من وجهة نظر أمريّة، بخلاف وجهة النظر الإعلانيّة الأكثر التي تتخذها الموادّ الرياضيّة الكلاسيكيّة. فالرياضيّات تُقدّم إطارًا للتعامل بدقّةٍ مع مفاهيم «ما هو». والاحتساب يُقدّم إطارًا للتعامل بدقّةٍ مع مفاهيم «كيف».

وفي تدريس مادّتنا نستخدم لهجةً من لغة البرمجة Lisp. ونحن لا نُدرّس اللغة رسميًّا أبدًا، لأنّنا لسنا في حاجةٍ إلى ذلك. فنحن نستخدمها فحسب، ويتقن الطلبة التقاطها في أيّامٍ قليلة. وهذه ميزةٌ كبرى للغات الشبيهة بـLisp: فلها طرائقُ قليلةٌ جدًّا في تكوين التعابير المركّبة (compound expressions)، وشبه لا بنيةٍ نحويّة. ويمكن تغطية جميع الخصائص الرسميّة في ساعةٍ واحدة، كقواعد الشطرنج. وبعد وقتٍ قصير ننسى التفاصيل النحويّة للغة - لأنّه لا توجد منها شيء - وننتقل إلى القضايا الحقيقيّة: تحديد ما نريد احتسابه، وكيف سنُفكّك المسائل إلى أجزاءٍ قابلةٍ للإدارة، وكيف سنعمل على تلك الأجزاء. وميزةٌ أخرى لـLisp هي أنّها تدعم - دون أن تُفرض - استراتيجيّات التفكيك الوحدانيّ واسع النطاق للبرامج أكثر من أيّ لغةٍ أخرى نعرفها. فيمكننا بناء التجريدات الإجرائيّة وتجريدات البيانات، ويمكننا استخدام الدوالّ ذات الرتبة الأعلى لالتقاط أنماط الاستخدام الشائعة، ونمذجة الحالة الموضعيّة بالإسناد (assignment) وتحوير البيانات، وربط أجزاء البرنامج بالتيارات والتقييم المؤجّل، وتنفيذ اللغات المدمجة بسهولة. وكلّ هذا مندمجٌ في بيئةٍ تفاعليّةٍ ذات دعمٍ ممتازٍ للتصميم والبناء والاختبار وتنقيح البرامج تصاعديًّا. ونشكر جميع أجيال سحرة Lisp، بدءًا بـJohn McCarthy، الذين صاغوا أداةً رفيعةً ذات قوّةٍ وأناقةٍ لا سابقة لهما.

وScheme، لهجة Lisp التي نستخدمها، محاولةٌ للجمع بين قوّة Lisp وأناقة Algol. ومن Lisp نأخذ القوّة ما وراء اللغويّة الناشئة عن البساطة النحويّة، والتمثيل الموحّد للبرامج ككائنات بيانات، والبيانات المخصَّصة على الكومة والمُحرَّرة بجامع القمامة. ومن Algol نأخذ التحديد المعجميّ للنطاق والبنية الكتليّة، وهما عطيّتان من روّاد تصميم لغات البرمجة الذين كانوا في لجنة Algol. ونودّ أن نذكر John Reynolds وPeter Landin لبصيرتهما في علاقة حساب لامدا (λ-calculus) التابع لـChurch ببنية لغات البرمجة. ونُقرّ بدَيننا للرياضيّين الذين مسحوا هذه الأرض قبل عقودٍ من ظهور الحواسيب على المسرح. وهؤلاء الروّاد يشملون Alonzo Church وBarkley Rosser وStephen Kleene وHaskell Curry.

شكر وتقدير

نودّ أن نشكر العديدين الذين ساعدونا في تطوير هذا الكتاب وهذا المنهج.

ومقرّرنا وريثٌ فكريٌّ واضح لمقرّر «6.231»، ذلك المقرّر الرائع عن لغويّات البرمجة وλ-calculus الذي دُرّس في MIT في أواخر ستّينيّات القرن العشرين على يد Jack Wozencraft وArthur Evans, Jr.

ونحن مدينةٌ بفضلٍ كبيرٍ لـRobert Fano، الذي أعاد تنظيم منهج MIT التمهيديّ في الهندسة الكهربائيّة وعلوم الحاسوب ليُبرز مبادئ التصميم الهندسيّ. وقد قادنا في الانطلاق في هذا المشروع وكتب أوّل مجموعةٍ من ملاحظات المقرّر التي تطوّر منها هذا الكتاب.

وقد تطوّر معظم أسلوب البرمجة وجمالها الذي نسعى إلى تدريسه بالتعاون مع Guy Lewis Steele Jr.، الذي شارك Gerald Jay Sussman في التطوير الأوّليّ للغة Scheme. وبالإضافة إلى ذلك، فقد علّمنا David Turner وPeter Henderson وDan Friedman وDavid Wise وWill Clinger العديد من تقنيّات مجتمع البرمجة الوظيفيّة الواردة في هذا الكتاب.

وعلّمنا Joel Moses كيف نُبنّي النظمّ الكبيرة. وقد منحتنا خبرته مع نظام Macsyma للحوسبة الرمزيّة البصيرة بأنّه ينبغي تجنّب تعقيدات التحكّم والتّركيز على تنظيم البيانات ليعكس البنية الحقيقيّة للعالم الذي نُمذّجه.

وشكّل Marvin Minsky وSeymour Papert العديد من مواقفنا تجاه البرمجة ومكانتها في حياتنا الفكريّة. وإليهما نَدينُ بالفهم القائل إنّ الاحتساب يُقدّم وسيلةَ تعبيرٍ للاستكشاف أفكارَ كانت معقّدةً للغاية بحيث لا يمكن التعامل معها بدقّةٍ لولا ذلك. وهما يؤكّدان أنّ قدرة الطالب على كتابة البرامج وتعديلها تُقدّم وسطًا قويًّا يصبح فيه الاستكشاف نشاطًا طبيعيًّا.

ونحن نتّفق بشدّة مع Alan Perlis على أنّ البرمجة ممتعةٌ للغاية، وأنّه يتحتّم علينا أن نحرص على دعم متعة البرمجة. وجزءٌ من هذه المتعة ينبع من مشاهدة الأساتذة الكبار وهم يعملون. وإنّنا لمحظوظون بأنّنا كنّا مبرمجَين متدرّبَين عند قدمي Bill Gosper وRichard Greenblatt.

ومن الصعب حصر جميع الذين ساهموا في تطوير منهجنا. ونشكر جميع المحاضرين ومدرّسي الحصص التمرينيّة والمُرَبّين الذين عملوا معنا على مدى السنوات الخمس عشرة الماضية وبذلوا ساعاتٍ إضافيّةً كثيرةً في مقرّرنا، لا سيّما Bill Siebert وAlbert Meyer وJoe Stoy وRandy Davis وLouis Braida وEric Grimson وRod Brooks وLynn Stein وPeter Szolovits. ونودّ أن نُخصّ بالشكر المساهمات التعليميّة البارزة لـFranklyn Turbak، وهو الآن في Wellesley؛ فقد رسم عمله في تعليم المرحلة الجامعيّة الأولى معيارًا يمكننا جميعًا أن نطمح إليه. ونحن ممتنون لـJerry Saltzer وJim Miller لمساعدتنا على كشف أسرار التزامن، ولـPeter Szolovits وDavid McAllester لمساهمتهما في شرح التقييم غير الحتميّ في Chapter 4.

وبذل العديدون جهدًا جسيمًا في تقديم هذه المادّة في جامعاتٍ أخرى. وبعض من عملنا معهم عن كثبٍ هم Jacob Katzenelson في Technion، وHardy Mayer في جامعة كاليفورنيا في Irvine، وJoe Stoy في Oxford، وElisha Sacks في Purdue، وJan Komorowski في الجامعة النرويجيّة للعلوم والتكنولوجيا. ونحن فخورون بشكلٍ استثنائيّ بزملائنا الذين نالوا جوائز تعليميّة كبرى على اقتباساتهم لهذا المقرّر في جامعاتٍ أخرى، ومنهم Kenneth Yip في Yale، وBrian Harvey في جامعة كاليفورنيا في Berkeley، وDan Huttenlocher في Cornell.

وقد رتّب Al Moyé لنا أن نُدرّس هذه المادّة لمهندسي Hewlett-Packard، ولإنتاج أشرطة فيديو لهذه المحاضرات. ونودّ أن نشكر المدرّسين الموهوبين - وبالذات Jim Miller وBill Siebert وMike Eisenberg - الذين صمّموا مقرّرات التعليم المستمرّ التي تُدمج هذه الأشرطة ودرّسوها في جامعاتٍ وفي الصناعة في جميع أنحاء العالم.

وبذل العديد من المعلّمين في بلدانٍ أخرى عملًا جسيمًا في ترجمة الطبعة الأولى. فأنتج Michel Briand وPierre Chamard وAndré Pic طبعةً فرنسيّةً؛ وأنتجت Susanne Daniels-Herold طبعةً ألمانيّةً؛ وأنتج Fumio Motoyoshi طبعةً يابانيّةً. ولا نعرف من أنتج الطبعة الصينيّة، لكنّنا نعتبره شرفًا لنا أن نكون قد اختيرنا موضوعًا لترجمةٍ «غير مُصرَّحٍ بها».

ومن الصعب تعداد جميع الذين قدّموا مساهماتٍ تقنيّةً في تطوير نظمّ Scheme التي نستخدمها لأغراضٍ تعليميّةٍ. وبالإضافة إلى Guy Steele، فقد كان من أبرز السحرة Chris Hanson وJoe Bowbeer وJim Miller وGuillermo Rozas وStephen Adams. وآخرون بذلوا وقتًا جسيمًا هم Richard Stallman وAlan Bawden وKent Pitman وJon Taft وNeil Mayle وJohn Lamping وGwyn Osnos وTracy Larrabee وGeorge Carrette وSoma Chaudhuri وBill Chiarchiaro وSteven Kirsch وLeigh Klotz وWayne Noss وTodd Cass وPatrick O’Donnell وKevin Theobald وDaniel Weise وKenneth Sinclair وAnthony Courtemanche وHenry M. Wu وAndrew Berlin وRuth Shyu.

وإلى جانب تنفيذ MIT، نودّ أن نشكر العديدين الذين عملوا على معيار IEEE Scheme، ومنهم William Clinger وJonathan Rees اللذين حرّرا R⁴RS، وChris Haynes وDavid Bartley وChris Hanson وJim Miller الذين أعدّوا معيار IEEE.

وكان Dan Friedman قائدًا منذ زمنٍ طويلٍ لمجتمع Scheme. وإنّ العمل الأوسع للمجتمع يتجاوز قضايا تصميم اللغة ليضمّ ابتكاراتٍ تعليميّةً مهمّة، كمنهج المرحلة الثانويّة المبنيّ على EdScheme من إنتاج Schemer’s Inc.، والكتب الرائعة لما Mike Eisenberg ولـBrian Harvey وMatthew Wright.

ونُقدّر عمل الذين أسهموا في جعل هذا كتابًا حقيقيًّا، وخاصّةً Terry Ehling وLarry Cohen وPaul Bethge في MIT Press. وقد وجدت Ella Mazel صورة الغلاف الرائعة. وبالنسبة للطبعة الثانية فإنّنا ممتنون بشكلٍ خاصّ لـBernard وElla Mazel لمساعدتهما في تصميم الكتاب، ولـDavid Jones، ساحر TeX الفذّ. ونحن أيضًا مَدينون لأولئك القرّاء الذين أدلوا بتعليقاتٍ نافذةٍ على المسوّدة الجديدة: Jacob Katzenelson وHardy Mayer وJim Miller، وخاصّةً Brian Harvey الذي فعل بهذا الكتاب كما فعلت Julie بكتابه Simply Scheme.

وأخيرًا، نودّ أن نُقرّ بدعم المنظّمات التي شجّعت هذا العمل على مرّ السنين، ومنه الدعم المقدّم من Hewlett-Packard بفضل Ira Goldstein وJoel Birnbaum، والدعم المقدّم من DARPA بفضل Bob Kahn.