لكي تفهم كيفية عمل الحاسوب فعليك تعلم لغة التجميع Assembly [ما مدى صحة هذه العبارة؟]

قرأتها في إحدى اﻹجابات في موقع Quora وقائلها مهندس برمجيات يعمل منذ ما يقرب من ثلاثين عاما .

وهذا جزء من كلامه (حسبما أتذكر) :

هناك العديد من المبرمجين حديثي العهد عندما أرى مشاريعهم أجد بعض اﻷخطاء والتي أرجع سببها لعدم قدرتهم على الفهم الكامل لكيفية عمل الحاسوب .. أقترح على من يريد إجادة أي لغة برمجة أن يفهم آلية عمل الحاسوب أولا وفي هذا الصدد أقترح عليه تعلم لغة التجميع Assembly "

وفي وقت لاحق شاهدت فيديو للدكتور عبد الله عيد في حلقات "كلام مبرمجين" يدعو فيها لتعلم لغة C لفهم كيفية عمل الحاسوب .

وهنا أود معرفة الفارق بين اللغتين وهل لا زال لهما وجود وهل توجد بالفعل فائدة من تعلم إحداهما ؟ أم اﻷفضل اختصار الوقت وتعلم لغة أحدث مثل Java,Python .... إلخ

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

ليس ضروريا, كل شئ في الدنيا و خاصة في التقنية مبني على شئ آخر, حتى مبادئ لغة ال Assembly يمكن بنفس المنطق أن تقول انك لكي تتقنها تحتاج دراسة معماريات المعالجات و معماريات المعالجات تحتاج دراسة الالكترونيات الرقمية و الالكترونيات الرقمية تحتاج دراسة مبادئ الدوائر و الالكترونيات و هكذا حتى تصل الى الفيزياء و الكيماء و و و الخ

في النهاية انت لا تحتاج أكثر من طبقة أدنى من الطبقة التي تعمل عليها, و اذا واجهت مشكلة كبيرة يمكنك ان تتعمق أكثر, لكن أكثر من هذا مجرد تكلف و تضييع وقت.

هذا ما حدث معي بالفعل , وجدت أنني أفتح أبوابا لا حصر لها !!

mujahid أضف ردا

في نطاق البرمجة أدني شيء هي لغة التجميع والآلة، ولا يتّصل ما هو دونهما (من معمارية المعالج والإلكترونيات) بها، إلا إذا أردت المعرفة العامة.

كيف ستعرف ماهو ال Register مثلأً و كيف يختلف عن الذاكرة العامة, أو لماذا تقسم الكود الى data segments و code segment و خلافه من المفاهيم التي قد تختلف جذرياً اذا كتب Assembly على معماريات Intel أو على معماريات ARM أو معماريات أخرى, كل شئ مبني على أساسيات و متصل ببعضه.

يَعرف النواحي البرمجة فقط لهذه الأشياء (وإن أراد أن يستزيد فهذا شيء آخر)، فالمُسجّلات هي ذواكر داخل المُعالج بحجم كذا وهي بسرعة المعالج (أسرع من الذاكرة الرئيسية)، وطرقة التعامل معها - برمجيًّا - هي كذا وكذا وكذا...، وكذلك بالنسبة للمقاطِع المُختلفة (مقطع الشفرة، ومقطع المُكدّس، ومقطع البيانات، ...). أما اختلاف المعماريات فما يجب أن يُلمّ بهي هي تلك الإختلافات البرمجية التي يمكن معرفتها دون المعرفة الدقيقة بالإلكترونيات وما شابه ذلك.

نعم هناك ارتباط بين العلوم، ولكن في حدود علم ما هناك حدٌّ، العِلمُ به فقط يكفي للعمل في نِطاق تخصصه.

من ناحية الوجود، فلغة السي لا تزال جاثمة على عرش أقوى لغات البرمجة (من حيث القدرة، لا المرونة والسهولة)، وحتى مفسّر بايثون ليس مبرمجًا ببايثون (فهي لغة تفسيرية)، بل مبرمج بلغة السي. وأظن أن اللغة الأشهر لبرمجة تعريفات العتاد هي لغة السي.

أما لغة التجميع فضرورية لفهم كيف يعمل الحاسب؛ فحين تُبرمج بلغة برمجة عالية، لا بد أن تقدّر أي الطرق أسرع في التنفيذ تبعًا لما تعرفه عن لغة التجميع والتي تبيّن لك عمل المعالج. وهناك أيضًا بعض الحالات الخاصة التي تسدعي استخدام لغة التجميع حصرًا لضمان سرعة التنفيذ.

axok12 أضف ردا

إذن اﻷفضل لمبرمج الويب هو اﻹطلاع فقط على لغة التجميع ؟ أم عدم التطرق لها ؟

مبرمج الويب بعيد بعض الشيء عن هذه الأشياء، ولكن بما أنه مبرمج حاسوب فإن عليه أن يعلم ولو الأساسيات الأولية عن عمل المعالج والحاسب.

1- يمكن احتراف لغة برمجة عالية المستوى بدون الإلمام أو حتى معرفة تفاصيل ما يجري في الحاسوب

2- ومع ذلك معرفة التفاصيل وما يجري تحت الكواليس يعطيك تصور أوضح ويفسر الكثير مما كنت تعجز عن تفسيره كما أنه يصحح بعض التصورات الخاطئة التي ربما تكونت لديك

3- لغة الاسمبلي ستعطي فكرة جيدة جدا عن جزء مهم مما يحدث تحت الكواليس اثناء البرمجة لكنها لن تفسر كل شيء يتعلق بفهم عمل الحاسوب وستبقى بعض الأمور غامضة إلى حد ما واذا ما أردت استيعاب كل شيء فستحتاج إلى التعمق والغوص أكثر.

4- بالنسبة للمبتدئين في تعلم البرمجة فلا أرى من الحكمة أن يخوضوا بشكل عميق في الاسمبلي والأفضل والأنسب لهم هو تعلم اللغات عالية المستوى كالجافا والبايثون وغيرهما ثم بعد اتقان اللغة عالية المستوى وقتها يكون الوعي البرمجي والتقني مهيء للخوض فيما تحت الكواليس

5- بخصوص لغة السي وأهمية تعلمها بفهم كيفية عمل الحاسوب فهذا الكلام بوجهة نظري صح ومش صح على حسب طريقة تعلمك للسي وطريقة تعلمك لغير السي كالجافا مثلاً

فمثلاً بعض من يشرح الجافا يوضح لك الكثير من التفاصيل وما يجري في الذاكرة وفي هذا كفاية لأخذ فكرة جيدة وقوية عن آلية عمل الحاسوب وحينها لا تحتاج الى السي

وللمعلومية يقال ولا اتذكر المصدر

أنه تم اجراء دراسة بحثية عن سرعة تعلم الجافا وتم مقارنة الطلبة الذي يدرسون الجافا وهم يجيدون للسي مع طلبة يتعلمون الجافا بدون أي خلفية برمجية فكانت النتيجة المفاجئة أن الطلبة الذين بدون اي خلفية برمجية أسرع في فهم وتعلم الجافا

وهذا الكلام منطقي الى حد كبير ويشبه حالة الانسان عندما يتعلم لغة غير لغته الأم فالعربي مثلاً عندما يتعلم الإنجليزية من أهم العوائق التي تعيقه هو أن عقله وتفكيره اللغوي مبني على العربية والقواعد العربية وهو يميل إلى إعمال قواعد العربية في كل ما يتعلمه عن الإنجليزية ولذلك يتعب كثيراً وقد لا يصل إلى مرحلة الاتقان المطلق للإنجليزية نطقا وكتابة وفهما

وهذا ما يفسر كيف أن الطفل اسرع وأفضل في تعلم كل ما هو جديد من الإنسان الكبير

والنكتة هنا

اذا كان هدفك تعلم الجافا او البايثون وبدأت بتعلم السي وتعمقت فيها من أجل فهم كيف يعمل الحاسوب ثم بعد ذلك اردت فهم الجافا او البايثون فتوقع ان تجد شيء من الصعوبة وقد تجد غيرك ممن لم يتعلم السي ربما افضل منك واسرع في فهم الجافا أو البايثون

فتعلمك للسي اصبح بمثابة العائق بينك وبين الجافا

وهذا كلام نسبي يختلف من شخص الى شخص حسب عوامل كثيرة لا داعي للخوض فيها

محبتي

KAKR أضف ردا

نوعما ما. لا تحتاج ان تتعلمها بالتفصيل، فهم سطحي سيكون كافي لا عطاءك فكرة عن كيف ينفذ المعالج الاوامر وذلك اهم ما عليك ان تفهمه.

جميع لغات البرمجة وجدت لتسهيل برمجة الحاسوب. الحاسوب جهاز رقمي اي يعمل وفق نظام ثنائي يتكون من رقمين الصفر والواحد وهما ما يمثلان انقطاع او وجود التيار الكهربائي. معالج الحاسوب يستقبل الاوامر بهذا الشكل فقط. بطبيعة الحال، برمجة الحاسوب بلغة الالة صعب جداً وغير عملي. لذلك قام المبرمجين بعمل/تصميم لغات برمجة تكون اعلى من لغة الالة حتى يستطيع الانسان برمجة الحاسوب بسهولة.

حتى يتمكن الحاسوب فهم هذه اللغات اخترعوا الـ Compilers وهي - في بادئ الامر - برامج مكتوبة مباشرة بلغة الالة تحول اللغات العليا (التي يستطيع الانسان فهمها وكتابتها بسهولة) للـ Machine Language. الـ C من أقرب اللغات للـ Assembly، بسبب احتوائها على ال Pointers التي تمكنك من التعامل مع الذاكرة، وبسبب انعدام ال Garbage Collector بحيث ينجبر المبرمج على تنظيم ذاكرة برنامجه يدوياً وان يتعامل مباشرة مع العتاد - تقريبا. من ذلك المنطلق تشكل الانطباع بأن فهم الـ C ضروري لفهم كيفية عمل الحاسوب.

شاهد هذا الفيديو - مقارنة بين لغة الـ C والاسمبلي:

وان يتعامل مباشرة مع العتاد - تقريبا

التعامل المباشر مع العتاد هي ميزة حصرية لنظام التشغيل، ولا يمكن لبرامج المستخدم (ذات الحلقة الـ ٣) أن تستخدم أمري الإدخال والإخراج، اللذان يُتستعملا للإرسال البيانات واتستقبالها إلى ومن العتاد.

لذا فالطريقة الوحيد هي استخدام دوال النظام لتنفيذ أوامر العتاد.


طبعًا برنامج النظام يُمكن أن يكون مُبرمجًا بالسي، وفي هذا يُستعان بلغة التجميع - داخل السي عادةً - لاستخدام أوامر د خ.

أشكرك على المعلومات الوافية .... ما فهمته من تعليقك هو عدم التعلق بالماضي واختصار الوقت وتعلم الجديد فقط ؟