هل أحتاج إلى تعلم لغة C لفهم كيفية عمل جهاز الكمبيوتر؟

كثيرا ما سمعت الناس يقترحون دراسة C. لفهم أداء الكمبيوتر. هل هذه فكرة جيدة؟ هل أنت متأكد سأوجز على الفور استنتاجات المقالة ، لمجرد الوضوح المطلق:

  • C ليست طريقة عمل الكمبيوتر.
  • لا أعتقد أن معظم الناس يتحدثون حرفيا ، لذلك لا يهم.
  • يعني فهم السياق أن تعلم لغة C لهذا السبب قد يظل منطقيًا ، اعتمادًا على أهدافك.

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

كثيرا ما سمعت من الناس هذا:

من خلال دراسة لغة C ، يمكنك فهم كيفية عمل أجهزة الكمبيوتر.

لا أعتقد أن الفكرة خاطئة في البداية ، لكن لديها بعض التحفظات. إذا كنت تضعهم في الاعتبار ، فقد تكون استراتيجية قابلة للتطبيق لتعلم أشياء جديدة ومهمة. ومع ذلك ، نادرًا ما أرى أشخاصًا يناقشون هذه التحفظات بالتفصيل ، لذا فأنا أكتب هذه المقالة لتقديم ، في رأيي ، سياقًا ضروريًا جدًا ... إذا كنت تفكر في تعلم C لفهم كيفية عمل جهاز الكمبيوتر الخاص بك ، فإن هذا المقال لك. آمل أن تساعدك على معرفة ذلك.

قبل أن نبدأ حقًا ، أود أن أقول شيئًا آخر: إذا كنت تريد تعلم C ، فادرس! التعلم رائع. أصبح التعلم C مهمًا جدًا لفهم الحوسبة وحياتي المهنية. إن تعلم هذه اللغة ومكانها في تاريخ لغة البرمجة سيجعلك مبرمجًا أفضل. لا تحتاج إلى أي عذر. تعلم الأشياء فقط من أجل التعلم. الغرض من هذه المقالة هو أن تكون دليلاً لفهم الحقيقة ، ولا تناقش ما إذا كانت ستدرس أم لا.

بادئ ذي بدء ، لمن ينصح به هذه الفكرة بشكل عام. إذا كنت تحاول "معرفة كيفية عمل أجهزة الكمبيوتر" ، فمن نافلة القول أنك لا تفهم ذلك حاليًا. أي المبرمجين لا يفهمون كيف تعمل أجهزة الكمبيوتر؟ لقد رأيت بشكل أساسي أن هذا الشعور يأتي من أشخاص يبرمجون في الغالب بلغات "برمجة نصية" مكتوبة ديناميكيًا مثل Ruby أو Python أو JavaScript. من المفترض أنهم "لا يعرفون كيف تعمل أجهزة الكمبيوتر" لأن هذه اللغات تعمل داخل جهاز ظاهري ، حيث تكون دلالات الجهاز الظاهري مهمة فقط. في النهاية ، الفكرة الكاملة للجهاز الظاهري هي توفير إمكانية النقل. الهدف ليس الاعتماد على المعدات التي يعمل عليها الجهاز الظاهري.

هناك مشكلة واحدة فقط: يعمل C أيضًا داخل جهاز ظاهري.

آلة مجردة C


من المواصفة C99 ، القسم 5.1.2.3 ، "تنفيذ البرنامج":

تصف الأوصاف الدلالية في هذه المواصفة القياسية الدولية سلوك آلة مجردة لا تتعلق فيها مشكلات التحسين.

في رأيي ، هذا هو أهم شيء يجب فهمه عند تعلم C. اللغة "لا تصف كيفية عمل الكمبيوتر" ، ولكنها تصف كيفية عمل "آلة C المجردة". كل شيء آخر مهم يتبع هذا المفهوم.

ملاحظة أخرى: لقد اخترت هنا C99 ، وهو ليس أحدث معيار C. لماذا؟ حسنًا ، MSVC لديها ... دعم لغة C مثير للاهتمام ، وأنا مستخدم Windows في هذه الأيام. نعم ، يمكنك تشغيل clang و gcc على Windows. لا يوجد فرق كبير بين C89 و C99 و C11 فيما يتعلق بما نتحدث عنه. في مرحلة ما ، عليك أن تختار. النسخة التي ذكرتها هنا تتضمن بعض التغييرات على المواصفات الأصلية.

ربما تكون قد سمعت عبارة أخرى في حديث C الخاص بك: "C هو مجمع محمول". إذا فكرت في هذه العبارة ، فسوف تفهم أنه إذا كان هذا صحيحًا ، فإن C لا يمكن أن تتوافق مع تشغيل الكمبيوتر: هناك العديد من أجهزة الكمبيوتر المختلفة ذات الهياكل المختلفة. إذا كانت C مثل المجمّع الذي يعمل على أجهزة كمبيوتر مختلفة ذات بنى مختلفة ، فلا يمكنها العمل في الوقت نفسه تمامًا مثل كل جهاز من أجهزة الكمبيوتر هذه. يجب عليه إخفاء التفاصيل ، وإلا فلن يكون محمولا!

ومع ذلك ، أعتقد أن هذه الحقيقة لا تهم ، لأن الناس بالكاد يشيرون حرفياً إلى "C هي كيفية عمل الكمبيوتر". قبل العودة إلى هذا ، لنتحدث عن آلة C المجردة ، ولماذا لا يبدو أن الكثيرين يفهمون هذا الجانب من C.

الاستطراد: لماذا يخطئ الناس؟


يمكنني فقط التحدث عن تجربتي ، على الرغم من أنها ليست فريدة من نوعها بالتأكيد.

تعلمت GW-BASIC ، ثم C ، ثم C ++ ، ثم Java. سمعت عن جافا قبل أن أبدأ في كتابتها عام 1999 ، بعد أربع سنوات من ظهورها. كان التسويق في ذلك الوقت يناقض بنشاط Java و C ++ ، فقد ركز على JVM كمنصة ، وعلى حقيقة أن نموذج الآلة يميزه عن C ++ ، وبالتالي لم تعد C. Sun Microsystems موجودة ، لكن مرآة البيان الصحفي تذكرنا:

تطبيقات Java مستقلة عن النظام الأساسي ؛ كل ما تحتاجه هو توصيل جهاز Java الظاهري لكل نظام أساسي. يعمل كمترجم بين كمبيوتر المستخدم وتطبيق Java. يمكن أن يعمل تطبيق مكتوب في بيئة Java في أي مكان ، مما يلغي الحاجة إلى نقل التطبيقات إلى أنظمة أساسية متعددة.

كان الشعار الرئيسي هو "اكتب مرة واحدة ، ركض في كل مكان". أصبحت هاتان الجملتان كيف أصبحت (والعديد من الآخرين) أفهم لغة جافا ، وكيف تختلف عن لغة C ++. جافا لديها مترجم ، آلة جافا الافتراضية. لا يوجد جهاز افتراضي في C ++.

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

"بيئة وقت التشغيل" و "الآلة الافتراضية" و "الآلة المجردة" هي كلمات مختلفة لنفس المفهوم الأساسي. لكنهم منذ ذلك الحين تلقوا دلالات مختلفة بسبب اختلاف طفيف في تنفيذ هذه الأفكار.

أنا شخصياً أعتقد أن تسويق عام 1995 هذا هو السبب في أن المبرمجين ما زالوا يسيئون فهم طبيعة C.

فهل هذا البيان خاطئ؟ لماذا تنفق Sun Microsystems ملايين وملايين الدولارات للترويج للأكاذيب؟ إذا كانت C تعتمد أيضًا على آلة مجردة توفر إمكانية النقل عبر الأنظمة الأساسية ، فلماذا نحتاج إلى Java؟ أعتقد أن هذا هو المفتاح لفهم ما يعنيه الناس حقًا عندما يقولون "C هو كيفية عمل الكمبيوتر."

ماذا يعني الناس حقا؟


على الرغم من أن لغة C تعمل في سياق آلة افتراضية ، إلا أنها لا تزال مختلفة بشكل كبير عن اللغات المشابهة لـ Java. لم تكذب الشمس. لفهم ، تحتاج إلى معرفة قصة C.

في عام 1969 ، قامت شركة Bell Labs بكتابة نظام تشغيل الكمبيوتر بلغة التجميع. في عام 1970 ، أطلق عليها اسم UNIX. بمرور الوقت ، اشترت Bell Labs المزيد والمزيد من أجهزة الكمبيوتر الجديدة ، بما في ذلك PDP-11.

عندما حان الوقت لنقل Port Unix إلى PDP-11 ، قرروا استخدام لغة ذات مستوى أعلى ، والتي كانت فكرة جذرية جدًا في ذلك الوقت. تخيل أنني سأخبرك اليوم: "سأكتب نظام تشغيل في جافا" - ربما ستضحك ، على الرغم من أن الفكرة قابلة للتحقيق . كان الوضع (حسب فهمي ، لم أكن أعيش في ذلك الوقت) هو نفسه تقريبًا. اعتبرنا لغة تسمى B ، لكنها لم تدعم بعض الوظائف التي كان لدى PDP-11 ، وبالتالي قاموا بإنشاء خليفة من خلال تسميتها "C" لأنها كانت الحرف التالي في الأبجدية.

لم تكن هناك لغة "أ" ؛ B نجح BCPL (لغة البرمجة الأساسية المشتركة).

في عام 1972 ، تم كتابة أول مترجم C على PDP-11 وفي نفس الوقت أعاد كتابة UNIX إلى C. في البداية ، لم يفكروا في قابلية النقل ، لكن C اكتسبت شهرة ، لذلك تم تحويل مترجمين C إلى أنظمة أخرى.

في عام 1978 ، تم نشر الطبعة الأولى من كتاب "لغة البرمجة C". يسمى كتاب "K&R" بحنان ، وفقًا لأسماء مؤلفيه ، لم يشبه الكتاب المواصفات على الإطلاق ، ولكن في نفس الوقت وصف اللغة بتفاصيل كافية ، ونتيجة لذلك حاول الآخرون أيضًا كتابة المترجمات C. وفي وقت لاحق ستسمى هذه "النسخة" "K&R C".

مع انتشار UNIX و C ، تم نقلهما إلى العديد من أجهزة الكمبيوتر. في السبعينيات والثمانينيات ، كانت قاعدة الأجهزة الخاصة بهم تنمو باستمرار. بنفس الطريقة التي تم بها إنشاء C لأن B لم يدعم جميع وظائف PDP-11 ، استخدم العديد من المترجمين ملحقات اللغة. نظرًا لوجود K&R فقط وليس مواصفات ، فقد اعتبر هذا مقبولًا طالما كانت الإضافات قريبة إلى حد ما. بحلول عام 1983 ، كان عدم وجود أي توحيد يسبب مشاكل ، لذلك قامت ANSI بتشكيل فريق لإعداد المواصفات. في عام 1989 ، خرج معيار C89 ، وأحيانًا يسمى "ANSI C".

حاولت المواصفات C توحيد هذه التطبيقات المتنوعة على الأجهزة المختلفة. وبالتالي ، فإن آلة C المجردة هي نوع من أصغر المواصفات الممكنة التي تسمح لنفس الشفرة بالعمل بنفس الطريقة على جميع الأنظمة الأساسية. تم تجميع تطبيقات C ، ولم يتم تفسيرها ، لذلك لم يكن هناك مترجم ، لذلك لم يكن هناك "VM" بمعنى عام 1995. ومع ذلك ، تتم كتابة برامج C على هذا الكمبيوتر المجرد غير الموجود ، ثم يتم تحويل التعليمات البرمجية إلى مجمّع خاص بالكمبيوتر المحدد الذي يعمل عليه البرنامج. لا يمكنك الاعتماد على بعض التفاصيل المحددة لكتابة كود C المحمول. وهذا يجعل كتابة C المحمولة أمرًا صعبًا للغاية لأنك قد تكون افترضت افتراضًا محددًا للمنصة عند كتابة النسخة الأولية من التعليمات البرمجية.

من الأفضل توضيح ذلك بمثال. أحد أنواع البيانات الرئيسية في C هو char ، من كلمة "حرف". ومع ذلك ، فإن آلة C المجردة لا تحدد عدد البتات التي يجب أن تكون في char . حسنًا ، يحدد ، ولكن ليس حسب الرقم ؛ يحدد حجم CHAR_BIT وهو ثابت. القسم 5.2.4.2.1 من المواصفات:

يجب استبدال القيم الواردة أدناه بتعبيرات ثابتة مناسبة أو مستخدمة في توجيهات المعالجة المسبقة #if ... يجب أن تكون القيم في تطبيقات معينة مساوية أو أكبر في الحجم (القيمة المطلقة) لتلك المعطاة هنا بنفس العلامة.

CHAR_BIT: 8

بمعنى آخر ، أنت تعرف أن char لا يقل عن 8 بت ، ولكن قد تكون عمليات التنفيذ أكبر. من أجل ترميز "آلة C مجردة" بشكل صحيح ، يجب استخدام CHAR_BIT بدلاً من 8 كحجم عند معالجة char . ولكن هذا ليس نوعًا من وظيفة المترجم ، كما نفكر في الأجهزة الافتراضية ؛ هذه خاصية كيف يترجم المترجم كود المصدر إلى كود الآلة.

نعم ، هناك أنظمة حيث CHAR_BIT ليست 8 .

وبالتالي ، فإن هذه "الآلة المجردة" ، على الرغم من أنها من الناحية الفنية نفس الفكرة مثل آلة جافا الافتراضية ، على الأرجح هي عبارة عن تجميع تجميعي لإدارة المترجمين عند إنشاء كود المجمع ، بدلاً من نوع من فحص وقت التشغيل أو خاصية. النوع المكافئ في Java هو byte ، وهو دائمًا 8 بت ، ويتم تنفيذ JVM بما يجب القيام به على الأنظمة الأساسية التي تحتوي على المزيد من وحدات البايت. (لست متأكدًا مما إذا كانت JVM تعمل على أي من هذه المنصات ، ولكن هذه هي الطريقة التي يجب أن تعمل بها.) تم إنشاء آلة C المجردة كغلاف بسيط للعديد من "الأجهزة" ، وليس كنوع من النظام الأساسي مصنوع من قماش صلب مكتوب في برنامج لتعليماتك البرمجية.

لذا ، على الرغم من أن صن كانت خاطئة تقنياً ، إلا أنها في الممارسة العملية تعني القليل مما يقولونه حرفياً ، وما يعنيه صحيح. نفس الشيء مع عبارة "تعلم C لفهم كيفية عمل أجهزة الكمبيوتر".

تعلم C إلى أفضل فهم كيفية عمل أجهزة الكمبيوتر


ماذا يعني الناس حقا ؟ في سياق "يجب أن يتعلم روبيست لغة سي من أجل فهم كيفية عمل أجهزة الكمبيوتر" - هذه نصيحة للذهاب "إلى مستوى الحديد". أي ليس فقط لفهم كيفية عمل البرنامج الخاص بك داخل الجهاز الظاهري ، ولكن أيضًا كيف يعمل الجمع بين البرنامج و VM في سياق الجهاز نفسه.

سيوفر لك التعلم C المزيد من هذه التفاصيل لأن الماكينة المجردة أقرب كثيرًا إلى الأجهزة بالإضافة إلى مجردة أنظمة التشغيل. تختلف لغة C اختلافًا كبيرًا عن اللغات عالية المستوى ، لذا فإن تعلمها يمكن أن يعلم الكثير.

ولكن من المهم أن نتذكر أن C هي في الأساس عبارة عن تجريد للأجهزة ، وأن التجريدات غير كاملة. كن حذرًا بشأن ما يفعله C أو كيف يعمل مع الجهاز نفسه. إذا تعمقت كثيرًا ، فستواجه بالتأكيد هذه الاختلافات ، والتي يمكن أن تسبب مشاكل. معظم موارد التدريب لـ C ، خاصة اليوم ، عندما تصبح المعدات أكثر تجانسًا ، ستعزز فكرة أن هذه هي الطريقة التي يعمل بها الكمبيوتر. لذلك ، قد يكون من الصعب على الطالب فهم ما يحدث تحت غطاء المحرك وما هو التجريد الذي قدمه C.

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

لهذا السبب ، أعتقد أن نسخة أكثر دقة من هذا البيان ستكون "بتعلم C ، ستتعلم المزيد حول كيفية عمل أجهزة الكمبيوتر." أعتقد حقًا أن التعارف التقريبي مع C مفيد للعديد من المبرمجين ، حتى لو لم يكتبوا هم أنفسهم. سيعطيك تقديم C أيضًا فكرة عن تاريخ صناعتنا.

هناك طرق أخرى لاستكشاف هذا الموضوع ؛ لم يتم تصميم C بطبيعته للتعلم عن الكمبيوتر ، ولكنه خيار جيد.

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

Source: https://habr.com/ru/post/ar426993/


All Articles