المعلوماتية > برمجيات
كيف تعمل لغـــــات البرمجـــة؟
إن المعالج هو أهم وحدةٍ في الكمبيوتر لأنه الجزء الذي ينفّذ تعليمات البرامج. حتى أن البعض يسميه دماغ الكمبيوتر، وأحياناً يوصف بالذكاء. ولكنْ تبقى هذه مجردَ ادعاءات، فالمعالج ما هو إلا دارةٌ إلكترونيةٌ مصممةٌ للقيام بمهامٍ محددة مثل:
قراءة البيانات من الذاكرة المركزية.
تنفيذ العمليات الحسابية بين عددين والتي تشمل: الجمع والطرح والضرب والقسمة.
نقل البيانات بين أجزاء الذاكرة.
المقارنة بين قيم عددين.
ومجموعة من العمليات البسيطة الأخرى.
انطلاقاً من هذه اللائحة، ربما تكون قد لاحظتَ أنَّ المعالج ينفذ عملياتٍ بسيطةً جداً وعلى أجزاء صغيرة من البيانات. إضافةً إلى ذلك فإنّ المعالج لا يقوم بأي عملٍ من تلقاء نفسه، فعلى أحدهم أن يُمليَ عليه ما يفعل، وهذا هو دور البرنامج. البرنامج ما إلا هو مجموعة من التعليمات التي تساعد المعالج على القيام بالعمليات.
كلُّ تعليمةٍ في البرنامج هي أمرٌ يُرسَلُ إلى المعالج لأداءِ عمليةٍ محددة. إليكَ مثلاً تعليمةً معينة في برنامج: 10110000.
بالنسبة لي ولك، فإنها مجرد سلسلةٍ من الأصفار والواحدات، أما بالنسبة للمعالج فهي تمثل تعليمةً لتنفيذ أمرٍ محدد، وهي مكتوبةٌ بالـ 0 و1 لأنّ المعالج لا يفهمُ سوى التعليمات المكتوبة بلغة الآلة.
كُلُّ عمليةٍ ينفّذها المعالج تأتي من تعليمةٍ مكتوبةٍ بلغة الآلة، فمثلًا هناكَ تعليمةٌ للجمعِ وأخرى للطرحِ، وغيرِها. تُسمّى مجموعةُ التعليماتِ التي بإمكان المعالجِ تنفيذُها: "Instruction Set".
في وقتنا الحاضر، هناك العديد من الشركات المصنّعةِ للمعالجات مثل: إنتل، AMD وموتورولا.. ولكلِّ علامةٍ من هذه المعالجات، مجموعةُ التعليمات (Instruction set) الخاصةِ بها.
المثالُ المذكورُ سابقاً ليس سوى مثالٍ بسيطٍ عن تعليمةٍ للآلة، في الحقيقة يتطلّب الأمرُ أكثرَ من تعليمةٍ لجهاز الحاسب ليقومَ بشيءٍ ذي معنى. لأنّ العملياتِ التي يقومُ بها المعالج بسيطةٌ بحدِّ ذاتها، فهو يحتاج لتنفيذ الكثير من التعليمات لتحقيق نتيجةٍ يُمكن ملاحظتُها.
فمثلاً، لو أردتَ حسابَ قيمةِ الفائدة التي ستجنيها من مدّخراتك هذه السنة، سيقوم المعالج بتنفيذ العديد من التعليمات بشكلٍ منسّق، وهو أمرٌ طبيعيٌُ جداً، إذ ليس من الغريب أن يحتوي برنامجٌ على آلافٍ أو حتى الملايين من التعليماتِ المكتوبة بلغة الآلة.
تُخزَّنُ البرامجُ على وسائطِ التخزينِ الثانوية كالأقراص الصلبة، فعند تنصيب برنامجٍ معيّنٍ فإنّك تقومُ بنسخه على القرص الصلب.
بالرغم من قولِنا أنّ البرنامج يُخزَّن على وسيطٍ ثانويّ، لكنّه يُنسَخُ أيضاً على الذاكرة المركزية (RAM) في كلِّ مرةٍ يُنفذُ المعالجُ تعليماتِه.
لنفترض مثلاً أنَّ لديكَ معالجَ نصوصٍ مُنَصَّبٍ على القرص الصلب، عندما تفتحه بنقرتين بزر الفأرة على أيقونة البرنامج مثلاً، يُنسَخُ البرنامجُ من القرص الصلب إلى الذاكرةِ المركزية، ومن ثم يُنفِّذُ المعالجُ تعليماتِ البرنامج التي يجدها في الذاكرة المركزية (كما هو موضّحٌ في الصورة):
عند تنفيذ تعليمات البرنامج، يَدخلُ المعالجُ في حلقةٍ تُعرف بـ "fetch-decode-execute" أي "جلب- فك تشفير- تنفيذ"، والتي تتضمن ثلاثَ خطواتٍ من العمل المكرّر لكلّ تعليمة، وهذه الخطواتُ هي: جلبُ التعليمة من الذاكرة، فكُّ تشفيرِ التعليمة، ثم يأتي التنفيذ. الخطوات موضحة في الصورة التالية:
من لغة الآلة إلى لغة الأسمبلي (Assembly):
لا تنفِّذُ المعالجاتُ سوى التعليماتِ المكتوبةِ بلغة الآلة. فكما ذكرنا سابقاً في هذا المقال، باستطاعة المعالج تنفيذُ الملايين من هذه التعليمات، ولكنْ من الناحية النظرية فإنّ كتابةَ برنامجٍ كهذا سيكون شاقاً وسيستغرقُ وقتاً طويلاً، مُجرد وجودِ 0 أو 1 فقط في المكان غير الصحيحِ ولن يعملَ البرنامج حينها. كما أنه عملياً شبهُ مستحيل.
لهذا السبب اختُرِعتْ لغةُ الأسمبلي (Assembly) أو لغة التجميع، لتسهيل كتابة البرامج. فبدل الكتابة بلغة الأرقام (0 و1)، تُستعمَلُ رموزٌ مختصرة تُعرف بـ mnemonics. فلعملية الجمع مثلاً يُستخدم رمز: add، ولعملية الضرب: mul، بينما mov تعني نقلَ قيمةٍ معينةٍ إلى الذاكرة... وهذا سيغني المبرمجَ أو المبرمجةَ عن الكتابة بلغة الرموز الثنائية.
هناك العديد من النُّسَخِ لهذه اللغة، كما أنَّ لكل جيلٍ من المعالجات مجموعةُ التعليماتِ الخاصّة به، وهناك أيضاً نسخةُ للأسمبلي لكلِّ معالج.
لا يستطيعُ المعالجُ طبعاً تنفيذَ التعليماتِ المكتوبةِ بلغة الأسمبلي، لأنه ببساطةٍ لا يفهمها، لذلك يُستعمَلُ برنامجٌ يسمى: assembler
الذي يحوّل الكودَ المكتوب من لغة الأسمبلي إلى لغةِ الآلة لينفذَّها المعالج بعد ذلك.
اللغات عالية المستوى:
بالرغم من أن الأسمبلي تُغني المبرمجين عن الكتابة بلغة الآلة، ولكنّ هذا لا يعني أنها لغة سهلة، فهي تُعتبر بديلاً مباشراً عن لغة الآلة، وتتطلبُ معرفةً كبيرةً بالمعالجات وبِنيتها، تماماً مثل مجموعة التعليمات (instructions set). كما ويتعامل فيها المبرمجُ بشكلٍ مباشر مع الذاكرة العشوائية.
وتحتاجُ أبسطُ البرامج المكتوبة بهذه اللغة لعددٍ كبير من التعليمات. تُعرف الأسمبلي كـلغةٍ منخفضة المستوى (low-level language).
في عام 1950، ظهر جيلٌ جديدٌ من لغات البرمجة عُرِفَتْ بـاللغات عالية المستوى (high-level-languages). تسمحُ اللغةُ عاليةُ المستوى بكتابة برامجَ معقدةٍ دونَ معرفةٍ مُسبقةٍ بالمعالجات، ودون استعمال الرموز القريبة من لغة الآلة. بالإضافة إلى ذلك فإنّ معظم هذه اللغات تَستعمِلُ كلماتٍ مفهومةً وقريبةً من لغة البشر، فمثلاً:
باستعمال لغة COBOL التي تُعتبر أولى اللغات عالية المستوى، لإظهار جملة Hello World على الشاشة، يكفي كتابة:
DISPLAY "Hello world"
(كلمة display: تعني "أظهِر" أو "إظهار")
وبلغة Python التي تعتبر لغة حديثة، نكتب:
print 'Hello world'
لمعرفة كيف تكتب Hello World بلغات البرمجة المختلفة اضغط هنا هنا
تنفيذُ نفسِ هذه العملية بلغةِ أسمبلي سيتطلب العديد من التعليمات، ومعرفةً واسعةً بالمعالجات وكيفية تفاعلها مع وسائط الإخراج.
لعلكَ استنتجتَ أنَّ اللغات عالية المستوى تسمحُ للمبرمجِ بالتركيزِ على العملياتِ التي يريد تنفيذها بدل التركيز على تفاصيلِ الآلية التي سينفّذ بها المعالجُ هذه التعليمات.
بدءاً من العام 1950، ظهرت العديدُ من لغات البرمجة عالية المستوى، وفيما يلي استعراضٌ لأشهرها:
• Ada: ظهرت في السبعينيات، استُعمِلتْ من قبل وزارة الدفاع الأمريكية، وأخذت اسمها تكريماً للكونتيسا Ada Lovelac، وهي أحد أشهر الوجوه في مجال علوم الحاسب.
• Beginners All-purpose Symbolic Instruction Code :BASIC، هي لغةٌ للاستعمال العام، صُمِّمت في الستينيات لتكون لغةً بسيطة وسهلة للمبتدئين، توجد العديد من النسخ لها الآن.
• FORmula TRANslator :FORTRAN، هي أول لغة عالية المستوى، صُمِّمتْ في الخمسينيات للقيام بالعمليات الرياضية المعقدة.
• Common Business-Oriented Language :COBOL، صُمِّمتْ في الخمسينيات من أجل التطبيقات التجارية.
• Pascal: ظهرت في 1970، كان هدفها تعليمياً. اختير اسمها تمجيداً للرياضي وعالم الفيزياء والفيلسوف Blaise Pascal.
• C و ++C: ظهرت لغة C عام 1972 وتعد من اللغات القوية ذات الاستعمال العام. طُوِّرت من قبل مختبرات Bell. أما لغة ++C فظهرت عام 1983.
• #C: تُنطق "سي شارب"، ابتُكِرتْ من قبل شركة مايكروسوفت حوالي عام 2000 لتطوير تطبيقات متناسبة مع منصة NET.
• Java: ابتُكرت من طرف شركة Sun Microsystems في أوائل 1990، تستطيع عملَ برامجَ تعملُ على أجهزة الكمبيوتر وعلى مخدمات الويب.
• JavaScript: ابتُكرت في التسعينيات، وهي تعمل على صفحات الويب ولا توجد علاقة بينها وبين لغة Java.
• Python: ابتُكرت في التسعينيات وأصبحت لغة رائجة جداً، تُستعمل في الأوساط الأكاديمية والتجارية.
• Ruby: ظهرت في التسعينيات وهي لغةٌ مستعملة في مخدمات الويب.
• Visual Basic: (تُعرف أيضاً بـ VB)، وهي لغةٌ تابعة لشركة مايكروسوفت ووسطٍ برمجي، تسمح بتطوير برامج للويندوز. ابتُكِرت اللغة في التسعينيات.
• Swift: و هي أحدث لغات البرمجة عالية المستوى، إبتكرتها شركة أبل، و طُرحت في حزيران/يونيو 2014 و تستخدم لتطوير برامج تعمل على أنظمة OS X، iOS، WatchOS، tvOS التابعة جميعاً لشركة ابل.
تمتلك كلُّ لغةٍ عاليةِ المستوى مجموعةَ الكلماتِ والقواعد الخاصة بها والتي على المبرمج أن يعرفها ليستطيع كتابة البرامج.
كما أنها تُقسم إلى نوعين، هما: اللغات المترجمة (Compiled) والمفسرة (Interpreted).
ولأنَّ المعالجَ لا يفهمُ سوى التعليماتِ المكتوبة بلغة الآلة، تُتَرجَمُ البرامجُ المكتوبةُ باللغات عالية المستوى إلى لغةِ الآلة عند تنفيذها -بالاعتماد على نوعها- باستعمال المُترجِمات أو المُفسِّرات.
المُترجِم هو برنامجٌ يقوم بتحويل البرنامج المكتوب باللغة عالية المستوى إلى برنامجٍ مكتوبٍ بلغة الآلة، ويمكنُ للبرنامج الناتج أن ينفَّذَ في أي وقتٍ دونَ الاستعانة بالمترجم.
أما المفسِّر فهو برنامجٌ يقوم بتحويل وتنفيذ التعليمات المكتوبة باللغة عالية المستوى واحدةً تلو الأخرى. فأولًا يقرأ كلَّ تعليمةٍ من البرنامج، ثمَّ يحوّلها إلى لغةِ الآلة، ثم ينفذّها مباشرةً. وتُكرَّر هذه العملية لكلِّ تعليمةٍ حتى نهاية البرنامج.
المصدر: