تاريخ تطور البرمجيات تعد البرمجة لغة التخاطب الوحيدة بين الإنسان والحاسوب والتي تتم من خلال كتابة مجموعة من التعليمات (instructions) تمرر للحاسوب وتهدف لتنفيذ أمر معين، وتعرف هذه اللغة الخاصة باسم لغة البرمجة.
ويوجد اليوم المئات من لغات البرمجة التي تختلف في أهدافها و وظيفتها، وقد مرت هذه اللغات بمراحل طويلة من التطور حتى وصلت للشكل المتعارف عليه اليوم.
البدايات
ظهرت أولى لغات البرمجة قبل صناعة الحاسوب الحديث، وقد كانت في البداية عبارة عن شيفرات (codes).
في عام 1801م اخترع العالم جوزيف - ميري جاكارد ( Jacquard, Joseph-Marie) نولاً ميكانيكياً (آلة للحياكة)، يتمّ التّحكم به عن طريق البطاقات المثقّبة (Punch Cards). والبطاقة المثقّبة عبارة عن بطاقة صغيرة الحجم مصنوعة من الورق المقوّى، تحتوي على عدّة ثقوب مرتّبة بنسق معين. وتمثل هذه الثقوب "البيانات" اللازمة لتغذية الآلة بالبرنامج المحدّد للحركة.
الكثير من مصنعي الحواسيب الأوائل أدركوا أهمية البطاقة المثقبة في تزويد آلاتهم بالأوامر اللازمة للعمل، ففي عام 1820م أو 1821م تبنّى العالم البريطاني تشارلز بابيج (Charles Babbage ) فكرة البطاقة المثقّبة لصناعة أول كمبيوتر ميكانيكي حقيقي عرفه التاريخ يدار بواسطة محرّك بخاري. وقد أسماه الآلة التحليليّة (Analytical Engine).
كما صمم الأمريكي هيرمان هوليرث ( Herman Hollerith ) آلة خاصة لإجراء التعداد السكاني في العام 1890م تتم تغذيتها بواسطة بطاقة مثقبة بحجم ورقة الدولار، وتحوي البطاقة عددا من الثقوب يمثل فيها موضع الثقب معلومة محددة عن الشخص كالجنس أو مكان الولادة إلخ... وقد ساعدت هذه الطريقة الحكومة الأمريكية على إنهاء التعداد في عامين ونصف بدلا من السبعة أعوام ونصف التي احتاجها التعداد السابق.
وقد استخدمت البطاقة المثقبة لفترة طويلة خلال القرن العشرين ( حتى بداية السبعينات تقريباً ) كأداة أساسية لتغذية الحاسوب الحديث بالبيانات.
تطور لغات البرمجة حسب الجيل
لغات الجيل الأول
يعتمد الأساس في تطور لغة البرمجة كما نعرفها اليوم لاستعمال نظام العد الثنائي (Binary System)-(0,1) لتمثيل الأوامر والعمليات الحسابية والمنطقية في الحاسوب الحديث (الذي يدار بالطاقة الكهربائية)، وتلك تعد ثورة في عالم الحاسوب وأساس لنجاحه بعد فشل عدة حواسيب تستخدم نظام العد العشري كحاسوب تشارلز بابيج.
وتعرف الأوامر المكتوبة بنظام العد الثنائي بلغة الآلة ( machine language ) أو الجيل الأول للغات البرمجة.
وفي البدايات البرمجية كان على المبرمج كتابة البرنامج كاملاً مستخدما لغة الآلة، ولكن هذه العملية كانت صعبة ومرهقة وعرضة لكثير من الأخطاء.
لغات الجيل الثاني
كان لا بد من إيجاد طريقة لتمثيل الأوامر البرمجية (op-code) بعيداً عن تعقيد رموز لغة الآلة. وتمّ التفكير باستخدام شيفرة نصية مكونة من عدة حروف ( من 1- 5 أحرف ) لكتابة هذه الأوامر ووصف مواقع الذاكرة، عرفت باسم (mnemonics).
عند استخدام هذه التقنية في البداية كان المبرمج يستخدم الشيفرة النصية لتصميم البرنامج على الورق، ومن ثم يقوم بترجمته إلى لغة الآلة عند إدخاله إلى جهاز الحاسوب. ولكن، وبعد بعض الوقت، تم التوصل لطريقة تمكن الحاسوب من القيام بعملية الترجمة بنفسه، حيث تم إنشاء برنامج خاص سمّي باسم المجمّع (assembler) مهمته تجميع الأوامر المكتوبة بلغة الآلة من الأوامر المكتوبة على شكل شيفرة رمزية أو نصية (mnemonics).
هذا التطور في عملية ترميز البرامج وترجمتها أدّى لنشوء لغة برمجة خاصة عرفت باسم لغة التجميع ( assembly language ) والتي تمثل الجيل الثاني من لغات البرمجة. واعتبرت هذه اللغة قفزة عملاقة في عالم لغات البرمجة، وجعلت من تطوير تقنيات برمجية أفضل أمراً ممكناً.
لغات الجيل الثالث
على الرغم من التميز الذي أظهرته لغات الجيل الثاني على لغة الآلة، إلا أنها عانت بعض العقبات. فالبرنامج المكتوب بها تتم كتابته ليتناسب مع خصائص الآلة (الحاسوب) التي سيتم تطبيقه عليها. بمعنى أن البرنامج المكتوب بلغة التجميع معتمد على الآلة التي يتم تنفيذه عليها ولا يمكن استخدامه على آلة أخرى، إلا بعد إعادة كتابته ليتلاءم مع تكوين هذه الآلة الجديدة ( مثل أسماء المسجلات ومواقع الذاكرة..).
عقبة أخرى تتمثل في عملية تصميم البرنامج والذي يتطلب من المبرمج التفكير بدقائق البرنامج جميعها، من حيث تعريف اسم المسجل (register) وأسماء مواقع الذاكرة التي سيتم تطبيق أمر معين عليها، وهذا يعني أن على المبرمج أن يبني البرنامج خطوة خطوة من مستوى أدنى لمستوى أعلى.
تشبه المسألة عملية وضع مخطط لبناء منزل. فلغة التجميع تماثل وضع مخطط للبناء يبدأ من المسامير والألواح والطوب (من الأسفل) صعودا حتى تصميم الغرف (للأعلى)، في حين أنه يكون من الأسهل لو تم البدأ بتصميم المنزل أولاً على شكل غرف ونوافذ وأبواب (من مستوى أعلى)، ومن ثم يلي ذلك التفكير بالأشياء الأكثر تحديداً ( مستوى أدنى).
أي أن التصميم يكون أسهل لو تم التفكير به من مكونات كلّية (major features) ومن ثم يتم تقسيم الكليات لمكونات أكثر تفصيلا.
اعتماداً على هذه الفكرة تم التوجه نحو تطوير لغات برمجة تمكّن المبرمج من بناء برنامج معتمداً على النظرة الكلية (high-level) ومن ثم تحويلها لمكونات أدنى (low-level). ونتج عن ذلك جيل ثالث من لغات البرمجة عرفت باسم لغات البرمجة عالية المستوى (high-level languages) واستخدمت هذه اللغات على لغة الإنسان الطبيعية-اللغة الإنجليزية- و رموز رياضية ومنطقية معروفة، في حين اكتسبت لغة التجميع مسمى لغات البرمجة متدنية المستوى(low level languages).
وبذلك تخطت لغات الجيل الثالث كل عقبات الجيل الثاني، من حيث سهولة التصميم وعدم اعتماد أوامرها على آلة بحد ذاتها.
من أشهر لغات البرمجة عالية المستوى والتي ظهرت في مرحلة مبكرة:
- لغة كوبول والتي كانت مخصصة للأغراض التجارية والأعمال (COBOL- COmmon Business Oriented Language).
- لغة فورتران والتي كانت مخصصة للأغراض العلمية والتطبيقات الهندسية (FORTRAN- FORmula TRANslator).
وقد تم تزويد لغات البرمجة عالية المستوى ببرنامج مترجم (compiler) ليقوم بتحويل الأوامر البرمجية من المستوى الأعلى إلى المستوى الأدنى - لغة الآلة - ليتمكن الحاسوب من تنفيذه.
مراجع
- مقال عن تاريخ تطور البرمجة
- Book: Compute Science An Overview, by J.Glenn Brookshear.