سؤال

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

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

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

المحلول

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

أنا قائمة عدد قليل من الأشياء التي يمكن التفكير هنا ، ولكن ليس هناك بديل عن الذهاب والتعلم باستخدام كل x86 و RISC مجموعة التعليمات.

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

لا.الرياضيات التشغيل (على x86 ذلك) لديه fsqrt التعليمات.تحويل إلى تعويم, أخذ الجذر التربيعي, و تحويل الباحث مرة أخرى أسرع من كل خوارزمية الأعداد الصحيحة.

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

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

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

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

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

ثم هناك ubercoolness الذاتي تعديل التعليمات البرمجية ، مسألة ذات صلة ، آليات أشياء مثل نقل وتطبيق تصحيحات إلى رمز (هذا يحتاج التحقيق آلة القانون).

ولكن كل هذه الأمور تحتاج إلى نوع من العقل.إذا كنت من نوع الشخص الذي يمكن أن تضع

while(x--)
{
  ...
}

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

نصائح أخرى

سجل توزيع وإدارة

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

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

x86 غبي

تعلم عدة الجمعية اللغات جعلني أدرك كيف عرجاء x86 مجموعة التعليمات هو.طول متغير التعليمات ؟ يصعب التنبؤ التوقيت ؟ غير متعامد معالجة وسائط ؟ آآخ.

العالم سيكون أفضل إذا كنا جميعا ركض MIPS, أعتقد, أو حتى الذراع أو باور :-) أو بدلا من ذلك ، إذا Intel/AMD أخذت أشباه الموصلات الخبرة و استخدامها لجعل متعددة النواة بسرعة فائقة فائقة رخيصة معالجات MIPS بدلا من معالجات x86 مع كل تلك الصفات التعويض.

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

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

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

بعض الأمثلة من المشروع العمل على (جميع الأرقام على مدار الساعة التهم دورة على كور 2):

معكوس 8x8 H. 264 DCT (تردد تحويل):

c: 1332
mmx: 187
sse2: 127

8x8 صفاء تعويض الحركة (الصورة الاستيفاء فلتر):

c: 639
mmx: 144
sse2: 110
ssse3: 79

4 16 × 16 مجموع المطلق فرق العمليات (حركة البحث):

c: 3948
mmx: 278
sse2: 231
ssse3: 215

(نعم, هذا صحيح-أكثر من 18 x أسرع من ج!)

الخطأ التربيعي من 16 × 16 بلوك:

c: 1013
mmx: 193
sse2: 131

الفرق من 16 × 16 بلوك:

c: 783
mmx: 171
sse2: 106

الذاكرة, سجلات, يقفز, الحلقات, التحولات ومختلف عمليات واحدة يمكن أن تؤدي في المجمع.لا تفوت يوما من التصحيح بلدي لغة التجميع فئة البرامج - كانت مؤلمة!- ولكن من المؤكد أعطاني أساس جيد.

نحن ننسى (أو لم يعلم, ربما) أن كل هذا يتوهم السراويل الأشياء التي نستخدمها اليوم (وأن أحب!) يتلخص كل هذه الأشياء في النهاية.

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

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

عدا استخدام asm في كل يوم حالات, أنا لا أعتقد أنني سوف تستخدم أي من المفاهيم الجمعية علمني.

أود أن أقول أن معالجة أوضاع في غاية الأهمية.

بلدي ألما ماتر أخذت متطرفة ، لأن x86 لم يكن لديك ما يكفي منها ، درسنا كل شيء على محاكاة PDP11 التي كان يجب أن يكون ما لا يقل عن 7 منهم أن أتذكر.في وقت لاحق, أنه كان خيارا جيدا.

توقيت

تنفيذ سريع:

  • المعالجة المتوازية
  • تعليمات بسيطة
  • جداول البحث
  • فرع التنبؤ ، pipelining

بسرعة بطيئة الوصول إلى التخزين:

  • يسجل
  • ذاكرة التخزين المؤقت مستويات مختلفة من ذاكرة التخزين المؤقت
  • ذاكرة كومة كومة و
  • الذاكرة الظاهرية
  • الخارجية I/O

في الوقت الحاضر, x86 asm ليس خط مباشر إلى الشجاعة من وحدة المعالجة المركزية ، ولكن أكثر من API.المجمع opcodes تكتب هي نفسها ترجمة مختلفة تماما التعليمات ، وترتيبها ، إعادة كتابة ثابتة و عموما المهترئ ما بعد الاعتراف.

حتى انها ليست مثل التعلم المجمع يعطيك فكرة أساسية في ما يجري داخل وحدة المعالجة المركزية.IMHO ، أكثر أهمية من تعليم المجمع هو الحصول على فهم جيد لكيفية الهدف وحدة المعالجة المركزية و الذاكرة الهرمي يعمل.

هذا سلسلة من المقالات التي تغطي الموضوع الأخير جيدا جدا.

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