(6)
من لغة الآلة إلى اللغات عالية المستوى:
بدأ الجيل الأول من لغات البرمجة بلغة الآلة Machine Language، وهي مجموعة من الأرقام (أصفار وآحاد) تنتمي إلى نظام العد الثنائي Binary الذي سنتعرف عليه في الفصل الخامس بإذن الله.. إ الحاسب لا يعرف غير الأرقام، ولكنّه يحوّلها إلى مدلولات أخرى على حسب رغباتنا نحن.. افترض مثلا أننا أرسلنا إلى الحاسب هذا التتابع من الآحاد: (11111111).. هذا التتابع يمثّل العدد 255 لو اعتبرناه عددا موجبا، ويمثل العدد – 127 لو اعتبرناه سالبا، ويمثّل اللون الأحمر لو اعتبرناه لونا، والرمز "?" لو اعتبرناه حرفا، ونغمة ما لو اعتبرناه صوتا..... وهكذا..
كلّ ما يفعله الحاسب هو النظر في جداول التحويل المناسبة، وعرض القيمة المناظرة.
إنّ كلّ شيءٍ بالنسبةِ للحاسب نسبيّ، فالأرقام المجرّدة التي يتعامل معها يمكن أن تفعل كلّ شيء.. المهم: هو الزاوية التي تنظر لها منها.
لكن كيف نخبر الحاسوب بما نقصده بالتحديد؟
يمكن فعل هذا في لغة الآلة، باستخدام بعض التتابعات من الأصفار والآحاد كأوامر توضّح للحاسوب ما المطلوب منه بالضبط.. فيما بعد، تم استخدام نظم عد أخرى لكتابة لغة الآلة، مثل نظام العد الثماني ونظام العد السداسي عشر.. لكن في النهاية تظل لغة الآلة تتعامل مع أرقام.
إذن فأول لغة برمجة، هي لغة الآلة، التي تحوّل الأرقام إلى إشارات كهربية.. وكانت هذه اللغة في بداية تطور الحاسوب تكتب من خلال وصلات ولوحات إدخال خاصة، تنقل الأوامر من المبرمج إلى الآلة مباشرة.. وكان الحاسوب في بداية صناعته يحتل حجرات كاملة من المبنى، حيث يدخل المبرمج إحدى الحجرات ويوصل لوحة الإدخال الخاصة به، ويقضي عدة ساعات في إدخال الأرقام التي كتب بها برنامجه، داعيا الله ألا يحترق أحد الصمامات الثلاثية في تلك الأثناء، حتى لا يضطر إلى إعادة العملية منذ البداية بعد إصلاح الخلل وإعادة تشغيل الحاسوب!
ولقد تطور الأمر في بداية الخمسينيات، باختراع أول وسيط لحفظ البرامج.. ذلك هو الكروت المثقوبة Punched Cards، حيث صارت الأرقام الدالة على البرامج توضع على الكروت المثقوبة، ثم يتم إدخالها إلى الحاسوب ليقرأها.
لا بد أنك تقول الآن: كان الله في عون المبرمجين الأوائل.. أو إن شئت الدقة: المهندسين الأوائل، فقد كان عليهم فهم تركيب الحاسوب ومكوناته الداخلية، وحفظ الأرقام الدالة على الأوامر المختلفة لبرمجته، وكتابة عشرات ـ بل مئات وربما آلاف ـ السطور من تتابعات الأرقام التي تزيغ العين وهي تحاول قراءتها، ناهيك عن الوضع المأساوي الذي يجد فيه المرء نفسه، لو اكتشف خطأ في برنامجه وسهر الليالي يبحث عن سببه وكيفية علاجه وسط كل هذه الأرقام!
لمثل هذه التعقيدات، فكر المهندسون في كتابة الأوامر بكلمات إنجليزية مختصرة يسهل فهمها (مثل ADD و SUB و MOV)، على أن يقوم برنامج بسيط
(يسمى المجمّع Assembler) بتحويل هذه الكلمات إلى الأرقام المناظرة لها في لغة الآلة.. وهكذا جاء الجيل الثاني من لغات البرمجة ونشأت لغة التجميع Assembly، وصعدنا درجة أعلى على السلم: لغة تحول الكلمات إلى أرقام، لتحولها لغة أخرى إلى إشارات كهربية.
ورغم أن لغة التجميع تعتبر قفزة كبيرة بعد لغة الآلة، إلا أن هذه اللغة تعتبر لغة برمجة منخفضة المستوى Low-Level، لأنها تتعامل مع مكونات الحاسب المادية مباشرة.. فهي مثلا تتعامل مع عناوين الذاكرة RAM وأسماء المخازن Registers الموجودة داخل المشغل الدقيق Microprocessor وغير ذلك، مما يجعل الكود المكتوب بها طويلا جدا، وفيه أجزاء كثيرة مكررة ومملة لفعل أشياء تقليدية، وهو ما جعل هذا الكود معقدا وصعب الفهم، حتى ولو كان أسهل من لغة الآلة.
من هنا نشأ التفكير في الانتقال إلى الجيل الثالث من لغات البرمجة، وهي لغات البرمجة عالية المستوى High-Level Languages، التي تعزل المبرمج بدرجة كبيرة عن مكونات الجهاز المادية، فبدلا من أن يتعامل مع عناوين الذاكرة، يُعرّف متغيرا Variable له اسم سهل، ليتعامل مع الذاكرة من خلاله، بالإضافة إلى منح المبرمج أوامرَ ودوالَّ جاهزة للقيام بالعمليات الحسابية والمنطقية، دون أن يشغل ذهنه بمكونات المشغل الدقيق أو وحدة الحساب والمنطق وغير ذلك.
وهكذا صعدنا درجة جدية على سلم التطور، فالمبرمج يكتب أوامر مختصرة وواضحة، ثم تتم ترجمتها إلى لغة التجميع ومنها إلى لغة الآلة، أو إلى لغة الآلة مباشرة.. هذه الوظيفة يقوم بها ما يعرف باسم مترجم الكود Compiler.
|