تاريخ البرمجة: من لغة الآلة إلى البرمجيات الحديثة
تاريخ البرمجة مرويّاً كسلسلة من المشكلات لا كقائمة تواريخ — لماذا اختُرعت كل طبقة تجريد، وما الذي يتنبّأ به هذا النمط عن الأدوات الوافدة الآن.
محتويات المقال
من السهل التعامل مع تاريخ البرمجة كمعلومات عابرة — قائمة لغات وسنوات ظهورها. وبهذه القراءة يسهل نسيانه. لكن بقراءته كسلسلة من المشكلات، يصبح مفيداً فعلاً، لأن كل عُرف تتبعه اليوم تقريباً وُجد كإجابة على قيد محدّد اصطدم به أحدهم قبل عقود. وفهم سبب اختراع الشيء يخبرك متى يتوقّف عن الانطباق.
قبل أن تنفصل البرمجيات عن العتاد
الأساس المفاهيمي يسبق الحواسيب الإلكترونية. في القرن التاسع عشر صمّم تشارلز بابيج محرّكات حوسبة ميكانيكية، وكتبت آدا لوفلايس ملاحظات تصف كيف يمكن لآلة كهذه أن تتّبع سلسلة من العمليات لحساب النتائج — وهو ما يُعدّ على نطاق واسع أول وصف لخوارزمية موجّهة لآلة. والفكرة الحاسمة كانت أن سلوك الآلة يمكن وصفه بمعزل عن الآلة نفسها.
وفي ثلاثينيات وأربعينيات القرن العشرين اكتسبت الفكرة شكلاً صورياً. قدّم نموذج آلان تورينغ للحوسبة وصفاً دقيقاً لما يمكن لآلة حسابه أصلاً، ومعمارية البرنامج المخزَّن — إبقاء التعليمات في الذاكرة إلى جانب البيانات — عنت أن الحاسوب يمكن توجيهه إلى مهمة جديدة بتحميل تعليمات مختلفة بدلاً من إعادة توصيله فيزيائياً. تلك هي اللحظة التي تصبح فيها البرمجيات شيئاً تكتبه لا شيئاً تبنيه.
لغة الآلة ولغة التجميع
كُتبت أوائل البرامج بلغة الآلة: تعليمات رقمية خام ينفّذها المعالج مباشرة. وهي تعمل، لكنها بائسة. الأرقام لا تحمل معنى للقارئ، ورقم واحد في غير موضعه يعني خللاً بلا أي دليل مرفق، وكل ما تكتبه مقيّد بمعالج واحد بعينه.
كانت لغة التجميع أول طبقة تخفيف. فبدلاً من رقم تكتب اختصاراً قصيراً، ويترجمه المُجمِّع. والتعليمات تقابل عمليات الآلة بنسبة واحد إلى واحد تقريباً، فلا شيء مخفي — لكن الشيفرة صارت أخيراً مقروءة لإنسان. والنمط الذي سيتكرّر طوال السبعين عاماً التالية يظهر هنا تماماً: أضف طبقة تجريد، تكسب قدرة على التعبير، وتتنازل عن بعض التحكّم المباشر.
أوائل اللغات عالية المستوى
في خمسينيات القرن العشرين صار السؤال هو ما إذا كانت الآلة تستطيع ترجمة شيء أقرب إلى الصياغة البشرية إلى لغة آلة بجودة كافية للاستخدام العملي. أظهرت FORTRAN، الموجّهة للعمل العلمي والعددي، أن المُصرِّف يستطيع إنتاج شيفرة سريعة بما يكفي لتستحق الاستخدام — وهو الجزء المتنازع عليه آنذاك. ثم تلتها COBOL بهدف مختلف: معالجة بيانات الأعمال، بصياغة مُسهبة عمداً وقريبة من الإنجليزية بقصد أن تكون مقروءة لغير المتخصّصين.
وكلتاهما لا تزالان تعملان في الإنتاج في مكان ما اليوم، وهي حقيقة تستحق التوقّف عندها. فالبرمجيات التي تحلّ مشكلة حقيقية ويستمرّ صيانتها تعمّر أطول من كل التوقّعات تقريباً بشأن تقادمها.
لغة C ونظام Unix وقابلية النقل
أصابت لغة C، التي طُوِّرت في أوائل السبعينيات إلى جانب Unix، توازناً تبيّن أنه معمّر بشكل استثنائي. فهي قريبة من العتاد بما يكفي لتكون سريعة ومتوقّعة، ومهيكلة بما يكفي لكتابة برامج كبيرة بها، وقابلة للنقل بما يكفي لتصريف الشيفرة نفسها لآلات مختلفة. وكون Unix مكتوباً بلغة C إلى حدّ كبير أثبت الفكرة: لم يعد نظام التشغيل مضطراً لإعادة كتابته من الصفر مع كل معالج جديد.
أسهل ما يُرى فيه تأثير C هو الصياغة. الأقواس المعقوفة للكتل، والفاصلة المنقوطة لإنهاء العبارات، وشكل حلقة for، وتسمية الأنواع البدائية — كلها تظهر في C++ و Java و JavaScript و PHP و C# و Go وغيرها كثير. وتعلّم إحداها يجعل سطح البقية مألوفاً على الفور.
الكائنات ومشكلة الحجم
مع نمو البرامج من آلاف إلى ملايين الأسطر، توقّف العامل المحدِّد عن كونه سرعة الآلة وصار الفهم البشري. وكانت البرمجة كائنية التوجّه هي الاستجابة المهيمنة: اجمع البيانات مع العمليات التي تجري عليها، وأخفِ التفاصيل الداخلية خلف واجهة، ودع جزءاً من النظام يتغيّر دون أن تلاحظ البقية.
وسّعت C++ لغة C بالأصناف وأكثر بكثير، محافظةً على خصائص الأداء مع إضافة البنية. ثم وصلت Java في منتصف التسعينيات بوعد مختلف: تشغيل الشيفرة الوسيطة المُصرَّفة نفسها في أي مكان توجد فيه آلة افتراضية، مع إدارة تلقائية للذاكرة تزيل عائلة كاملة من العلل. وصارت بيئات التشغيل المُدارة وكنس المهملات توقّعاً سائداً لا ترفاً.
الويب يغيّر الهدف
قدّم الويب نموذج نشر جديداً فعلاً: برمجيات تُسلَّم عند الطلب، وتُحدَّث مركزياً، وتعمل داخل متصفّح شخص آخر. أُنشئت JavaScript لإضافة سلوك إلى الصفحات، ومن خلال تطوّر طويل ومُربك أحياناً، صارت من أوسع اللغات انتشاراً في الوجود. ونمت PHP من مجموعة أدوات للصفحات الشخصية لتصبح المحرّك خلف حصة هائلة من الويب، ويعود ذلك أساساً إلى أنها جعلت إنتاج صفحة ديناميكية أمراً مباشراً. وانتشرت Python بفضل وضوحها ومنظومة مكتباتها القوية، ثم صارت لاحقاً محورية في عمل البيانات وتعلّم الآلة.
ومع تزايد طموح تطبيقات المتصفّح، صارت المزامنة اليدوية بين DOM وحالة التطبيق المصدر الأكبر للعلل. فأجابت الأُطر القائمة على المكوّنات بأن تتيح لك وصف الشكل الذي ينبغي أن تكون عليه الواجهة عند حالة معيّنة، وتتولّى هي التحديثات نيابة عنك. وهذه هي المشكلة الحقيقية التي تحلّها React و Vue وأقرانهما — لا الزخرفة.
الموبايل والسحابة والمصدر المفتوح
أضافت الهواتف الذكية قيوداً كان عصر سطح المكتب قد سمح للمطوّرين بنسيانها: بطارية محدودة، واتصال غير موثوق، وشاشات صغيرة، وأذونات صارمة، ومتجر تطبيقات يقف بينك وبين مستخدميك. وظهرت أدوات العمل عبر المنصات مثل React Native و Flutter لأن صيانة قاعدتَي شيفرة أصليتين منفصلتين تماماً مكلفة، ولأن معظم المنتجات لا تحتاج سلوكاً خاصاً بكل منصة في كل مكان.
وغيّرت البنية التحتية السحابية الاقتصاديات مرة أخرى. فاستئجار سعة تتوسّع عند الطلب أزال الحاجة إلى شراء خوادم قبل النمو، ونقل مجموعة من الاهتمامات — التهيئة والتوسّع والإتاحة — إلى أمور يستطيع فريق صغير التعامل معها بشكل معقول. وفي الأثناء انتقل المصدر المفتوح من الهوامش إلى الأساس: فاللغات وقواعد البيانات وأُطر العمل التي تُبنى عليها معظم المنتجات صارت مفتوحة في غالبيتها الساحقة، وقراءة شيفرتها من أفضل طرق التعلّم.
التطوير بمساعدة الذكاء الاصطناعي
التحوّل الحالي هو أدوات تستطيع توليد الشيفرة وشرحها انطلاقاً من لغة طبيعية. وبالنظر إليه من زاوية هذا المقال، فهو طبقة تجريد أخرى — المقايضة نفسها التي عقدتها قبله لغة التجميع والمُصرِّفات وبيئات التشغيل المُدارة وأُطر العمل. كل خطوة رفعت المستوى الذي تعمل عنده وقلّلت مقدار ما تراه روتينياً من الطبقة التي تحتك.
ويشير النمط التاريخي أيضاً إلى ما لا يتغيّر. فكل تجريد سابق جعل عدداً أكبر من الناس منتجين دون أن يُلغي الحاجة إلى من يفهم ما يجري فعلاً حين ينكسر شيء. لم تُلغِ المُصرِّفات قيمة معرفة كيف تعمل الذاكرة؛ ولم تُلغِ أُطر العمل قيمة معرفة HTTP. ومن المعقول توقّع الأمر نفسه هنا: المستوى يتحرّك، والحُكم يبقى.
ماذا يعني هذا لك
الخيط الناظم هو أن كل جيل رفع مستوى التجريد لإدارة تعقيد لم يعد الجيل السابق قادراً على احتماله. ولم يُخترع شيء في هذا المسار الزمني ليكون رائجاً. وهذا مُرشِّح مفيد: حين تقابل أداة جديدة، السؤال الذي يستحق الطرح هو أي مشكلة محدّدة بُنيت لحلّها، وهل تعاني منها أنت. إن كنت تعاني منها، فاعتمدها. وإن لم تكن، فأنت تضيف تعقيداً مقابل لا شيء.
اللغات وأُطر العمل إجابات. وإن لم تكن تعرف السؤال الذي بُنيت الأداة للإجابة عنه، فلا يمكنك الحكم على حاجتك إليها.
- History
- Computer Science
- Fundamentals
أحمد العايدي
مطوّر Full-Stack
أبني أنظمة إنتاجية متكاملة — أنظمة Laravel الخلفية، وواجهات React و Next.js، وتطبيقات الموبايل، ولوحات التحكم، وواجهات API. وأكتب عن القرارات وراء الأنظمة التي تصل إلى مستخدمين حقيقيين.