ما هي الأمثلة المحددة على معرفة C التي تجعلك مبرمجًا أفضل مستوى عالية؟

StackOverflow https://stackoverflow.com/questions/2077913

  •  21-09-2019
  •  | 
  •  

سؤال

أعرف وجود سؤال مثل هذا و هذا. دعني أوضح.

Afet قراءة مقالة جويل الرجوع إلى الأساسيات

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

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

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

معرفة أشياء منخفضة المستوى يمكن أن تساعد كثيرا.

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

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

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

إن فهم C ، أو لهذه المسألة ، أي لغة برمجة منخفضة المستوى ، يمنحك فرصة لفهم أشياء مثل استخدام الذاكرة (أي لماذا من السيئ إنشاء عدة ملايين كائن ثقيل) ، وكيف تعمل مؤشرات/مراجع الكائن ، إلخ.

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

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

لأحد ، يساعدك معرفة C على فهم كيفية عمل الذاكرة في نظام التشغيل ولغات عالية المستوى. عندما تتخذ بالونات برنامج C# أو Java الخاصة بك على استخدام الذاكرة ، فهم أن المراجع (التي هي في الأساس مؤشرات) تأخذ الذاكرة أيضًا ، وفهم عدد هياكل البيانات التي يتم تنفيذها (والتي تحصل عليها من صنع خاصتك في C) على فهم ذلك يحتفظ قاموسك بكميات ضخمة من الذاكرة غير المستخدمة بالفعل.

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

بشكل عام ، كلما عرفت أكثر ، كلما كان المبرمج الأفضل الذي ستكون عليه.

فقط "معرفة" C لن تجعلك أفضل.

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

على سبيل المثال ، كيف تؤثر ذاكرة التخزين المؤقت L1/L2 على عملك ، وكيف يجب أن تكتب التعليمات البرمجية الخاصة بك للحصول على المزيد من الزيارات في ذاكرة التخزين المؤقت L1/L2. عند العمل مع C/C ++ وإجراء تحسينات ثقيلة ، سيتعين عليك النزول إلى هذا النوع من الأشياء.

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

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

  • حلقة الوصل إلى أرشيف Simtel على دليل مبرمج C إلى الكمبيوتر.
  • فهم كيفية عمل TSR
  • قم بتنزيل الأرشيف الكامل قصاصات بوب ستوت وهي مجموعة كبيرة من رمز C الذي يقوم بشيء واحد فقط - دراستها وفهمه ، وليس وحده ، أن مجموعة المقتطفات تسعى إلى أن تكون محمولة.
  • تصفح في مسابقة Code Code الدولية (IOCCC) عبر الإنترنت ، وانظر كيف يمكن إساءة استخدام رمز C وفهمها في إدخال اللغة. أسوأ تعاطي الكود هو الفائز! قم بتنزيل المحفوظات ودرسها.
  • انظر إلى Dr. Dobb's Journal و C Journal هنا - لا أعرف ما إذا كان لا يزال بإمكانك الحصول عليها في الطباعة ، لكنهم كانوا كلاسيكيين ، يمكن أن تتذكر الشعور بعقد نسخة مطبوعة في يدي وتمزيق المنزل لتكتب الكود لمعرفة ما يحدث!
  • الاستيلاء على نسخة قديمة من Turbo C V2
  • فهم وتعلم المؤشرات ، رابط هنا إلى إرث Simtel.net - رابط حاسم لتحقيق Guru'ship من أجل الرغبة في كلمة أفضل ، ستجد أيضًا مجموعة من التنزيلات المتعلقة بلغة البرمجة C - أتذكر بالفعل طلب أرشيف Simtel CD والبحث عن الأشياء C ...

هناك شيئان يجب أن تتعامل معهما مباشرة في C أن اللغات الأخرى الملخص بعيدًا عنك تشمل إدارة الذاكرة الصريحة (malloc) والتعامل مباشرة مع المؤشرات.

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

مثال بسيط (غير واقعي تمامًا) لتوضيح بعض النصائح أعلاه. النظر في ما يبدو غير ضار

while(true)
   for(Iterator iter = foo.iterator(); iter.hasNext();)
       bar.doSomething( iter.next() )

أو المستوى الأعلى

while(true)
    for(Baz b: foo)
        bar.doSomething(b)

مشكلة محتملة هنا هي أنه في كل مرة حول في حين

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

أحد الحلول الممكنة (التي لا تزال في اللغة ذات المستوى الأعلى) هي إضعاف راحة المتكرر إلى شيء مثل

Iterator iter = new Iterator();
while(true)
    for(foo.initAlreadyAllocatedIterator(iter); iter.hasNext();)
       bar.doSomething(iter.next())

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top