الإعلانات
سواء كنت تدرك ذلك أم لا ، فإن الغالبية العظمى من البرامج التي استخدمتها تستخدم المؤشرات بطريقة أو بأخرى. ربما كنت قد اختبرت NullPointerException في مرحلة ما. بصفتك مبرمجًا ، ستستخدم الشفرة التي تكتبها المؤشرات على الأرجح ، حتى لو لم تقم بتنفيذها بنفسك.
اليوم سأوضح لك كيفية عمل المؤشرات ، لذا قد ترغب في التحقق كيف تعمل المصفوفات والقوائم كيف تعمل المصفوفات والقوائم في Pythonتعد المصفوفات والقوائم من أكثر هياكل البيانات المفيدة في البرمجة - على الرغم من أن القليل من الأشخاص يستخدمونها بكامل إمكاناتها. اقرأ أكثر لبرمجة البرمجة. ستستند هذه المقالة على نظرية أكثر من المعتاد ، ولكن التمسك بها ، المؤشرات معقدة للغاية!
كود الترجمة
قبل البحث في المؤشرات ، تحتاج إلى فهم كيفية بناء التعليمات البرمجية وتنفيذها - ربما تعرف ذلك بالفعل. يحتوي هذا القسم على بيانات عامة إلى حد ما - الأشياء التي تنطبق على أغلبية من اللغات ، ولكن ليس بالضرورة جميعها.
دعنا نعيد الأمور إلى البداية. كل كمبيوتر يستخدم ثنائي ما هو ثنائي؟ [شرح التكنولوجيا]بالنظر إلى أن الثنائي أساسي للغاية لوجود أجهزة الكمبيوتر ، يبدو من الغريب أننا لم نتطرق إلى الموضوع من قبل - لذلك اعتقدت اليوم أنني سأقدم نظرة عامة موجزة عن ما هو ثنائي ... اقرأ أكثر ، سلسلة من الأصفار والأصفار التي تشكل التكنولوجيا الحديثة كما نعرفها. من الصعب للغاية ترميز أي شيء في ثنائي (الملفات ستكون مربكة للغاية) ، فهذه هي التعليمات الأولية التي يحتاجها وحدة معالجة مركزية أو وحدة المعالجة المركزية لتعمل ما هي وحدة المعالجة المركزية وماذا تفعل؟اختصارات الحوسبة مربكة. ما هي وحدة المعالجة المركزية على أي حال؟ وهل أحتاج إلى معالج رباعي أو ثنائي النواة؟ ماذا عن AMD أو Intel؟ نحن هنا للمساعدة في شرح الاختلاف! اقرأ أكثر . هذا ما يعرف ب كود الآلة.
الخطوة التالية من رمز الجهاز هي المجسم. هذا هو شكل قابل للقراءة البشرية إلى حد ما. في حين أنه لا يزال معقدًا للبرمجة ، إلا أنه ممكن. يتكون التجميع من سلسلة من الأوامر البسيطة لتنفيذ المهام ، ويعرف باسم مستوى منخفض لغة برمجة. من الممكن كتابة برامج معقدة ، ولكن من الصعب التعبير عن المفاهيم المجردة ، ويتطلب الكثير من الاعتبار.
تحتوي العديد من ألعاب الفيديو والتطبيقات عالية الأداء على بعض المنطق المكتوب في التجميع ، حيث يمكن العثور على بعض زيادات السرعة الحقيقية إذا كنت تعرف ما تفعله. ومع ذلك ، بالنسبة للغالبية العظمى من مشاريع البرمجة ، لا تحتاج إلى معرفة أي تجميع على الإطلاق.
لذا ، إذا كان من الصعب جدًا كتابة رمز الجهاز ، وكان من الصعب جدًا برمجة التجميع ، ما الذي تكتب به الرمز؟ هنا أين مستوى عال تأتي اللغات. تسهل اللغات عالية المستوى كتابة البرامج. يمكنك البرمجة في شيء يشبه لغتك الأم ، ومن السهل التعبير عن الخوارزميات المعقدة. ربما سمعت بالعديد من اللغات عالية المستوى (وستستخدم بالتأكيد برنامجًا مكتوبًا بها):
- الأساسي
- C ++
- ليسب
هذه اللغات قديمة جدًا الآن ، وقد تم تطوير العديد منها في أوائل الخمسينات! تقريبا كل لغة برمجة حديثة هي لغة عالية المستوى ، بما في ذلك PHP و Python. هناك المزيد من اللغات التي يتم اختراعها كل يوم (على الرغم من وجود ما يكفي الآن على الأرجح) ، ولكن كيف لا يزال يعمل الرمز الخاص بك بشكل صحيح إذا كانت أجهزة الكمبيوتر تتطلب رمز الجهاز؟
هنا يأتي دور التجميع. المترجم هو برنامج يحول كودك عالي المستوى إلى نموذج يمكن تنفيذه. قد تكون هذه لغة أخرى عالية المستوى ، ولكنها عادة ما تكون تجميع. بعض اللغات (مثل Python أو Java) تحول شفرتك إلى مرحلة متوسطة تسمى بايت. سيحتاج هذا إلى التجميع مرة أخرى في وقت لاحق ، والذي يتم عادةً عند الطلب ، مثل وقت تشغيل البرنامج. هذا ما يعرف ب في الوقت المناسب التجميع ، وهي شائعة جدًا.
إدارة الذاكرة
الآن بعد أن تعرفت على كيفية عمل لغات البرمجة ، فلنلقِ نظرة على إدارة الذاكرة باللغات عالية المستوى. بالنسبة لهذه الأمثلة ، سأستخدمها كود مزيف - كود مكتوب ليس بأي لغة معينة ، ولكنه يستخدم لإظهار المفاهيم بدلاً من بناء الجملة الدقيق. اليوم ، سيشبه هذا في الغالب لغة C ++ لأنها أفضل لغة عالية المستوى (في رأيي).
بالنسبة لهذا القسم ، سيساعدك ذلك إذا كان لديك فهم كيف تعمل ذاكرة الوصول العشوائي دليل سريع وقذر لذاكرة الوصول العشوائي: ما تحتاج إلى معرفتهتعد ذاكرة الوصول العشوائي مكونًا حاسمًا لكل جهاز كمبيوتر ، ولكنها قد تكون مربكة. نقوم بتفصيلها بمصطلحات سهلة الفهم ستفهمها. اقرأ أكثر .
تحتوي معظم اللغات على متغيرات - حاويات تخزن بعض البيانات. يجب عليك تحديد نوع البيانات بشكل صريح. بعض اللغات المكتوبة ديناميكيًا مثل Python أو PHP تتعامل مع ذلك نيابةً عنك ، ولكن لا يزال يتعين عليها القيام بذلك.
لنفترض أن لديك متغيرًا:
int myNumber ؛
يعلن هذا الرمز عن متغير يسمى رقمي، ويعطيها نوع بيانات عدد صحيح. بمجرد الترجمة ، يفسر الكمبيوتر هذا الأمر على أنه:
"اعثر على بعض الذاكرة الفارغة ، واحتفظ بمساحة كبيرة بما يكفي لتخزين عدد صحيح"
بمجرد تنفيذ هذا الأمر ، لا يمكن لبرنامج آخر استخدام هذا الجزء من الذاكرة. لا يحتوي على أي بيانات حتى الآن ، ولكنه محجوز لمتغير myNumber الخاص بك.
الآن قم بتعيين قيمة للمتغير الخاص بك:
myNumber = 10 ؛
لإكمال هذه المهمة ، يصل جهاز الكمبيوتر الخاص بك إلى موقع الذاكرة المحجوزة له ، ويغير أي قيمة مخزنة هناك ، إلى هذه القيمة الجديدة.
الآن ، كل هذا جيد وجيد ، ولكن كيف تصبح مواقع الذاكرة غير محجوزة؟ إذا احتفظت البرامج بكل الذاكرة التي تحبها ، فستمتلئ ذاكرة الوصول العشوائي على الفور - وهذا سيجعل للغاية نظام بطيء.
لتجنب هذه المشكلة المحتملة ، تنفذ العديد من اللغات أ جامع القمامةتستخدم لتدمير المتغيرات (وبالتالي تحرير مواقع الذاكرة المحجوزة) التي اختفت خارج النطاق.
قد تتساءل ما هو النطاق ولماذا هو مهم للغاية. يحدد النطاق حدود وعمر المتغيرات أو أي ذاكرة يستخدمها البرنامج. المتغير يكون "خارج النطاق" عندما لا يمكن الوصول إليه بعد الآن من خلال أي رمز (أي عندما يدخل جامع القمامة). إليك مثال:
رياضيات الدوال () {int firstNumber = 1؛ } int secondNumber = 2 ؛ طباعة (firstNumber + secondNumber) ؛ // لن يعمل
لن يتم ترجمة هذا المثال. المتغير رقم أول ضمن رياضيات الوظيفة ، هذا هو نطاقها. لا يمكن الوصول إليها من خارج الوظيفة التي تم الإعلان عنها. هذا مفهوم برمجة مهم، وفهم أنه أمر بالغ الأهمية للعمل مع المؤشرات.
هذه الطريقة في معالجة الذاكرة تسمى كومة. إنها الطريقة التي تعمل بها الغالبية العظمى من البرامج. لا يتعين عليك فهم المؤشرات لاستخدامها ، وهي منظمة إلى حد ما. عيب المكدس هو السرعة. نظرًا لأنه يجب على الكمبيوتر تعيين ذاكرة ، وتتبع المتغيرات ، وتشغيل مجموعة القمامة ، فهناك حمل صغير صغير. هذا جيد للبرامج الأصغر ، ولكن ماذا عن المهام عالية الأداء أو التطبيقات الثقيلة للبيانات؟
أدخل: المؤشرات.
المؤشرات
على السطح ، تبدو المؤشرات بسيطة. يشيرون (يشير إلى) موقع في الذاكرة. قد لا يبدو هذا مختلفًا عن المتغيرات "العادية" في المكدس ، ولكن ثق بي ، هناك فرق كبير. يتم تخزين المؤشرات على كومة. هذا هو عكس المكدس - إنه أقل تنظيماً ، ولكنه أسرع بكثير.
دعنا نلقي نظرة على كيفية تعيين المتغيرات على المكدس:
عدد صحيح واحد = 1 ؛ int numberTwo = numberOne ،
هذه بنية بسيطة ؛ المتغير الرقم اثنان يحتوي على الرقم واحد. يتم نسخ القيمة عبر المهمة خلال المهمة رقم واحد متغير.
إذا كنت ترغب في الحصول على عنوان الذاكرة متغير ، بدلاً من قيمته ، يجب عليك استخدام علامة العطف (&). هذا يسمى عنوان ال عامل التشغيل ، وهو جزء أساسي من مجموعة أدوات المؤشر الخاصة بك.
عدد صحيح واحد = 1 ؛ int numberTwo = & numberOne ؛
الآن الرقم اثنان متغير نقاط إلى موقع ذاكرة ، بدلاً من نسخ الرقم الأول إلى موقع ذاكرة جديد خاص به. إذا كنت ستخرج هذا المتغير ، فلن يكون هو الرقم واحد (على الرغم من أنه يتم تخزينه في موقع الذاكرة). ستقوم بإخراج موقع الذاكرة (ربما شيء مثل 2167 ، على الرغم من أنه يختلف اعتمادًا على النظام وذاكرة الوصول العشوائي المتاحة). للوصول إلى القيمة المخزنة في مؤشر ، بدلاً من موقع الذاكرة ، يجب عليك الاختلاف المؤشر. هذا يصل إلى القيمة مباشرة ، والتي ستكون رقم واحد في هذه الحالة. إليك كيفية الإشارة إلى المؤشر:
int numberTwo = * numberOne ؛
ال عامل الإحالة هي علامة نجمية (*).
قد يكون هذا مفهومًا صعبًا لفهمه ، لذا فلنراجعه مرة أخرى:
- ال عنوان ال عامل التشغيل (&) يخزن عنوان الذاكرة.
- ال عامل الإحالة (*) يصل إلى القيمة.
يتغير بناء الجملة قليلاً عند الإعلان عن المؤشرات:
int * myPointer ؛
نوع البيانات من عدد يشير هنا إلى نوع البيانات المؤشر نقاط إلى ، وليس نوع المؤشر نفسه.
الآن بعد أن عرفت ما هي المؤشرات ، يمكنك القيام ببعض الحيل الأنيقة معهم! عند استخدام الذاكرة ، يبدأ نظام التشغيل الخاص بك بالتتابع. يمكنك التفكير في ذاكرة الوصول العشوائي كثقوب حمامة. العديد من الثقوب لتخزين شيء ما ، يمكن استخدام واحد فقط في وقت واحد. الاختلاف هنا هو أن جميع ثقوب الحمام مرقمة. عند تعيين الذاكرة ، يبدأ نظام التشغيل الخاص بك بأقل عدد ، ويعمل. لن تقفز أبداً بين أرقام عشوائية.
عند العمل باستخدام المؤشرات ، إذا قمت بتعيين مصفوفة ، فيمكنك الانتقال بسهولة إلى العنصر التالي عن طريق زيادة المؤشر ببساطة.
هنا حيث تصبح مثيرة للاهتمام. عندما تقوم بتمرير القيم إلى دالة (باستخدام المتغيرات المخزنة على المكدس) ، يتم نسخ هذه القيم في وظيفتك. إذا كانت هذه متغيرات كبيرة ، يقوم البرنامج الآن بتخزينها مرتين. عند الانتهاء من وظيفتك ، قد تحتاج إلى طريقة لإرجاع هذه القيم. يمكن للوظائف عمومًا إرجاع شيء واحد فقط - فماذا إذا كنت تريد إرجاع شيئين أو ثلاثة أو أربعة أشياء؟
إذا قمت بتمرير مؤشر إلى وظيفتك ، فسيتم فقط نسخ عنوان الذاكرة (وهو صغير). هذا يوفر وحدة المعالجة المركزية الخاصة بك الكثير من العمل! ربما يشير المؤشر إلى مصفوفة صور ضخمة - لا يمكن أن تعمل وظيفتك بنفس الطريقة فقط البيانات المخزنة في نفس موقع الذاكرة بالضبط ، ولكن بمجرد الانتهاء من ذلك ، ليست هناك حاجة للعودة اى شى. أنيق!
عليك أن تكون حذرا للغاية بالرغم من ذلك. لا يزال بإمكان المؤشرات الخروج عن النطاق وجمعها من قبل جامع القمامة. القيم المخزنة في الذاكرة ، ومع ذلك ، لا يتم جمعها. هذا يسمى تسرب الذاكرة. لم يعد بإمكانك الوصول إلى البيانات (حيث تم إتلاف المؤشرات) ، لكنها لا تزال تستهلك الذاكرة. يعد هذا سببًا شائعًا لتعطل العديد من البرامج ، ويمكن أن يفشل بشكل مذهل إذا كان هناك قدر كبير من البيانات. في معظم الأحيان ، سيقتل نظام التشغيل برنامجك إذا كان لديك تسرب كبير (باستخدام ذاكرة وصول عشوائي أكبر من النظام) ، ولكن هذا غير مرغوب فيه.
يمكن أن تكون مؤشرات التصحيح كابوسًا ، خاصة إذا كنت تعمل بكميات كبيرة من البيانات ، أو تعمل في حلقات. إن مساوئهم وصعوبة فهمهم تستحق حقًا المقايضات التي تكسبها في الأداء. بالرغم من التذكر ، قد لا تكون مطلوبة دائمًا.
يكفي هذا لليوم. آمل أن تكون قد تعلمت شيئًا مفيدًا حول موضوع معقد. بالطبع ، لم نقم بتغطية كل ما يمكن معرفته - إنه موضوع معقد للغاية. إذا كنت مهتمًا بمعرفة المزيد ، أوصي بشدة C ++ في 24 ساعة.
إذا كان هذا معقدًا بعض الشيء ، فألق نظرة عليه دليلنا إلى أسهل لغات البرمجة 6 لغات برمجة أسهل للتعلم للمبتدئينتعلم البرمجة هو العثور على اللغة الصحيحة تمامًا كما هو الحال في عملية التعديل. فيما يلي أفضل ست لغات برمجة للمبتدئين. اقرأ أكثر .
هل تعلمت كيف تعمل المؤشرات اليوم؟ هل لديك أي نصائح وحيل تريد مشاركتها مع المبرمجين الآخرين؟ انتقل إلى التعليقات وشارك أفكارك أدناه!
جو خريج في علوم الكمبيوتر من جامعة لينكولن بالمملكة المتحدة. إنه مطور برامج محترف ، وعندما لا يطير بطائرات بدون طيار أو يكتب موسيقى ، يمكن العثور عليه غالبًا وهو يلتقط الصور أو ينتج مقاطع فيديو.